Python实战:使用Pygame从零构建经典贪吃蛇游戏
本文详解如何利用Python的Pygame库开发经典贪吃蛇游戏。从环境配置、需求分析到核心代码实现,涵盖窗口初始化、蛇身移动控制、食物生成碰撞检测及游戏结束判定等关键模块。通过分步解析代码逻辑,帮助开发者快速掌握2D游戏开发基础与事件处理机制。
0 引言
近期有读者提到贪吃蛇游戏,这立刻激发了我的创作热情。在诺基亚手机风靡的年代,这款游戏无疑是经典中的代表。而使用Python(Python发音近似Snake)来开发Snake(贪吃蛇)游戏,可谓天作之合。
首先通过下方的运行效果图直观感受游戏效果。

1 环境
操作系统:Windows
Python版本:3.7.3
2 需求分析
首先回顾贪吃蛇游戏的核心元素与基本规则。
游戏必须包含贪吃蛇与食物两个核心对象。玩家需要通过控制指令使蛇上下移动以获取食物。每当蛇吃到食物,其身体长度增加,同时原食物消失并随机生成新食物。若蛇头碰撞到游戏边界或自身身体,则判定游戏结束。
规则相对简单,我们将借助第三方库pygame来完成开发。
Pygame是基于SDL库的游戏开发库,由一组Python程序模块组成,用于构建游戏软件。
SDL(Simple DirectMedia Layer)是一个跨平台多媒体库,支持访问声音、视频及输入设备等硬件资源。虽然SDL功能强大,但其底层基于C语言实现。
PyGame作为SDL库的Python封装(wrapper),在SDL基础上提供了丰富的接口,使用户能够直接使用Python语言创建各类游戏或多媒体应用。
安装过程十分简便,具体命令如下:
pip install pygame
希望深入探索Pygame更多功能的朋友,建议查阅官方文档获取详细信息。
3 代码实现
首先导入所需模块。除了第三方库pygame外,还需引入Python内置的sys、random、time等模块,一并导入即可。
import pygame, sys, random, time # 从pygame模块导入常用的函数和常量 from pygame.locals import *
3.1 一些全局参数的初始化
接下来声明全局参数,包括初始化pygame、设定游戏窗口尺寸与标题、定义全局颜色变量等基础信息。
# 初始化Pygame库
pygame.init()
# 初始化一个游戏界面窗口
DISPLAY = pygame.display.set_mode((640, 480))
# 设置游戏窗口的标题
pygame.display.set_caption('人人都是Pythonista - Snake')
# 定义一个变量来控制游戏速度
FPSCLOCK = pygame.time.Clock()
# 初始化游戏界面内使用的字体
BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)
# 定义颜色变量
BLACK = pygame.Color(0, 0, 0)
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0)
GREY = pygame.Color(150, 150, 150)
3.2 初始化贪吃蛇及食物
游戏初始状态需设定蛇与食物的位置。我们将界面划分为多个20*20像素的标准小方格,蛇的长度由占据的标准格子数决定。蛇身数据采用列表存储,便于后续进行增删操作。 '''初始化贪吃蛇及食物'''
# 贪吃蛇的的初始位置 snake_Head = [100,100] # 初始化贪吃蛇的长度 (注:这里以20*20为一个标准小格子) snake_Body = [[80,100],[60,100],[40,100]] # 指定蛇初始前进的方向,向右 direction = "right" # 给定第一枚食物的位置 food_Position = [300,300] # 食物标记:0代表食物已被吃掉;1代表未被吃掉。 food_flag = 1
3.3 实现贪吃蛇的上下左右移动
通过监听键盘输入来控制蛇的移动方向。支持使用方向键或WASD键进行上下左右控制。
# 检测按键等Pygame事件
for event in pygame.event.get():
if event.type == QUIT:
# 接收到退出事件后,退出程序
pygame.quit()
sys.exit()
# 判断键盘事件,用 方向键 或 wsad 来表示上下左右
elif event.type == KEYDOWN:
if (event.key == K_UP or event.key == K_w) and direction != DOWN:
direction = UP
if (event.key == K_DOWN or event.key == K_s) and direction != UP:
direction = DOWN
if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
direction = LEFT
if (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
direction = RIGHT
根据键盘输入更新蛇的前进方向,并将蛇头的新位置加入蛇身列表头部。
# 根据键盘的输入,改变蛇的头部,进行转弯操作 if direction == LEFT: snake_Head[0] -= 20 if direction == RIGHT: snake_Head[0] += 20 if direction == UP: snake_Head[1] -= 20 if direction == DOWN: snake_Head[1] += 20 # 将蛇的头部当前的位置加入到蛇身的列表中 snake_Body.insert(0, list(snake_Head))
3.4 判断是否吃到食物
若蛇头坐标与食物坐标重合,判定为吃到食物,并将食物标记清零;若未吃到,蛇身跟随蛇头移动,移除蛇身列表的最后一节。
# 判断是否吃掉食物 if snake_Head[0]==food_Position[0] and snake_Head[1]==food_Position[1]: food_flag = 0 else: snake_Body.pop()
3.5 重新生成食物
当界面上食物被吃掉(数量为0)时,利用random函数随机生成新的食物位置。
# 生成新的食物 if food_flag == 0: # 随机生成x, y x = random.randrange(1,32) y = random.randrange(1,24) food_Position = [int(x*20),int(y*20)] food_flag = 1
3.6 绘制贪吃蛇、食物、分数等信息
定义用于绘制贪吃蛇的函数。
# 绘制贪吃蛇
def drawSnake(snake_Body):
for i in snake_Body:
pygame.draw.rect(DISPLAY, WHITE, Rect(i[0], i[1], 20, 20))
定义食物的绘制函数
# 绘制食物的位置
def drawFood(food_Position):
pygame.draw.rect(DISPLAY, RED, Rect(food_Position[0], food_Position[1], 20, 20))
定义分数的绘制函数
# 打印出当前得分
def drawScore(score):
# 设置分数的显示颜色
score_Surf = BASICFONT.render('%s' %(score), True, GREY)
# 设置分数的位置
score_Rect = score_Surf.get_rect()
score_Rect.midtop = (320, 240)
# 绑定以上设置到句柄
DISPLAY.blit(score_Surf, score_Rect)
完成上述定义后,在游戏主逻辑中调用这些函数并刷新Pygame显示层。蛇与食物的每次移动都会触发显示层刷新以呈现最新状态。最后设定速度值以控制游戏运行节奏。
DISPLAY.fill(BLACK) # 画出贪吃蛇 drawSnake(snake_Body) # 画出食物的位置 drawFood(food_Position) # 打印出玩家的分数 drawScore(len(snake_Body) - 3) # 刷新Pygame的显示层,贪吃蛇与食物的每一次移动,都会进行刷新显示层的操作来显示。 pygame.display.flip() # 控制游戏速度 FPSCLOCK.tick(7)
3.7 定义游戏结束的画面并判断游戏是否结束
定义展示游戏结束画面并退出程序的函数。
# 游戏结束并退出
def GameOver():
# 设置GameOver的显示颜色
GameOver_Surf = BASICFONT.render('Game Over!', True, GREY)
# 设置GameOver的位置
GameOver_Rect = GameOver_Surf.get_rect()
GameOver_Rect.midtop = (320, 10)
# 绑定以上设置到句柄
DISPLAY.blit(GameOver_Surf, GameOver_Rect)
pygame.display.flip()
# 等待3秒
time.sleep(3)
# 退出游戏
pygame.quit()
# 退出程序
sys.exit()
在游戏主逻辑中加入结束条件判断,检测游戏是否应当终止。
'''游戏结束的判断'''
# 贪吃蛇触碰到边界
if snake_Head[0]<0 or snake_Head[0]>620:
GameOver()
if snake_Head[1]<0 or snake_Head[1]>460:
GameOver()
# 贪吃蛇触碰到自己
for i in snake_Body[1:]:
if snake_Head[0]==i[0] and snake_Head[1]==i[1]:
GameOver()
4 后记
本文利用Pygame模块实现了基础的贪吃蛇版本。目前仍有优化空间,例如随机生成食物时如何避免重叠在蛇身上、根据蛇长自动调整游戏速度等。更高级的功能包括AI自动游玩、双人对战等,期待大家利用Python将贪吃蛇开发得更为精彩!😎😎😎
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









