目录
一、背景介绍
二、环境准备
三、核心实现步骤
四、游戏运行
五、注意事项与原创声明
六、总结
一、背景介绍
贪吃蛇(Snake Game)是电子游戏史上的经典之作,玩家通过操控蛇的移动方向,使其不断“吃”食物来增长身体,同时避免碰撞边界或自身。
为什么使用Python来开发?
1. 简洁高效:Python语法简单,适合快速开发小游戏。
2. Pygame库支持:提供图形渲染、事件处理等核心功能,无需复杂底层代码。
二、环境准备
1. Python 3.6+
2. Pygame库:用于游戏窗口、图形和事件管理。
pip install pygame
三、核心实现步骤
- 模块化设计:
🐍 snake.py:处理蛇的运动逻辑、绘制、改变方向和检测自身碰撞
🍎 food.py:食物的位置的生成和绘画食物
🎮 game_controller.py:处理用户键盘的输入,检测墙壁和食物的碰撞以及重置游戏状态等逻辑功能
⚙️ settings.py:集中管理游戏的参数和颜色配置
📋 enums.py:枚举管理方向键值
🚀 main.py:主程序
snake_game/
├── snake.py # 蛇类
├── food.py # 食物类
├── game_controller.py # 游戏逻辑控制类
├── settings.py # 游戏界面与参数设置
├── enums.py # 枚举方向值
└── main.py # 主程序
- 游戏界面与参数设置settings.py
'''
1、游戏公共常量配置
'''
window_width = 800
window_height = 600
cell_size = 20
fps = 5
colors = {
"background":(255,255,255), #白色
"snake_body":(0,255,0),#绿色
"snake_head":(0,0,0),#黑色
"food":(255,0,0),#红色
"text":(0,0,0)#黑色
}
- 枚举管理方向键值类enums.py
"""
1、枚举类型
"""
from enum import Enum
class Direction(Enum):
UP = (0,-1)
DOWN = (0,1)
LEFT = (-1,0)
RIGHT = (1,0)
- 蛇类:管理移动逻辑、绘制、改变方向和检测自身碰撞机制snake.py
'''
蛇类:
1、移动蛇
2、安全改变方向
3、检测自身碰撞
4、绘制蛇
'''
import pygame
from typing import List,Tuple
from enums import Direction
from settings import cell_size,colors
class Snake:
def __init__(self):
self.body: List[Tuple[int, int]] = [(10, 10)] #初始蛇身位置
self.direction = Direction.RIGHT #初始向右运动
self.grow = False
#移动蛇身
def move(self):
dx, dy = self.direction.value
head_x, head_y = self.body[0]
new_head = (head_x + dx, head_y + dy)
self.body.insert(0, new_head)
# 若非增长状态,移除身体列表的最后一个元素;否则蛇的身体长度增加,self.grow重置为False(增长效果只持续一帧/一次移动)
if not self.grow:
self.body.pop()
else:
self.grow = False
# 安全改变方向
def change_direction(self, new_dir: Direction):
current_dx, current_dy = self.direction.value
new_dx, new_dy = new_dir.value
if (current_dx + new_dx, current_dy + new_dy) != (0, 0):
self.direction = new_dir
# 检测自身碰撞
def check_self_collision(self) -> bool:
return self.body in self.body[1:]
# 绘制蛇
def draw(self, surface: pygame.Surface):
# 绘制头部
head_x, head_y = self.body[0]
pygame.draw.rect(
surface, colors["snake_head"],
(head_x * cell_size, head_y * cell_size, cell_size, cell_size)
)
# 绘制蛇身
for segment in self.body[1:]:
x, y = segment
pygame.draw.rect(
surface, colors["snake_body"],
(x * cell_size, y * cell_size, cell_size, cell_size)
)
- 食物类:随机生成食物位置避免与蛇身重叠和绘画食物food.py
'''
食物类:
1、食物的位置的生成
2、绘画食物
'''
import random
import pygame
from typing import List, Tuple
from settings import window_width,window_height,cell_size,colors
class Food:
def __init__(self, exclude: List[Tuple[int, int]] = None):
self.position: Tuple[int, int] = (0, 0)
self.generate(exclude or [])
# 生成新食物位置
def generate(self, exclude: List[Tuple[int, int]]):
max_x = (window_width // cell_size) - 1
max_y = (window_height // cell_size) - 1
while True:
x = random.randint(0, max_x)
y = random.randint(0, max_y)
if (x, y) not in exclude:
self.position = (x, y)
break
# 绘制食物
def draw(self, surface: pygame.Surface):
x, y = self.position
pygame.draw.rect(
surface, colors["food"],
(x * cell_size, y * cell_size, cell_size, cell_size)
)
- 游戏逻辑控制类:处理用户键盘的输入,检测墙壁和食物的碰撞以及重置游戏状态等逻辑功能game_controller.py
'''
Game类:
1、重置游戏状态
2、检测墙壁碰撞
3、检测食物碰撞
4、处理用户输入键盘方向键
5、绘制游戏结束界面
6、通用文字绘制方法
7、游戏开始
'''
import pygame
from snake import Snake
from food import Food
from settings import *
from enums import Direction
class GameController:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("贪吃蛇游戏")
self.clock = pygame.time.Clock()
self.reset_game()
# 重置游戏状态
def reset_game(self):
self.snake = Snake()
self.food = Food(exclude=self.snake.body)
self.score = 0
self.game_over = False
# 检测墙壁碰撞
def check_wall_collision(self) -> bool:
head_x, head_y = self.snake.body[0]
return (
head_x < 0 or head_x >= window_width // cell_size or
head_y < 0 or head_y >= window_height // cell_size
)
# 检测食物碰撞
def check_food_collision(self):
if self.snake.body[0] == self.food.position:
self.snake.grow = True
self.score += 10
self.food.generate(self.snake.body)
# 处理用户输入方向上下左右方向键
def handle_input(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
elif event.type == pygame.KEYDOWN:
if self.game_over:
self.reset_game()
return
if event.key == pygame.K_UP:
self.snake.change_direction(Direction.UP)
elif event.key == pygame.K_DOWN:
self.snake.change_direction(Direction.DOWN)
elif event.key == pygame.K_LEFT:
self.snake.change_direction(Direction.LEFT)
elif event.key == pygame.K_RIGHT:
self.snake.change_direction(Direction.RIGHT)
# 绘制游戏结束界面
def draw_game_over(self):
self.screen.fill(colors["background"])
self._draw_text(
f"游戏结束!得分: {self.score}", 40,
window_width // 2, window_height // 2
)
self._draw_text(
"按任意键重新开始", 30,
window_width // 2, window_height // 2 + 50
)
#通用文字绘制方法
def _draw_text(self, text: str, size: int, x: int, y: int):
font = pygame.font.SysFont("simhei", size)
text_surface = font.render(text, True, colors["text"])
text_rect = text_surface.get_rect(center=(x, y))
self.screen.blit(text_surface, text_rect)
#游戏开始
def run(self):
while True:
self.handle_input()
if not self.game_over:
self.snake.move()
self.check_food_collision()
self.game_over = (
self.check_wall_collision() or
self.snake.check_self_collision()
)
self.screen.fill(colors["background"])
if self.game_over:
self.draw_game_over()
else:
self.snake.draw(self.screen)
self.food.draw(self.screen)
self._draw_text(f"得分: {self.score}", 30, 70, 20)
pygame.display.flip()
self.clock.tick(fps)
- 主程序:开始游戏main.py
'''
1、主程序:main.py
作用:
(1)创建GameController类的实例对象game
(2)调用game的runf方法,开始游戏
'''
from game_controller import GameController
if __name__ == "__main__":
game = GameController()
game.run()
四、游戏运行效果
- 基础玩法:
(1)方向键控制蛇的移动(上、下、左、右)
(2)吃到红色食物后蛇身体变长,左上角显示得分,得分+10
(3)碰撞自身或边界(可选设定)时游戏结束。游戏结束提示语:游戏结束!得分:0,按任意键重新开始
(4)防180度转向:使用方向向量反向检查 - 拓展功能:
(1)音效支持:添加蛇吃食物和碰撞音效
(2)高分榜:记录历史最高分
(3)可添加食物动画效果
(4)可添加蛇的眼睛会随着移动变化而变化 - 运行效果图:
五、注意事项与原创声明
- 代码原创性:本代码逻辑均为独立编写
- 素材合规性:未使用受保护的图片和音频,使用Python中Pygame来实现
六、总结
-
技术亮点:
(1)模块化设计:蛇(Snake)、食物(Food)和游戏逻辑(game_controller)完全分离,每个类有明确的职责和接口,逻辑清晰
(2)碰撞检测:通过坐标比对实现高效的自身碰撞判断
(3)蛇身增加机制:状态驱动,单帧生效,自动重置,避免手动管理增长步数。 -
方向控制:
(1)禁止180度转向,符合经典玩法逻辑 -
学习价值:
(1)掌握Pygame基础用法(事件循环、图形绘制)
(2)理解游戏开发中的状态管理与实时更新机制
(3)掌握通过坐标对比分维度处理坐标位置 -
扩展方向:
(1)特殊食物有星形标记
(2)蛇身有连接处细节
(3)蛇的头部有眼睛,会随着移动方向变化
(4)AI自动生成等