Python实战:使用Pygame从零构建经典贪吃蛇游戏

顾言
顾言
发布时间:2026-10-12 | 4人浏览过
原创

本文详解如何利用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将贪吃蛇开发得更为精彩!😎😎😎

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表