# snake_python **Repository Path**: junzhe-liu/snake_python ## Basic Information - **Project Name**: snake_python - **Description**: python pygame snake - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-06-24 - **Last Updated**: 2026-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # `Pygame`贪吃蛇游戏 `Python` 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括`Web`开发、数据分析、人工智能和自动化脚本 ## 引言 贪吃蛇作为一款承载几代人回忆的经典小游戏,核心逻辑简洁却涵盖了`2D`游戏开发的核心要素——图形渲染、事件响应、碰撞检测与状态管理。本文将基于`Python`的`Pygame`库,从零拆解贪吃蛇游戏的开发步骤,提供逐行代码解析和完整流程图,帮助新手快速掌握游戏开发的基础思路,同时为有经验的开发者提供可复用的代码框架。 本文适用于`Python 3.x`环境,核心依赖`Pygame`库,全程采用面向对象编程思想,代码结构清晰、易扩展,可直接复现运行,还能在此基础上添加音效、难度递增等进阶功能。 ## 一、开发环境准备 ### 1.1 依赖库安装 本次开发仅需依赖`Pygame`库(用于窗口创建、图形绘制、事件监听),通过pip 命令即可快速安装: ```bash pip install pygame ``` 安装完成后,可在Python终端输入`import pygame`验证,无报错则说明安装成功。 ### 1.2 环境说明 `Python`版本:3.7及以上(兼容性更佳) 运行方式:本地`Python`脚本运行、`Jupyter Notebook`(需额外配置显示逻辑) 扩展工具:可搭配`PyCharm`、`VS Code`等`IDE`,开启语法提示提升开发效率 ## 二、游戏核心逻辑与流程图 贪吃蛇游戏的核心循环的是“输入处理→状态更新→碰撞检测→图形渲染”,具体逻辑如下: ### 2.1 整体流程图 ```mermaid flowchart TB start[程序启动] --> init[初始化游戏环境] init --> create_window[创建窗口/时钟/字体] init --> init_snake[初始化蛇-位置/方向] init --> food[随机生成食物-`避蛇身`] food --> event_handling[事件处理] event_handling --> input{键盘输入?} input --方向键--> update_direction[更新蛇移动方向-防180反向] input --P键--> pause_status[切换游戏暂停/继续状态] input--R键--> reset_state[重置游戏状态] input --关闭窗口--> exit[退出程序] event_handling --> no_input[无输入则保持原状态] init --> main_loop[进入游戏主循环] main_loop --> collision[碰撞检测] collision --> over{蛇头撞墙/撞自身?} over --是--> end_status[设置游戏结束状态,显示得分] over --否--> continue[游戏继续] food --> status_update[状态更新-`非暂停/游戏结束`] status_update --> new_head[计算蛇头新位置] status_update --> is_eat_food{吃到食物?} is_eat_food --是-->snake_growth[蛇身增长1节+分数累加+新食物生成] is_eat_food --否-->snake_move[蛇身跟随移动-`删除尾部`] main_loop --> graphics_rendering[图形渲染] graphics_rendering --> draw_background[绘制背景/蛇身/食物] graphics_rendering --> draw_fractions[绘制分数/状态提示-`暂停/结束`] graphics_rendering --> refresh_screen[刷新屏幕,控制帧率] restart{按R键重启?} --是--> init restart --否--> main_loop end_status --> restart ``` ### 2.2 核心逻辑说明 蛇的移动:通过“添加新头部+删除尾部”实现移动,吃到食物时不删除尾部即实现增长。 碰撞检测:分两类——边界碰撞(蛇头超出窗口范围)、自碰撞(蛇头与身体坐标重叠)。 食物生成:随机生成坐标,若落在蛇身上则重新生成,确保食物位置有效。 ## 三、分步实现与代码解析 采用面向对象编程,封装`Snake`(蛇)和`Food`(食物)类 ,将核心逻辑模块化,提升代码可维护性。 ### 3.1 导入库与定义常量 ```python import pygame import random import sys # 游戏常量(集中定义,便于后续调整) WIDTH, HEIGHT = 600, 400 # 窗口尺寸(像素) GRID_SIZE = 20 # 网格大小(蛇/食物的基础单位) SPEED = 10 # 初始帧率(控制移动速度) # 颜色常量(RGB值) WHITE = (255, 255, 255) # 背景色 GREEN = (0, 255, 0) # 蛇身颜色 BLUE = (0, 0, 255) # 蛇头颜色 RED = (255, 0, 0) # 食物颜色 BLACK = (0, 0, 0) # 文字颜色 ``` 解析:常量单独定义可避免硬编码,后续需调整窗口大小、速度时,直接修改此处即可,无需改动核心逻辑。 ### 3.2 蛇类(`Snake`)实现 封装蛇的初始化、移动、绘制、方向更新等行为,核心是update方法处理移动与碰撞逻辑。 ```python class Snake: def __init__(self): # 初始蛇身:3节,横向排列在窗口中间(网格坐标) self.body = [(15, 10), (14, 10), (13, 10)] self.direction = (1, 0) # 初始方向:向右(x+1,y不变) self.grow_flag = False # 成长标记(吃到食物为True) def update(self): """更新蛇的位置,返回是否碰撞(True=碰撞,游戏结束)""" # 计算新蛇头位置(网格坐标) head_x, head_y = self.body[0] dir_x, dir_y = self.direction new_head = (head_x + dir_x, head_y + dir_y) # 碰撞检测:撞墙(超出网格范围)或撞自身 if (new_head[0] < 0 or new_head[0] >= WIDTH//GRID_SIZE or new_head[1] < 0 or new_head[1] >= HEIGHT//GRID_SIZE or new_head in self.body): return True # 碰撞发生,游戏结束 # 添加新蛇头 self.body.insert(0, new_head) # 吃到食物则保留尾部(增长),否则删除尾部(移动) if not self.grow_flag: self.body.pop() else: self.grow_flag = False # 重置成长标记 return False # 无碰撞,游戏继续 def change_direction(self, new_dir): """改变移动方向,禁止180°反向(如向右时不能直接向左)""" # 反向判断:新方向与原方向x+y之和为0(如(1,0)与(-1,0)) if (new_dir[0] + self.direction[0] == 0 and new_dir[1] + self.direction[1] == 0): return # 禁止反向,不更新方向 self.direction = new_dir def draw(self, screen): """绘制蛇身:蛇头蓝色,蛇身绿色,留1像素间隙区分节段""" for i, segment in enumerate(self.body): x = segment[0] * GRID_SIZE y = segment[1] * GRID_SIZE # 绘制矩形:位置(x,y),尺寸(GRID_SIZE-1, GRID_SIZE-1) rect = pygame.Rect(x, y, GRID_SIZE-1, GRID_SIZE-1) if i == 0: pygame.draw.rect(screen, BLUE, rect) # 蛇头 else: pygame.draw.rect(screen, GREEN, rect) # 蛇身 ``` ### 3.3 食物类(`Food`)实现 核心功能是随机生成食物位置,确保不与蛇身重叠,避免无效食物。 ```python class Food: def __init__(self): self.position = (0, 0) # 食物初始位置 def generate(self, snake_body): """生成新食物,避开蛇身""" while True: # 随机生成网格内坐标(0到最大网格数-1) x = random.randint(0, (WIDTH // GRID_SIZE) - 1) y = random.randint(0, (HEIGHT // GRID_SIZE) - 1) self.position = (x, y) # 若位置不在蛇身上,则生成有效,退出循环 if self.position not in snake_body: break def draw(self, screen): """绘制食物:红色矩形,与蛇身尺寸一致""" x = self.position[0] * GRID_SIZE y = self.position[1] * GRID_SIZE rect = pygame.Rect(x, y, GRID_SIZE-1, GRID_SIZE-1) pygame.draw.rect(screen, RED, rect) ``` ### 3.4 主游戏逻辑封装 整合初始化、事件处理、主循环等逻辑,实现完整游戏流程。 ```python class SnakeGame: def __init__(self): pygame.init() # 初始化Pygame所有模块 self.screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 创建游戏窗口 pygame.display.set_caption("Python贪吃蛇 | 方向键控制 | P暂停 | R重启") self.clock = pygame.time.Clock() # 时钟对象(控制帧率) self.font = pygame.font.SysFont("SimHei", 24) # 中文支持字体 # 初始化游戏对象 self.snake = Snake() self.food = Food() self.food.generate(self.snake.body) # 生成初始食物 # 游戏状态变量 self.score = 0 self.game_over = False self.paused = False def handle_events(self): """处理键盘事件与窗口关闭""" for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 退出程序 if event.type == pygame.KEYDOWN: # 游戏结束时,按R重启 if self.game_over: if event.key == pygame.K_r: self.reset() continue # 暂停状态下,仅响应P键 if self.paused: if event.key == pygame.K_p: self.paused = not self.paused continue # 方向键控制 if event.key == pygame.K_UP: self.snake.change_direction((0, -1)) elif event.key == pygame.K_DOWN: self.snake.change_direction((0, 1)) elif event.key == pygame.K_LEFT: self.snake.change_direction((-1, 0)) elif event.key == pygame.K_RIGHT: self.snake.change_direction((1, 0)) # 暂停/重启快捷键 elif event.key == pygame.K_p: self.paused = not self.paused elif event.key == pygame.K_r: self.reset() def reset(self): """重置游戏状态,重新开始""" self.snake = Snake() self.food.generate(self.snake.body) self.score = 0 self.game_over = False self.paused = False def draw_ui(self): """绘制UI:背景、分数、状态提示""" # 绘制白色背景 self.screen.fill(WHITE) # 绘制蛇和食物 self.snake.draw(self.screen) self.food.draw(self.screen) # 绘制分数 score_text = self.font.render(f"得分:{self.score}", True, BLACK) self.screen.blit(score_text, (10, 10)) # 绘制暂停提示 if self.paused: pause_text = self.font.render("暂停中 | 按P继续", True, BLACK) self.screen.blit(pause_text, (WIDTH//2 - 100, HEIGHT//2)) # 绘制游戏结束提示 if self.game_over: over_text1 = self.font.render(f"游戏结束!最终得分:{self.score}", True, BLACK) over_text2 = self.font.render("按R重启 | 按窗口关闭退出", True, BLACK) self.screen.blit(over_text1, (WIDTH//2 - 150, HEIGHT//2 - 30)) self.screen.blit(over_text2, (WIDTH//2 - 180, HEIGHT//2 + 10)) # 刷新屏幕 pygame.display.flip() def run(self): """游戏主循环""" while True: self.handle_events() # 事件处理 if not self.paused and not self.game_over: # 状态更新:移动蛇,检测是否吃到食物 self.game_over = self.snake.update() if self.snake.body[0] == self.food.position: self.snake.grow_flag = True # 标记成长 self.score += 10 # 每吃一个食物加10分 self.food.generate(self.snake.body) # 生成新食物 self.draw_ui() # 绘制UI self.clock.tick(SPEED) # 控制帧率,确保速度稳定 # 程序入口 if __name__ == "__main__": game = SnakeGame() game.run() ``` ## 四、代码运行与调试说明 ### 4.1 运行步骤 将上述代码保存为`snake_game.py`文件; 打开终端,切换到文件所在目录; 执行命令`python snake_game.py`,即可启动游戏。 ### 4.2 操作说明 方向键`↑↓←→`:控制蛇的移动方向; P键:暂停/继续游戏; R键:游戏中/游戏结束后重启; 关闭窗口:退出游戏。 ### 4.3 常见问题调试 中文乱码:将字体`SimHei`改为`Arial`,同时删除中文提示(适合无中文字体环境); 蛇移动过快/过慢:调整`SPEED`常量(值越大速度越快); 食物与蛇身重叠:检查`Food.generate`方法中的循环逻辑,确保位置验证有效。 ## 五、进阶功能拓展建议 基础版本实现后,可添加以下功能提升游戏体验,适合进一步练手: 难度递增:每得100分提升1帧速度,增强游戏挑战性; 音效添加:吃食物、碰撞时播放对应音效(使用`pygame.mixer`); 排行榜功能:将最高分保存到本地文件,启动时显示; 皮肤切换:支持蛇身、食物颜色自定义选择; 边界穿越:允许蛇从窗口一侧穿出,从另一侧进入(修改碰撞检测逻辑即可)。 ## 六、总结 本文通过`Pygame`库实现了经典贪吃蛇游戏,核心在于掌握“事件驱动+状态循环”的游戏开发模式,同时通过面向对象编程将复杂逻辑拆解为独立模块,提升代码可读性和可扩展性。 [教程](https://blog.csdn.net/qq_42603590/article/details/157390521)