项目53:简易贪吃蛇【源代码】 — 《跟着小王学Python·新手》
《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念。通过开发游戏、构建Web应用、编写网络爬虫、制作桌面软件等多样化项目,学习者可以深入理解并实践Python知识。每周更新1至2篇内容,旨在助力学习者成长为全栈工程师。
作为课程作业或者毕设参考也是不错的选择
文章目录
- 项目53:简易贪吃蛇【源代码】 --- 《跟着小王学Python·新手》
- 目标
- 功能
- 设计
- 游戏界面
- 蛇的控制
- 食物的生成
- 游戏逻辑
- 实现步骤
- 代码实现
- 测试
- 注意事项
- 小结

目标
通过实现一个简易的贪吃蛇游戏,帮助Python新手熟悉基本的编程概念,如循环、条件判断、列表操作等,并掌握使用Pygame库进行图形界面编程的方法。

功能
- 贪吃蛇能够自由移动,吃到食物后长度增加
- 碰到墙壁或自身时游戏结束
- 游戏过程中可以实时显示当前得分
- 提供重新开始游戏的功能
设计
游戏界面
- 使用Pygame库创建一个矩形窗口作为游戏界面
- 界面背景色设置为黑色,蛇和食物的颜色分别为绿色和红色
- 在窗口顶部显示得分信息,字体颜色为白色
蛇的控制
- 蛇由一系列坐标点组成,初始时为一个长度为3的蛇
- 使用方向键控制蛇的移动方向,每次移动时蛇头移动到新的位置,蛇尾的最后一个点被移除
- 当蛇吃到食物时,蛇尾增加一个点,长度增加
食物的生成
- 食物的初始位置随机生成在游戏界面内
- 当蛇吃到食物后,重新随机生成一个新的食物位置
游戏逻辑
- 判断蛇是否碰到墙壁或自身,若是则游戏结束
- 计算蛇的长度作为得分,并实时更新显示
- 提供重新开始游戏的功能,重置蛇的初始状态和得分
实现步骤
- 安装Pygame库
- 创建游戏窗口和设置背景
- 定义蛇和食物的类,并初始化
- 实现蛇的移动控制和碰撞检测
- 实现食物的生成和蛇吃食物的逻辑
- 显示得分信息
- 添加重新开始游戏的功能
- 运行游戏并进行测试
代码实现
import pygame
import random
# 初始化Pygame
pygame.init()
# 设置窗口大小
window_width = 400
window_height = 400
window = pygame.display.set_mode((window_width, window_height))
# 设置颜色
black = (0, 0, 0)
green = (0, 255, 0)
red = (255, 0, 0)
white = (255, 255, 255)
# 设置字体
font = pygame.font.SysFont(None, 36)
# 蛇类
class Snake:
def __init__(self):
self.body = [(100, 100), (80, 100), (60, 100)]
self.direction = 'RIGHT'
def move(self):
head_x, head_y = self.body[0]
if self.direction == 'RIGHT':
head_x += 20
elif self.direction == 'LEFT':
head_x -= 20
elif self.direction == 'UP':
head_y -= 20
elif self.direction == 'DOWN':
head_y += 20
self.body.insert(0, (head_x, head_y))
self.body.pop()
def grow(self):
tail_x, tail_y = self.body[-1]
if self.direction == 'RIGHT':
tail_x -= 20
elif self.direction == 'LEFT':
tail_x += 20
elif self.direction == 'UP':
tail_y += 20
elif self.direction == 'DOWN':
tail_y -= 20
self.body.append((tail_x, tail_y))
def change_direction(self, new_direction):
if (self.direction == 'RIGHT' and new_direction != 'LEFT') or \
(self.direction == 'LEFT' and new_direction != 'RIGHT') or \
(self.direction == 'UP' and new_direction != 'DOWN') or \
(self.direction == 'DOWN' and new_direction != 'UP'):
self.direction = new_direction
def check_collision(self):
head_x, head_y = self.body[0]
if head_x < 0 or head_x >= window_width or head_y < 0 or head_y >= window_height:
return True
for segment in self.body[1:]:
if segment == self.body[0]:
return True
return False
# 食物类
class Food:
def __init__(self):
self.position = (random.randint(0, window_width // 20 - 1) * 20, random.randint(0, window_height // 20 - 1) * 20)
def generate(self):
self.position = (random.randint(0, window_width // 20 - 1) * 20, random.randint(0, window_height // 20 - 1) * 20)
# 初始化蛇和食物
snake = Snake()
food = Food()
# 游戏主循环
running = True
score = 0
clock = pygame.time.Clock()
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
snake.change_direction('UP')
elif event.key == pygame.K_DOWN:
snake.change_direction('DOWN')
elif event.key == pygame.K_LEFT:
snake.change_direction('LEFT')
elif event.key == pygame.K_RIGHT:
snake.change_direction('RIGHT')
elif event.key == pygame.K_r:
snake = Snake()
food = Food()
score = 0
snake.move()
if snake.body[0] == food.position:
snake.grow()
food.generate()
score += 1
if snake.check_collision():
running = False
window.fill(black)
for segment in snake.body:
pygame.draw.rect(window, green, pygame.Rect(segment[0], segment[1], 20, 20))
pygame.draw.rect(window, red, pygame.Rect(food.position[0], food.position[1], 20, 20))
score_text = font.render('Score: ' + str(score), True, white)
window.blit(score_text, (10, 10))
pygame.display.update()
clock.tick(10)
pygame.quit()测试
- 运行代码,检查游戏窗口是否正常显示
- 使用方向键控制蛇移动,观察蛇的移动是否流畅
- 当蛇吃到食物时,检查蛇的长度是否增加,得分是否更新
- 当蛇碰到墙壁或自身时,检查游戏是否结束
- 按下“R”键,检查游戏是否能够重新开始
注意事项
- 确保安装了Pygame库,否则代码无法正常运行
- 在游戏主循环中,合理设置时钟的tick值,以控制蛇的移动速度
- 在蛇的移动控制中,注意防止蛇反向移动到自身上
- 在重新开始游戏时,确保重置蛇的初始状态和得分
小结
通过实现这个简易的贪吃蛇游戏,我们学习了如何使用Pygame库进行图形界面编程,掌握了蛇的移动控制、食物的生成以及碰撞检测等基本逻辑。希望这篇文章能帮助Python新手更好地理解和掌握编程知识,为后续的学习打下坚实的基础。
















