Python小游戏开发:从零实现贪吃蛇游戏
Python小游戏开发:从零实现贪吃蛇游戏
文章目录
- Python小游戏开发:从零实现贪吃蛇游戏
- 前言
- 游戏简介
- 使用的工具与依赖
- 安装 Pygame
- 项目功能设计
- 代码实现
- 1. 初始化与基础设置
- 2. 显示得分
- 3. 蛇与食物的绘制
- 4. 游戏结束界面
- 5. 主要游戏循环
- 运行游戏
- 运行结果
- 总结
前言
最近,我花了一些时间用 Python 和 Pygame 实现了一个经典的小游戏——贪吃蛇。这个游戏不仅充满了童年的回忆,同时也非常适合作为学习编程的练手项目。本篇博客将分享完整的代码实现,并从项目结构、功能点以及优化技巧等多个方面进行详细解析。如果你是 Python 的初学者,或对游戏开发感兴趣,相信这篇文章会对你有所帮助!
游戏简介
贪吃蛇是一款经典的益智休闲游戏,玩家通过键盘控制蛇的方向,吃掉食物让蛇变得更长,游戏的难度随着蛇的长度增加而逐步提高。一旦蛇撞墙或撞到自己的身体,游戏结束。
我们实现的版本中,还增加了“游戏结束后按钮操作”功能——玩家可以选择重新开始或退出游戏。
使用的工具与依赖
- Python 版本:建议使用 Python 3.6 以上版本
- Pygame:一个基于 Python 的简单游戏开发框架,提供了图形、声音和事件处理的支持。
安装 Pygame
在开始之前,确保你已经安装了 pygame
,如果未安装,可以使用以下命令:
pip install pygame
项目功能设计
在开始写代码前,我们需要明确贪吃蛇游戏的核心功能点:
- 游戏窗口:定义游戏画布的大小、颜色等。
- 蛇的移动:通过键盘方向键控制蛇的运动。
- 食物生成:随机生成食物的位置,供蛇“吃”。
- 得分统计:每次蛇吃掉食物,得分加一,同时蛇身变长。
- 游戏结束逻辑:当蛇撞墙或撞到自身时,显示“游戏结束”界面,并提供按钮选择。
- 中文支持:优化字体显示,确保文字支持中文。
代码实现
下面是完整的代码实现。每个模块都有详细的注释,方便大家理解。
1. 初始化与基础设置
import pygame
import random
# 初始化 Pygame
pygame.init()
# 定义屏幕大小和颜色
screen_width = 800
screen_height = 600
block_size = 20
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
gray = (200, 200, 200)
# 创建屏幕对象
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("贪吃蛇游戏")
# 定义时钟
clock = pygame.time.Clock()
# 加载支持中文的字体文件
chinese_font = pygame.font.Font("C:/Windows/Fonts/simhei.ttf", 25)
score_font = pygame.font.Font("C:/Windows/Fonts/simhei.ttf", 35)
2. 显示得分
显示得分是游戏的基础功能,每次吃到食物后会更新得分:
def display_score(score):
value = score_font.render("得分: " + str(score), True, green)
screen.blit(value, [0, 0])
3. 蛇与食物的绘制
蛇的身体通过一系列的矩形块构成,随着食物被吃掉,蛇的长度逐渐增加:
def draw_snake(block_size, snake_list):
for block in snake_list:
pygame.draw.rect(screen, blue, [block[0], block[1], block_size, block_size])
4. 游戏结束界面
当蛇撞墙或撞到自身时,显示“游戏结束”提示,并添加按钮让玩家选择继续游戏或退出游戏:
def button(msg, x, y, w, h, inactive_color, active_color, action=None):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
if x < mouse[0] < x + w and y < mouse[1] < y + h:
pygame.draw.rect(screen, active_color, [x, y, w, h])
if click[0] == 1 and action is not None:
action()
else:
pygame.draw.rect(screen, inactive_color, [x, y, w, h])
text = chinese_font.render(msg, True, black)
screen.blit(text, [x + (w - text.get_width()) / 2, y + (h - text.get_height()) / 2])
5. 主要游戏循环
游戏的核心逻辑包括:
- 控制蛇的移动方向。
- 检测蛇是否撞墙或撞到自身。
- 生成随机食物位置。
- 更新得分和蛇的长度。
def game_loop():
game_over = False
game_close = False
# 初始位置和运动方向
x = screen_width / 2
y = screen_height / 2
x_change = 0
y_change = 0
# 蛇的身体
snake_list = []
length_of_snake = 1
# 食物位置
food_x = round(random.randrange(0, screen_width - block_size) / 20.0) * 20.0
food_y = round(random.randrange(0, screen_height - block_size) / 20.0) * 20.0
while not game_over:
while game_close:
screen.fill(black)
display_message("游戏结束!", red)
# 添加按钮
button("继续游戏", 250, 400, 150, 50, gray, green, restart_game)
button("退出游戏", 450, 400, 150, 50, gray, red, quit_game)
pygame.display.update()
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 and x_change == 0:
x_change = -block_size
y_change = 0
elif event.key == pygame.K_RIGHT and x_change == 0:
x_change = block_size
y_change = 0
elif event.key == pygame.K_UP and y_change == 0:
y_change = -block_size
x_change = 0
elif event.key == pygame.K_DOWN and y_change == 0:
y_change = block_size
x_change = 0
if x >= screen_width or x < 0 or y >= screen_height or y < 0:
game_close = True
x += x_change
y += y_change
screen.fill(black)
# 画食物
pygame.draw.rect(screen, red, [food_x, food_y, block_size, block_size])
# 更新蛇的位置
snake_head = []
snake_head.append(x)
snake_head.append(y)
snake_list.append(snake_head)
if len(snake_list) > length_of_snake:
del snake_list[0]
# 检查是否撞到自己
for block in snake_list[:-1]:
if block == snake_head:
game_close = True
draw_snake(block_size, snake_list)
display_score(length_of_snake - 1)
pygame.display.update()
# 吃食物
if x == food_x and y == food_y:
food_x = round(random.randrange(0, screen_width - block_size) / 20.0) * 20.0
food_y = round(random.randrange(0, screen_height - block_size) / 20.0) * 20.0
length_of_snake += 1
clock.tick(15)
pygame.quit()
quit()
运行游戏
将代码保存为 snake_game.py
,运行程序即可开始游戏:
python snake_game.py
运行结果
总结
通过这次项目,我们了解了如何使用 Pygame 构建一个简单的 2D 游戏,包括事件监听、图形绘制、碰撞检测等。未来可以考虑进一步优化:
- 增加背景音乐。
- 提升食物种类和得分机制。
- 蛇的速度随长度增加逐渐变快。
希望这篇博客对你有所帮助,欢迎在评论区留言你的问题和建议!🎮