贪吃蛇
用python3实现小时候非常喜欢的: Gluttonous Snake 😛 来玩~
前期准备
- pip3 下载 pygame 模块
➜ ~ pip3 install pygame
Collecting pygame
Downloading pygame-2.0.1-cp37-cp37m-macosx_10_9_intel.whl (6.9 MB)
|████████████████████████████████| 6.9 MB 368 kB/s
Installing collected packages: pygame
Successfully installed pygame-2.0.1
- 测试 pygame 是否下载成功
➜ ~ python3
Python 3.7.8 (default, Jul 8 2020, 14:18:28)
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
pygame 2.0.1 (SDL 2.0.14, Python 3.7.8)
Hello from the pygame community. https://www.pygame.org/contribute.html
思路梳理
a. 定义变量
- 背景(大小、颜色、名称)
- 贪吃蛇身(坐标、颜色)
- 蛇头坐标
- 食物块(坐标、颜色)
- 贪吃蛇初始前进方向
- 移动速度
- 改变方向
b. 如何改变运行方向 ?
答: 接收键盘输入方向信息后, 相应控制蛇头的坐标做出改变
c. 如何记录移动过程中的蛇身坐标的变化 ?
答: 栈, 先入后出, 蛇头每次移动到新位置, 将新位置入栈作为新蛇头, 将旧尾巴弹栈保证蛇身长度不变.
代码完全体(直接粘贴运行即可)
import pygame, sys, random
from pygame.locals import *
# 定义颜色变量:0-255,0黑色 255白色
redColor = pygame.Color(255, 0, 0)
blackColor = pygame.Color(0, 0, 0)
whiteColor = pygame.Color(255, 255, 255)
# 定义游戏结束
def gameover():
pygame.quit()
sys.exit()
# 入口函数:定义游戏开始
def main():
# 0.初始化pygame模块,创建显示界面playSurface
pygame.init()
playSurface = pygame.display.set_mode((640, 480))
pygame.display.set_caption('贪吃蛇')
# 1.初始化贪吃蛇身体,列表中三个元素表示三个身体块的坐标
snakeBody = [[100, 100], [80, 100], [60, 100]]
# 2.指定蛇头坐标
snakePosition = [100, 100]
# 3.初始化食物块坐标与状态(0被吃掉、1未被吃掉)
targetPosition = [300, 300]
targetFlag = 1
# 4.初始化贪吃蛇前进方向
direction = 'right'
# 5.贪吃蛇移动速度
fpsClock = pygame.time.Clock()
# 6.改变方向
changeDirection = direction
while True:
# 识别键盘输入的方向信息
for event in pygame.event.get():
if event.type == QUIT:
gameover()
elif event.type == KEYDOWN:
# 用'wasd'和'方向键'两种方式来表示上下左右️,esc退出游戏
if event.key == K_d or event.key == K_RIGHT:
changeDirection = 'right'
if event.key == K_a or event.key == K_LEFT:
changeDirection = 'left'
if event.key == K_w or event.key == K_UP:
changeDirection = 'up'
if event.key == K_s or event.key == K_DOWN:
changeDirection = 'down'
if event.key == K_ESCAPE:
gameover()
# 确定贪吃蛇前进方向(不能直接反方向行驶)
if changeDirection == 'left' and not direction == 'right':
direction = changeDirection
if changeDirection == 'right' and not direction == 'left':
direction = changeDirection
if changeDirection == 'up' and not direction == 'down':
direction = changeDirection
if changeDirection == 'down' and not direction == 'up':
direction = changeDirection
# 根据方向移动时,蛇头的坐标发生改变
if direction == 'right':
snakePosition[0] += 20
if direction == 'left':
snakePosition[0] -= 20
if direction == 'up':
snakePosition[1] -= 20
if direction == 'down':
snakePosition[1] += 20
# *** 移动过程中的蛇身坐标的变化 ***
# 核心:栈的先入后出,蛇头移动到新坐标,将新坐标入栈而后弹栈去除最后一项,从而保证蛇身长度不变
snakeBody.insert(0, list(snakePosition))
# 如果蛇头和目标方块的位置重合,代表吃掉食物块,此时蛇身增长一块,列表中新增一项
if snakePosition[0] == targetPosition[0] and snakePosition[1] == targetPosition[1]:
targetFlag = 0
# 弹栈:正常移动未吃掉食物块时,去除列表最后一项(保证蛇身长度不变)
else:
snakeBody.pop()
# 食物块被吃掉后随机生成
if targetFlag == 0:
x = random.randrange(1, 32)
y = random.randrange(1, 24)
targetPosition = [int(x * 20), int(y * 20)]
targetFlag = 1
# 对playSurface界面进行颜色填充
playSurface.fill(blackColor)
for position in snakeBody:
# playSurface界面中,使用redColor颜色,对蛇身每一块position位置长20宽20的方块,进行填充(0代表填充)
pygame.draw.rect(playSurface, redColor, Rect(position[0], position[1], 20, 20),0)
# 食物块颜色填充
pygame.draw.rect(playSurface, whiteColor, Rect(targetPosition[0], targetPosition[1], 20, 20),0)
# 更新显示到屏幕表面
pygame.display.flip()
# 判断是否游戏结束(仅考虑撞墙结束,可自行添加撞身体结束判断)
if snakePosition[0] > 620 or snakePosition[0] < 0:
gameover()
elif snakePosition[1] > 460 or snakePosition[1] < 0:
gameover()
# 控制贪吃蛇移动速度:每秒调用5次tick函数,达到设置页面刷新率的效果
fpsClock.tick(5)
# 启动入口函数
if __name__ == '__main__':
main()