基于Pygame实现简单的贪吃蛇游戏


Posted in Python onDecember 06, 2021

导入相关的包

import pygame, sys, random
from pygame.locals import *

设置屏幕大小以及基本参数

设置屏幕大小为400*400,mainClock = pygame.time.Clock()用来设置时间同步,不会根据计算机的运行来决定运行多少次, mainClock.tick(1) 一秒只会运行一次,设置了屏幕的底色为白色。

# 定义屏幕的宽高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 设置窗口标题
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('贪吃蛇')

pygame.init()
mainClock = pygame.time.Clock()

# 定义使用的颜色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    surface.fill(WHITE)
    pygame.display.update()
    mainClock.tick(1)

基于Pygame实现简单的贪吃蛇游戏

设置贪吃蛇的位置,以及移动的大小

这里设置了贪吃蛇的长度和起始位置,和食物和蛇的宽度,这里必须设置为可以被食物和蛇的宽度整除的数,这样才能保证蛇能到任意的位置

# 设置蛇的初始长度
snakeWidth = 4
# 设置蛇的起始位置为(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的宽度设置为8
FOODSNAKEWIDTH = 8
# 定义四个方向
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
# 定义初始的方向
moveRight = True


def getSnake():
    # 设置蛇的初始长度为4,并设置蛇的初始位置为(40,40)
    # 因为贪吃蛇会拐弯,所以将蛇设置为一个列表
    snake = []
    for i in range(snakeWidth):
        snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
    return snake


# 贪吃蛇
snake = getSnake()

绘制蛇

surface.fill(WHITE)
for s in snake:
    pygame.draw.rect(surface, BLACK, s)

让蛇动起来

这里将蛇列表最后一位移除,然后将第一位的位置根据方向加减坐标

snake.pop()
    newTop = copy.deepcopy(snake[0])
    # 改变蛇的位置
    if moveRight:
        newTop.left += FOODSNAKEWIDTH
    if moveLeft:
        newTop.left -= FOODSNAKEWIDTH
    if moveUp:
        newTop.top -= FOODSNAKEWIDTH
    if moveDown:
        newTop.top += FOODSNAKEWIDTH

    snake.insert(0, newTop)

基于Pygame实现简单的贪吃蛇游戏

这样会有一个问题,如果超出屏幕呢,我们将超出屏幕,那么就会消失,我们只需要你移动第一个元素的时候,如果超出则将元素移动另一个位置。

# 改变蛇的位置
    if moveRight:
        if newTop.right == WIDTH:
            newTop.left = 0
        else:
            newTop.left += FOODSNAKEWIDTH
    if moveLeft:
        if newTop.left == 0:
            newTop.right == WIDTH
        else:
            newTop.left -= FOODSNAKEWIDTH
    if moveUp:
        if newTop.top == 0:
            newTop.bottom = HEIGHT
        else:
            newTop.top -= FOODSNAKEWIDTH
    if moveDown:
        if newTop.bottom == HEIGHT:
            newTop.top = 0
        else:
            newTop.top += FOODSNAKEWIDTH

实现贪吃蛇拐弯

为了实现对应的功能,我们将方向变量改为一个变量,这样我们方便修改方向

# 定义四个方向
# moveLeft moveRight moveUp moveDown
# 定义初始的方向
snakeDirection = "moveRight"
  ----
  省略的代码
  ----
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                if snakeDirection == "moveRight":
                    snake.reverse()
                snakeDirection = "moveLeft"
            if event.key == K_RIGHT:
                if snakeDirection == "moveLeft":
                    snake.reverse()
                snakeDirection = "moveRight"
            if event.key == K_UP:
                if snakeDirection == "moveDown":
                    snake.reverse()
                snakeDirection = "moveUp"
            if event.key == K_DOWN:
                if snakeDirection == "moveUp":
                    snake.reverse()
                snakeDirection = "moveDown"

为了方便看到效果,我将mainClock.tick(1) 设置为mainClock.tick(3)

基于Pygame实现简单的贪吃蛇游戏

实现随机食物

这里用了很啰嗦的代码,我自己也看不下去,有点含糊,这里为了简单只设计了一个食物,遍历屏幕上不是贪吃蛇的可以放食物的集合,然后随机生成一个食物。

if len(foods) < foodnum:

        canFoodColl = []
        # 获取当前不是贪吃蛇的位置集合
        for x in range(sizeNum):
            for y in range(sizeNum):
                foodExist = True
                for sn in snake:
                    if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
                        foodExist = False
                        break
                if foodExist:
                    canFoodColl.append({'x': x, 'y': y})
        f = canFoodColl[random.randint(0, len(canFoodColl))]
        foods.append(pygame.Rect(f['x'], f['y'], FOODSNAKEWIDTH, FOODSNAKEWIDTH))

基于Pygame实现简单的贪吃蛇游戏

吃食物

这里用 colliderect判断二者是否相撞,然后食物集合置空,不减去贪吃蛇集合的最后一个元素。

if len(foods) < foodnum:

        canFoodColl = []
        # 获取当前不是贪吃蛇的位置集合
        for x in range(sizeNum):
            for y in range(sizeNum):
                foodExist = True
                for sn in snake:
                    if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
                        foodExist = False
                        break
                if foodExist:
                    canFoodColl.append({'x': x, 'y': y})
        f = canFoodColl[random.randint(0, len(canFoodColl))]
        foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
        print(f['x'])
        print(f['y'])
    else:
        if newTop.colliderect(foods[0]):
            foods = []
            eatFlg = True
        print('xxx')

基于Pygame实现简单的贪吃蛇游戏

完整代码 

import pygame, sys, random
from pygame.locals import *
import copy

# 定义屏幕的宽高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 设置窗口标题
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('贪吃蛇')

pygame.init()
mainClock = pygame.time.Clock()

# 定义使用的颜色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)

# 设置蛇的初始长度
snakeWidth = 4
# 设置蛇的起始位置为(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的宽度设置为8
FOODSNAKEWIDTH = 8
# 定义四个方向
# moveLeft moveRight moveUp moveDown
# 定义初始的方向
snakeDirection = "moveRight"

# 食物区间
foods = []
# 用去宽度处以对应的 大小,减去1 就是食物矩形起点可以存在的区间
#sizeNum = HEIGHT / FOODSNAKEWIDTH - 1
# 这里为了减少计算
sizeNum = 39
# 为了简单我们只设置一个食物
foodnum = 1


def getSnake():
    # 设置蛇的初始长度为4,并设置蛇的初始位置为(40,40)
    # 因为贪吃蛇会拐弯,所以将蛇设置为一个列表
    snake = []
    for i in range(snakeWidth):
        snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
    return snake


# 贪吃蛇
snake = getSnake()

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                if snakeDirection == "moveRight":
                    snake.reverse()
                snakeDirection = "moveLeft"
            if event.key == K_RIGHT:
                if snakeDirection == "moveLeft":
                    snake.reverse()
                snakeDirection = "moveRight"
            if event.key == K_UP:
                if snakeDirection == "moveDown":
                    snake.reverse()
                snakeDirection = "moveUp"
            if event.key == K_DOWN:
                if snakeDirection == "moveUp":
                    snake.reverse()
                snakeDirection = "moveDown"
    surface.fill(WHITE)
    for s in snake:
        pygame.draw.rect(surface, BLACK, s)
    for f in foods:
        pygame.draw.rect(surface, GREEN, f)
    pygame.display.update()


    # 是否吃了食物
    eatFlg = False

    newTop = copy.deepcopy(snake[0])
    # 改变蛇的位置
    if snakeDirection == "moveRight":
        if newTop.right == WIDTH:
            newTop.left = 0
        else:
            newTop.left += FOODSNAKEWIDTH
    if snakeDirection == "moveLeft":
        if newTop.left == 0:
            newTop.right = WIDTH
        else:
            newTop.left -= FOODSNAKEWIDTH
    if snakeDirection == "moveUp":
        if newTop.top == 0:
            newTop.bottom = HEIGHT
        else:
            newTop.top -= FOODSNAKEWIDTH
    if snakeDirection == "moveDown":
        if newTop.bottom == HEIGHT:
            newTop.top = 0
        else:
            newTop.top += FOODSNAKEWIDTH

    if len(foods) < foodnum:

        canFoodColl = []
        # 获取当前不是贪吃蛇的位置集合
        for x in range(sizeNum):
            for y in range(sizeNum):
                foodExist = True
                for sn in snake:
                    if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
                        foodExist = False
                        break
                if foodExist:
                    canFoodColl.append({'x': x, 'y': y})
        f = canFoodColl[random.randint(0, len(canFoodColl))]
        foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
        print(f['x'])
        print(f['y'])
    else:
        if newTop.colliderect(foods[0]):
            foods = []
            eatFlg = True
        print('xxx')



    snake.insert(0, newTop)
    if not eatFlg:
        snake.pop()

    mainClock.tick(3) 

以上就是基于Pygame实现简单的贪吃蛇游戏的详细内容,更多关于Pygame 贪吃蛇游戏的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
跟老齐学Python之模块的加载
Oct 24 Python
Python中的测试模块unittest和doctest的使用教程
Apr 14 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
详解Python中的日志模块logging
Jun 19 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
python如何爬取个性签名
Jun 19 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
python 绘制正态曲线的示例
Sep 24 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 #Python
Python实现视频中添加音频工具详解
Dec 06 #Python
Python实现GIF动图以及视频卡通化详解
Python实现照片卡通化
用Python爬取英雄联盟的皮肤详细示例
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 #Python
python 管理系统实现mysql交互的示例代码
You might like
用PHP生成html分页列表的代码
2007/03/18 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
mouse_on_title.js
2006/08/25 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
150行Node.js实现的dns代理工具
2019/08/02 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
python学生管理系统学习笔记
2019/03/19 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
高考标语大全
2014/06/05 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
岁月神偷观后感
2015/06/11 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android