基于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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
python 中文字符串的处理实现代码
Oct 25 Python
python写日志封装类实例
Jun 28 Python
使用Python生成随机密码的示例分享
Feb 18 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python仿evething的文件搜索器实例代码
May 13 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
Python中的list与tuple集合区别解析
Oct 12 Python
python 实现有道翻译功能
Feb 26 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 #Python
Python实现视频中添加音频工具详解
Dec 06 #Python
Python实现GIF动图以及视频卡通化详解
Python实现照片卡通化
用Python爬取英雄联盟的皮肤详细示例
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 #Python
python 管理系统实现mysql交互的示例代码
You might like
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
php post换行的方法
2020/02/03 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python中的super()方法使用简介
2015/08/14 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
详解Python中类的定义与使用
2017/04/11 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
详解Python3注释知识点
2019/02/19 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Tensorflow 多线程设置方式
2020/02/06 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
部门年终奖分配方案
2014/05/07 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书