贪吃蛇无限版本(用 Python 打造经典贪吃蛇游戏从 0 到 1 实现 AI 自动贪吃蛇)

贪吃蛇无限版本(用 Python 打造经典贪吃蛇游戏从 0 到 1 实现 AI 自动贪吃蛇)

admin 2025-10-31 看点 1 次浏览 0个评论

提到童年经典游戏,贪吃蛇绝对占有一席之地。在诺基亚手机时代,这款通过方向键控制蛇身吃食物、不断变长的游戏陪伴了无数人的闲暇时光。今天,我们不仅要用 Python 重现这款经典游戏,还要让蛇拥有 "AI 大脑",实现自动寻路、躲避障碍和无限成长!

贪吃蛇无限版本(用 Python 打造经典贪吃蛇游戏从 0 到 1 实现 AI 自动贪吃蛇)
(图片来源网络,侵删)
一、贪吃蛇游戏核心原理

贪吃蛇的核心玩法非常简单:

蛇在封闭区域内移动,通过吃食物增长长度撞到墙壁或自身身体则游戏结束吃到食物得分增加,蛇身长度 + 1

用 Python 实现贪吃蛇,我们需要解决三个关键问题:

游戏界面渲染:使用pygame库绘制游戏窗口、蛇身和食物运动逻辑控制:处理蛇的移动、转向和增长机制AI 决策系统:让蛇自主规划路径寻找食物,避免死亡

接下来,我们就一步步拆解这个 Python 贪吃蛇项目的实现过程。

二、环境准备与基础框架搭建

首先需要安装必要的库,我们主要使用pygame进行图形渲染:

bash

pip install pygame

游戏的基础配置类SnakeConf定义了所有常量参数,这是良好编程习惯的体现:

python

class SnakeConf(object): # 游戏场地大小(20x20网格) HEIGHT, WIDTH = 20, 20 # 每个网格的像素大小 LINE_WIDTH = 25 LINE_MARGIN = 4 # 实际绘制的网格大小(减去边距) LINE_TRUEWIDTH = LINE_WIDTH - 2 * LINE_MARGIN # 窗口尺寸计算 SCREEN_X, SCREEN_Y = LINE_WIDTH * HEIGHT, LINE_WIDTH * WIDTH FIELD_SIZE = HEIGHT * WIDTH # 总网格数 # 特殊标记值(间隔要足够大) FOOD, UNDEFINED = 0, (HEIGHT + 1) * (WIDTH + 1) SNAKE = 2 * UNDEFINED # 方向常量定义 LEFT, RIGHT, UP, DOWN = -1, 1, -WIDTH, WIDTH # 颜色定义 BG_COLOR = (255, 255, 255) # 白色背景 SNAKE_COLOR = (136, 0, 21) # 深红色蛇身 FOOD_COLOR = (20, 220, 39) # 绿色食物

这些常量让代码更具可读性和可维护性,后续调整游戏参数只需修改这里的值。

三、游戏核心逻辑实现1. 初始化游戏对象

Snake类的构造函数初始化了游戏的核心数据结构:

board:记录游戏场地每个网格的状态snake:存储蛇身每个节点的位置(一维数组表示二维坐标)food:食物的位置坐标临时变量用于 AI 决策时的虚拟运算

python

def __init__(self): # 初始化游戏场地 self.board = [0] * SnakeConf.FIELD_SIZE # 初始化蛇(从(1,1)位置开始,长度为1) self.snake = [0] * (SnakeConf.FIELD_SIZE + 1) self.snake[0] = 1 * SnakeConf.WIDTH + 1 self.snake_size = 1 # 初始食物位置(3,3) self.food = 3 * SnakeConf.WIDTH + 3 # 运动方向数组 self.mov = [SnakeConf.LEFT, SnakeConf.RIGHT, SnakeConf.UP, SnakeConf.DOWN]

2. 核心游戏机制解析(1)碰撞检测

is_move_possible方法判断蛇头向某个方向移动是否合法(不会撞墙):

python

def is_move_possible(self, idx, move): if move == SnakeConf.LEFT: return idx % SnakeConf.WIDTH > 1 # 左边不是墙壁 elif move == SnakeConf.RIGHT: return idx % SnakeConf.WIDTH < (SnakeConf.WIDTH - 2) # 右边不是墙壁 elif move == SnakeConf.UP: return idx > (2 * SnakeConf.WIDTH - 1) # 上边不是墙壁 elif move == SnakeConf.DOWN: return idx < (SnakeConf.FIELD_SIZE - 2 * SnakeConf.WIDTH) # 下边不是墙壁(2)路径规划算法

游戏的灵魂在于 AI 自动寻路,这里使用广度优先搜索 (BFS) 实现路径规划:

python

def board_refresh(self, pfood, psnake, pboard): queue = [pfood] # 从食物位置开始搜索 inqueue = [0] * SnakeConf.FIELD_SIZE # 标记是否已入队 found = False while queue: idx = queue.pop(0) if inqueue[idx]: continue inqueue[idx] = 1 # 探索四个方向 for move in self.mov: if self.is_move_possible(idx, move): # 如果找到蛇头,标记成功 if idx + move == psnake[0]: found = True # 更新路径长度 if pboard[idx+move] < SnakeConf.SNAKE: # 不是蛇身 if pboard[idx + move] > pboard[idx] + 1: pboard[idx + move] = pboard[idx] + 1 if not inqueue[idx + move]: queue.append(idx + move) return found

这个方法会计算场地中每个位置到食物的最短路径长度,为 AI 决策提供依据。

(3)AI 决策逻辑

AI 蛇的决策流程非常智能:

优先选择到食物的最短路径检查路径是否安全(确保蛇头到蛇尾有通路)危险时选择跟随蛇尾的策略极端情况下随机选择可行方向

python

# 选择最短安全路径def choose_shortest_safe_move(self, psnake, pboard): best_move = SnakeConf.ERR min_dist = SnakeConf.UNDEFINED for move in self.mov: if self.is_move_possible(psnake[0], move) and pboard[psnake[0] + move] < min_dist: min_dist = pboard[psnake[0] + move] best_move = move return best_move# 跟随蛇尾策略(避免死循环)def follow_tail(self): # 虚拟操作:将蛇尾视为食物计算路径 self.tmpboard[self.tmpsnake[self.tmpsnake_size - 1]] = SnakeConf.FOOD self.tmpboard[self.food] = SnakeConf.SNAKE self.board_refresh(self.tmpsnake[self.tmpsnake_size - 1], self.tmpsnake, self.tmpboard) return self.choose_longest_safe_move(self.tmpsnake, self.tmpboard)3. 游戏渲染与主循环

draw_snake方法负责在屏幕上绘制蛇身,使用矩形拼接实现连续的蛇身效果:

python

def draw_snake(self, screen): # 绘制蛇头 left = (self.snake[0] // SnakeConf.WIDTH) * SnakeConf.LINE_WIDTH + 2 top = (self.snake[0] % SnakeConf.WIDTH) * SnakeConf.LINE_WIDTH + 2 rect = pygame.Rect(left, top, SnakeConf.LINE_TRUEWIDTH, SnakeConf.LINE_TRUEWIDTH) pygame.draw.rect(screen, SnakeConf.SNAKE_COLOR, rect, 0) # 绘制蛇身(连接相邻节点) for i in range(1, self.snake_size): # 计算前后节点位置并绘制连接矩形 # ...省略具体坐标计算代码... pygame.draw.rect(screen, SnakeConf.SNAKE_COLOR, rect, 0)

主循环控制游戏的运行流程,处理用户输入、更新游戏状态并渲染画面:

python

def main(self): pygame.init() screen = pygame.display.set_mode((SnakeConf.SCREEN_X, SnakeConf.SCREEN_Y)) clock = pygame.time.Clock() isdead = False pause = False while True: # 处理事件(退出、暂停等) # ... # 游戏逻辑更新 if not pause and not isdead: # AI决策与移动 # ... # 绘制游戏元素 screen.fill(SnakeConf.BG_COLOR) self.draw_snake(screen) # 绘制食物和分数 # ... pygame.display.update() clock.tick(100) # 控制游戏速度四、游戏特色与扩展方向

这个 Python 贪吃蛇游戏有很多亮点:

全自动化 AI:无需手动操作,蛇会自主寻路吃食物智能避障:通过 BFS 算法和蛇尾跟随策略避免死亡可视化界面:清晰的图形渲染,支持暂停和单步调试分数系统:实时显示当前得分(蛇的长度)

你可以尝试这些扩展方向:

增加难度级别(随分数提高速度)添加特殊食物(限时加速、长度翻倍等)实现双人对战模式加入音效和动画效果优化 AI 算法,提高蛇的生存能力五、完整代码与运行指南

将文中代码整合后,只需运行以下命令即可启动游戏:

bash

python snake_game.py

游戏操作说明:

空格键:暂停 / 继续游戏右方向键:单步执行(暂停时有效)关闭窗口:退出游戏

当蛇撞到墙壁或自身时,会显示 "YOU DEAD!" 提示,按空格键可重新开始。

六、总结

通过这个贪吃蛇项目,我们不仅重温了经典游戏的乐趣,还学习了:

Pygame 图形库的基础使用广度优先搜索在路径规划中的应用游戏 AI 的基本决策逻辑面向对象编程的实践技巧

这个自动贪吃蛇的实现展示了 Python 在游戏开发中的强大能力,即使是看似简单的游戏,也能蕴含丰富的算法思想。希望这个项目能激发你对 Python 编程和游戏开发的兴趣,不妨尝试修改代码,创造属于你的特色贪吃蛇吧!

转载请注明来自Sjyct,本文标题:《贪吃蛇无限版本(用 Python 打造经典贪吃蛇游戏从 0 到 1 实现 AI 自动贪吃蛇)》

每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,1人围观)参与讨论

还没有评论,来说两句吧...