文章目录
- 1、 项目概述
- 1.1 项目目标和主要内容
- 1.2 项目的主要功能
- 2、 项目设计
- 2.1项目总体框架
- 2.2 关键算法分析
- 3、设计步骤
- 3.1导入模块
- 3.2定义颜色变量
- 3.3定义游戏结束函数
- 3.4定义主函数
- 3.5执行主函数
- 3.6将.py文件转为.exe文件
- 4、运行结果
1、 项目概述
1.1 项目目标和主要内容
实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。
1.2 项目的主要功能
实现贪吃蛇游戏基本功能
2、 项目设计
2.1项目总体框架
创建游戏界面
定义游戏结束函数
定义主函数
进行游戏主循环(检测按键进行转弯操作)
判断是否吃掉目标方块,进行增加蛇的长度操作
控制游戏速度
2.2 关键算法分析
贪吃蛇关键算法在于判断贪吃蛇是否吃到了食物以及吃到食物后身体长度的变化。
无论蛇是否吃到了食物,身体都要发生变化,伪代码分析如下:
if 蛇头位置==食物位置
蛇吃到食物
if 蛇没有吃到食物:
移动方向的一个格子添加到蛇首部,尾部去掉
else 蛇吃到食物:
移动方向的一个格子添加到蛇首部
3、设计步骤
3.1导入模块
import pygame
import sys
import random
import time
from pygame.locals import *
说明:用python编写游戏可以导入python专门用于游戏开发的pygame模块,该模块需要自行安装。
random模块用于随机生成食物
time模块用于设计时间
3.2定义颜色变量
定义一些接下来编写蛇身,食物等需要的颜色变量。
black_colour = pygame.Color(28, 56, 20)
white_colour = pygame.Color(255, 255, 255)
red_colour = pygame.Color(255, 34, 20)
grey_colour = pygame.Color(150, 150, 150)
3.3定义游戏结束函数
游戏结束则退出游戏界面
def gameover(gamesurface):
# 设置提示字体的格式
gameover_font = pygame.font.SysFont("MicrosoftYaHei", 16)
# 设置提示字体的颜色
gameover_colour = gameover_font.render('GameOver', True, grey_colour) # 只能英文
# 设置提示位置
gameover_location = gameover_colour.get_rect()
gameover_location.midtop = (310, 200)
# 绑定以上设置到句柄
gamesurface.blit(gameover_colour, gameover_location)
# 提示运行信息
pygame.display.flip()
# 休眠5秒
time.sleep(5)
# 退出游戏
pygame.quit()
# 退出程序
sys.exit()
3.4定义主函数
# 定义主函数
def main():
# 初始化pygame,为使用硬件做准备
pygame.init()
pygame.time.Clock()
ftpsClock = pygame.time.Clock()
# 创建一个窗口
# 设置窗口尺寸
gamesurface = pygame.display.set_mode((640, 480))
# 设置窗口的标题
# pygame官方文档中的解释:If the display has a window title, this function will change the name on the window.
pygame.display.set_caption('贪吃蛇')
# 初始化变量
# 初始化贪吃蛇的起始位置,贪吃蛇的身体用列表存储
snakeposition = [100, 100] #定义蛇头部位置
# 初始化贪吃蛇的长度,20*20为一个标准小格子
snakelength = [[100, 100], [80, 100], [60, 100]]
# 初始化目标食物方块的位置
square_purpose = [300, 300]
# 初始化一个数来判断目标食物方块是否存在,0代表已经被吃掉,1代表还在
square_position = 1
# 初始化方向,用来使贪吃蛇移动,通过监听键盘输入来实现,利用键盘中的上下左右键或WASD键来控制贪吃蛇的运动。
direction = "right"
change_direction = direction
# 进行游戏主循环
while True:
# 检测按键等pygame事件
for event in pygame.event.get():
if event.type == QUIT:
# 接收到退出事件后,退出程序
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
# 判断键盘事件,用w,s,a,d来表示上下左右
if event.key == K_RIGHT or event.key == ord('d'):
change_direction = "right"
if event.key == K_LEFT or event.key == ord('a'):
change_direction = "left"
if event.key == K_UP or event.key == ord('w'):
change_direction = "up"
if event.key == K_DOWN or event.key == ord('s'):
change_direction = "down"
if event.key == K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))
#将蛇前进方向按照键盘的输入进行转弯操作,并将蛇的头部当前的位置加入到蛇身的列表中。
# 判断移动的方向与想要改变的方向是否相反,因为实现的时候如果操作改变的方向与实际运动方向相反,则不好操作
if change_direction == 'left' and direction != 'right':
direction = change_direction
if change_direction == 'right' and direction != 'left':
direction = change_direction
if change_direction == 'up' and direction != 'down':
direction = change_direction
if change_direction == 'down' and direction != 'up':
direction = change_direction
# 根据方向,改变蛇头部坐标
if direction == 'left':
snakeposition[0] -= 20 #将蛇的头部向左移一个格子
if direction == 'right':
snakeposition[0] += 20 #格子的坐标从左到右增加
if direction == 'up':
snakeposition[1] -= 20 #格子的坐标从上到下增加
if direction == 'down':
snakeposition[1] += 20
# 增加蛇的长度
#snakelength是一个列表,里面的元素是一个个列表,表示蛇身体的一个格子
snakelength.insert( 0,list(snakeposition)) #在索引号为0的蛇身体前面插入,即在头部前插入新的头部
# 判断是否吃掉目标方块
if snakeposition[0] == square_purpose[0] and snakeposition[1] == square_purpose[1]:
square_position = 0 #如果蛇头部坐标和方块坐标一致,则蛇吃掉目标方块,不进行其它操作,蛇尾部保留,算作吃到方块后新增的部位
else:
snakelength.pop() #蛇没有吃到方块,则将尾部去掉
# 方块被吃掉后随机重新生成目标方块
if square_position == 0:
# 随机生成x,y,扩大二十倍,在窗口范围内
x = random.randrange(1, 32)
y = random.randrange(1, 24)
square_purpose = [int(x * 20), int(y * 20)] #符合窗口大小
square_position = 1
# 绘制pygame显示层
gamesurface.fill(black_colour)
for position in snakelength:
pygame.draw.rect(gamesurface, white_colour, Rect(position[0], position[1], 20, 20)) #用一个白色方形小格子作为蛇的身体
pygame.draw.rect(gamesurface, red_colour, Rect(square_purpose[0], square_purpose[1], 20, 20))#红色小方格作为食物
# 刷新pygame显示层
pygame.display.flip() #不更新显示层则无法显示身体变化
# 判断是否死亡
if snakeposition[0] < 0 or snakeposition[0] > 620:
gameover(gamesurface)
if snakeposition[1] < 0 or snakeposition[1] > 460:
gameover(gamesurface) #撞到墙壁则死亡
for snakebody in snakelength[1:]:
if snakeposition[0] == snakebody[0] and snakeposition[1] == snakebody[1]:
gameover(gamesurface) #蛇头撞到蛇身也死亡
# 控制游戏速度
ftpsClock.tick(4)
3.5执行主函数
if __name__ == "__main__":
main()
3.6将.py文件转为.exe文件
步骤一:安装pyinstaller
推荐使用国内豆瓣镜像源安装,否则很可能会失败。
在cmd命令行中输入
pip install pyinstaller -i https://pypi.douban.com/simple
步骤二:
在pycharm中打开:View-Tool Windows-Terminal
打开到所要生成exe文件的该文件目录下,输入Terminal中输入:“pyinstaller -F -w ’文件名‘.py” 就可以制作出exe。
-w的用处是不出现黑色控制台窗口。
4、运行结果