使用Pygame编写贪吃蛇游戏完整教程
本文详细介绍如何使用Pygame库在Python中从零开始制作一个贪吃蛇小游戏。内容涵盖游戏窗口创建、蛇身移动控制、碰撞检测、食物生成、得分显示及游戏结束处理等核心功能,提供完整代码示例与关键函数解析,帮助开发者快速掌握2D小游戏开发技巧。

用到的 Pygame 函数
贪吃蛇小游戏用到的函数
| 功能 | 描述 |
|---|---|
| init() | 初始化 pygame |
| display.set_mode() | 以元组或列表为参数创建窗口 |
| update() | 更新屏幕 |
| quit() | 用于取消初始化的 pygame |
| set_caption() | 在屏幕的顶部设置文字 |
| event.get() | 返回所有事件的列表 |
| Surface.fill() | 使用纯色填充屏幕 |
| time.Clock() | 追踪时间 |
| font.Font() | 设置字体 |
创建屏幕
我们调用 display.set_mode() 函数来初始化并创建 pygame 显示窗口。此外,必须在程序启动时调用 init() 进行初始化,并在程序结束时调用 quit() 进行清理,以确保游戏环境能正确加载和释放资源。
import pygame
pygame.init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.quit()
quit()
运行上述基础代码后,预期的界面效果如下所示:

然而,直接运行上述代码会导致窗口瞬间关闭。为保持窗口持续显示,我们需要引入游戏主循环逻辑。
import pygame
pygame.init()
dis=pygame.display.set_mode((400,300))
pygame.display.update()
pygame.display.set_caption('Snake game by Edureka')
game_over=False
while not game_over:
for event in pygame.event.get():
print(event) # 打印出所有事件
pygame.quit()
quit()
我们在代码中设置了游戏窗口的标题,并通过 Python 控制台实时打印出在 pygame 窗口中发生的所有交互事件,便于调试。

接下来,我们需要添加处理窗口关闭事件的逻辑代码。
pygame.init()
dis = pygame.display.set_mode((400, 300))
pygame.display.update()
pygame.display.set_caption('贪吃蛇')
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
pygame.quit()
quit()
完成上述配置后,游戏窗口即可正常显示并保持运行状态,随后我们可以开始绘制 snake 游戏元素。
创建 snake
首先定义一组颜色变量,分别用于表示 snake(蛇身)、food(食物)以及 screen (背景屏幕)的颜色属性。
pygame.init()
dis = pygame.display.set_mode((400, 300))
pygame.display.update()
pygame.display.set_caption('贪吃蛇')
blue=(0,0,255)
red=(255,0,0)
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
pygame.draw.rect(dis, blue, [200, 150, 10, 10])
pygame.display.update()
pygame.quit()
quit()

通过上述设置,贪吃蛇的主体部分(表现为屏幕上的小蓝点)便创建完成。
使 snake 动起来
为了实现 snake (蛇)的移动控制,我们需要监听 KEYDOWN 事件。该事件包含四个关键按键值:K_UP(向上)、K_DOWN(向下)、K_LEFT(向左)和 K_RIGHT(向右),分别对应不同的移动方向。
pygame.init()
pygame.display.set_caption('贪吃蛇')
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
dis = pygame.display.set_mode((800, 600))
game_over = False
x1 = 300
y1 = 300
x1_change = 0
y1_change = 0
clock = pygame.time.Clock()
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -10
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 10
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -10
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 10
x1_change = 0
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, black, [x1, y1, 10, 10])
pygame.display.update()
clock.tick(30)
pygame.quit()
quit()
在此步骤中,我们定义了 x1_change 和 y1_change 两个变量,用于动态更新蛇在 X 轴和 Y 轴上的坐标,从而实现蛇身的移动效果。
处理 Game Over
在贪吃蛇游戏中,如果 snake (蛇头)移动出预设的游戏屏幕边界,则判定游戏失败。接下来我们将实现这部分边界检测逻辑。
import pygame
import time
pygame.init()
pygame.display.set_caption('贪吃蛇')
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
dis_width = 600
dis_height = 400
dis = pygame.display.set_mode((dis_width, dis_width))
game_over = False
x1 = dis_width / 2
y1 = dis_height / 2
snake_block = 10
x1_change = 0
y1_change = 0
clock = pygame.time.Clock()
snake_speed = 30
font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 2, dis_height / 2])
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_over = True
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
pygame.display.update()
clock.tick(snake_speed)
message("你失败了,请重新开始游戏!", red)
pygame.display.update()
time.sleep(2)
pygame.quit()
quit()

增加食物
作为贪吃蛇游戏的核心玩法,必须包含食物投放机制。下面我们将实现食物的生成与处理逻辑。
import pygame
import time
import random
pygame.init()
pygame.display.set_caption('贪吃蛇')
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 30
font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 3, dis_height / 3])
def gameLoop(): # creating a function
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
while not game_over:
while game_close == True:
dis.fill(white)
message("你失败了,请重新开始游戏!", red)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])
pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
pygame.display.update()
if x1 == foodx and y1 == foody:
print("Good!")
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
我们定义了一个名为 gameLoop 的主游戏循环函数,在其中初始化了蛇的食物位置,并增加了键盘监听逻辑:按下 'c' 键重新开始游戏,按下 'q' 键退出游戏。

snake 的成长
根据游戏基本规则,当 snake (蛇)吃到食物后,其长度应当增加。下面我们将实现这一增长逻辑。
import pygame
import time
import random
pygame.init()
pygame.display.set_caption('贪吃蛇')
font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
score_font = pygame.font.Font("C:/Windows/Fonts/STCAIYUN.TTF", 30)
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
dis_width = 600
dis_height = 400
dis = pygame.display.set_mode((dis_width, dis_height))
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
def our_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 6, dis_height / 3])
def gameLoop():
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close == True:
dis.fill(blue)
message("你失败了,请重新开始游戏!", red)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(blue)
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
our_snake(snake_block, snake_List)
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()

展示得分
最后,我们需要在界面上显示玩家的得分。对于任何游戏而言,得分系统是评估玩家表现的重要指标。
import pygame
import time
import random
pygame.init()
pygame.display.set_caption('贪吃蛇')
font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
score_font = pygame.font.Font("C:/Windows/Fonts/STCAIYUN.TTF", 30)
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
dis_width = 600
dis_height = 400
dis = pygame.display.set_mode((dis_width, dis_height))
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
def Your_score(score):
value = score_font.render("Your Score: " + str(score), True, yellow)
dis.blit(value, [0, 0])
def our_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 6, dis_height / 3])
def gameLoop():
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close == True:
dis.fill(blue)
message("你失败了,请重新开始游戏!", red)
Your_score(Length_of_snake - 1)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(blue)
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
our_snake(snake_block, snake_List)
Your_score(Length_of_snake - 1)
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
这里定义了一个名为 Your_score 的函数,专门用于记录和渲染玩家的当前得分。

至此,一个简易版的贪吃蛇小游戏已经开发完成。
最后,我们可以为游戏添加背景音乐,以提升游戏的沉浸感和体验舒适度。
# 播放音乐
pygame.init()
pygame.mixer.music.load(r"Game.mp3")
pygame.mixer.music.play()
到此这篇关于100行Pygame代码 制作一个贪吃蛇小游戏的文章就介绍到这了,更多相关Pygame制作一个贪吃蛇小游戏内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













