目录
一、背景介绍
贪吃蛇(Snake Game)是电子游戏史上的经典之作,玩家通过操控蛇的移动方向,使其不断“吃”食物来增长身体,同时避免碰撞边界或自身。
为什么用Python实现?
- 简洁高效:Python语法简单,适合快速开发小游戏。
- Pygame库支持:提供图形渲染、事件处理等核心功能,无需复杂底层代码。
- 学习价值:涵盖游戏循环、碰撞检测、用户输入处理等核心开发概念。
二、环境准备
所需库与工具
- Python 3.6+
- Pygame库:用于游戏窗口、图形和事件管理。
pip install pygame
三、核心实现步骤
1. 游戏界面与参数设置
定义窗口尺寸、颜色、网格大小等常量:
import pygame
import random
import time
# 游戏窗口参数
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
GRID_SIZE = 20 # 网格单位大小
FPS = 10 # 游戏刷新率
# 颜色定义
COLORS = {
"background": (0, 0, 0),
"snake": (0, 255, 0),
"food": (255, 0, 0),
"text": (255, 255, 255)
}
# 方向控制(基于键盘事件)
DIRECTIONS = {
pygame.K_UP: (0, -1),
pygame.K_DOWN: (0, 1),
pygame.K_LEFT: (-1, 0),
pygame.K_RIGHT: (1, 0)
}
2. 蛇与食物的类设计
蛇类:管理身体坐标、移动逻辑和生长机制。
class Snake:
def __init__(self):
self.body = [(5, 5)] # 初始位置
self.direction = (1, 0) # 初始向右移动
self.grow = False # 是否增长
def move(self):
head = self.body
new_head = (
(head + self.direction) % (WINDOW_WIDTH // GRID_SIZE),
(head + self.direction) % (WINDOW_HEIGHT // GRID_SIZE)
)
self.body.insert(0, new_head)
if not self.grow:
self.body.pop()
else:
self.grow = False
def change_direction(self, new_dir):
# 禁止180度转向(如向右时不能直接向左)
if (new_dir + self.direction, new_dir + self.direction) != (0, 0):
self.direction = new_dir
def check_collision(self):
# 检测是否撞到自身
return self.body in self.body[1:]
食物类:随机生成位置并避免与蛇身重叠。
class Food:
def __init__(self, snake_body):
self.position = self.generate_position(snake_body)
def generate_position(self, snake_body):
while True:
x = random.randint(0, (WINDOW_WIDTH // GRID_SIZE) - 1)
y = random.randint(0, (WINDOW_HEIGHT // GRID_SIZE) - 1)
if (x, y) not in snake_body:
return (x, y)
3. 游戏逻辑与事件处理
主游戏循环:集成蛇的移动、食物生成与碰撞检测。
class Game:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("Python贪吃蛇")
self.clock = pygame.time.Clock()
self.snake = Snake()
self.food = Food(self.snake.body)
self.score = 0
self.game_over = False
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.KEYDOWN:
if event.key in DIRECTIONS:
self.snake.change_direction(DIRECTIONS[event.key])
def update(self):
self.snake.move()
# 检测是否吃到食物
if self.snake.body == self.food.position:
self.snake.grow = True
self.score += 1
self.food = Food(self.snake.body)
# 检测碰撞自身或边界(可选:边界碰撞)
if self.snake.check_collision():
self.game_over = True
def draw(self):
self.screen.fill(COLORS["background"])
# 绘制蛇身
for segment in self.snake.body:
x = segment * GRID_SIZE
y = segment * GRID_SIZE
pygame.draw.rect(self.screen, COLORS["snake"], (x, y, GRID_SIZE, GRID_SIZE))
# 绘制食物
fx = self.food.position * GRID_SIZE
fy = self.food.position * GRID_SIZE
pygame.draw.rect(self.screen, COLORS["food"], (fx, fy, GRID_SIZE, GRID_SIZE))
# 显示得分
font = pygame.font.SysFont("Arial", 24)
text = font.render(f"Score: {self.score}", True, COLORS["text"])
self.screen.blit(text, (10, 10))
pygame.display.flip()
def run(self):
while not self.game_over:
self.handle_events()
self.update()
self.draw()
self.clock.tick(FPS)
# 游戏结束提示
font = pygame.font.SysFont("Arial", 48)
text = font.render("Game Over! Press Q to quit", True, COLORS["text"])
self.screen.blit(text, (WINDOW_WIDTH//2 - 200, WINDOW_HEIGHT//2 - 30))
pygame.display.flip()
# 等待退出
while True:
event = pygame.event.wait()
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_q):
pygame.quit()
exit()
if __name__ == "__main__":
game = Game()
game.run()
四、案例演示
游戏运行效果
-
基础玩法:
- 方向键控制蛇的移动(上、下、左、右)。
- 吃到红色食物后身体增长,得分+1。
- 碰撞自身或边界(可选设定)时游戏结束。
-
扩展功能(可自行添加):
- 难度递增:随得分增加蛇的移动速度。
- 音效支持:添加吃食物和碰撞音效。
- 高分榜:记录历史最高得分。
五、注意事项与原创声明
- 代码原创性:所有逻辑均为独立编写,未参考第三方代码。
- 素材合规:未使用受版权保护的图片或音效,仅通过颜色块渲染图形。
六、总结
-
技术亮点:
- 模块化设计:蛇、食物、游戏逻辑分离,代码结构清晰。
- 碰撞检测:通过坐标比对实现高效的自身碰撞判断。
- 方向控制:禁止180度转向,符合经典玩法逻辑。
-
学习价值:
- 掌握Pygame基础用法(事件循环、图形绘制)。
- 理解游戏开发中的状态管理与实时更新机制。
-
扩展方向:
- 添加“墙壁”模式(边界碰撞触发结束)。
- 支持多人对战或AI自动控制。
Python相关文章(推荐)
1. Python全方位指南:
Python(1)Python全方位指南:定义、应用与零基础入门实战
2. Python基础数据类型详解:Python(2)Python基础数据类型详解:从底层原理到实战应用
3. Python循环:Python(3)掌握Python循环:从基础到实战的完整指南
4. Python列表推导式:Python(3.1)Python列表推导式深度解析:从基础到工程级的最佳实践
5. Python生成器:Python(3.2)Python生成器深度全景解读:从yield底层原理到万亿级数据处理工程实践
6. Python函数编程性能优化:Python(4)Python函数编程性能优化全指南:从基础语法到并发调优
7. Python数据清洗:Python(5)Python数据清洗指南:无效数据处理与实战案例解析(附完整代码)
8. Python邮件自动化:Python(6)Python邮件自动化终极指南:从零搭建企业级邮件系统(附完整源码)
9. Python通配符基础:Python(7)Python通配符完全指南:从基础到高阶模式匹配实战(附场景化代码)
10. Python通配符高阶:Python(7 升级)Python通配符高阶实战:从模式匹配到百万级文件处理优化(附完整解决方案)