尧图精选

用Python和pygame手把手实现贪吃蛇小游戏:从环境搭建到图片音效全解析

🕒 发布时间:2026/10/2 5:18:54 📁 来源:尧图网络
之前在给学生做 Python 入门课程时经常会遇到一个很尴尬的节点控制台计算器写熟了、列表字典也会用了但一旦要做一个“真正的程序”很多人就卡住了。后来我发现用pygame写一个贪吃蛇小游戏几乎是最容易让初学者获得“完整项目感”的练习——它有图形界面、有交互、有游戏逻辑、有状态管理甚至能加入贴图、音效和界面切换。本文就用一个完整项目手把手从环境搭建到最终运行带你走一遍你需要的所有代码、图片素材处理方式、音效加载方法以及常见报错的排查思路都会在下面展开。无论你是刚学完 Python 语法的新手还是想找一个练手项目巩固面向对象知识的同学这篇教程都适用。1. 背景与核心概念1.1 贪吃蛇游戏的基本玩法贪吃蛇的规则很简单但实现起来正好覆盖了游戏开发的基础环节一条蛇在一个矩形地图中移动蛇头每走一步身体跟着移动。蛇不能穿越墙壁不能咬到自己否则游戏结束。蛇吃到食物后身体增长一截同时分数增加。食物被吃掉后会在新的随机位置重新出现。这个规则看起来不复杂但要想完整、稳定地实现需要处理坐标计算、键盘输入、碰撞检测、游戏状态切换等问题。而这些恰好是后续做更复杂 2D 游戏时离不开的基础能力。1.2 pygame 是什么pygame是一个基于 SDLSimple DirectMedia Layer的 Python 游戏开发库它封装了窗口创建、图像绘制、声音播放、事件处理、字体渲染等底层接口。核心特点有跨平台Windows、macOS、Linux 都能运行。上手简单没有复杂的 UI 架构换个窗口、画个矩形、监听键盘都只要几行代码。非常适合学习和制作 2D 小游戏、原型演示、课程设计项目。用 pygame 做项目不是为了将来一定要做商业游戏而是为了体会一个“由输入到反馈”的完整闭环程序接收按键 → 更新逻辑 → 绘制画面 → 再次等待输入。这个循环模型在很多开发场景中都会遇到。2. 环境准备与 Python 环境搭建2.1 检查 Python 是否已安装在开始之前先确认电脑上的 Python 环境。打开命令行Windows 上按Win R输入cmd回车macOS 打开“终端”然后输入python --version如果输出类似下面的信息说明 Python 已安装Python 3.11.5如果提示python 不是内部或外部命令说明 Python 还没正确安装或没有加入环境变量。这里建议直接到 Python 官网下载安装包安装过程中务必勾选“Add Python to PATH”这一步非常重要。安装完成后重新打开一个命令行窗口再次执行python --version验证。很多新手在这一步就出问题装了 Python但命令提示符还是找不到。绝大多数原因是安装时没有勾选 PATH 选项或者安装后没有重新打开窗口。2.2 安装 pygame确认 Python 可用后直接通过pip安装 pygamepip install pygame如果你希望使用国内镜像加速下载也可以执行pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可以运行一段简单的代码来验证安装结果import pygame pygame.init() print(pygame.version.ver) print(pygame 安装成功可以正常导入)正常情况下会输出 pygame 的版本号然后打印一行提示信息。到这里pygame 就准备好了。2.3 版本说明不同版本的 pygame 在 API 上基本稳定本教程用到的模块包括pygame.display、pygame.event、pygame.key、pygame.font、pygame.image、pygame.mixer、pygame.time.Clock。这些模块在 pygame 2.x 的各个小版本中行为一致所以如果你用的是最新版不需要担心兼容问题。如果安装时看到下载速度慢或超时优先使用镜像源如果提示 pip 版本过旧先执行pip install --upgrade pip再重新安装 pygame。3. 贪吃蛇游戏的核心原理拆解在写完整代码之前先把贪吃蛇的实现思路拆成几个模块来理解。很多人拿到项目就直接看代码结果一坨逻辑堆在一起改一个地方又影响另外一边最终还是看不太懂。我们先从底层原理说起。3.1 坐标系与游戏地图pygame 的窗口坐标系以左上角为原点X 轴向右增加Y 轴向下增加。贪吃蛇的移动可以简化为“格子移动”而不是像素级别的连续移动。比如一个 800×600 像素的窗口每个格子大小为 20×20 像素那么横向有 40 个格子纵向有 30 个格子。蛇的身体可以用一个列表保存列表里的每个元素是一个(x, y)格子坐标。例如snake [(5, 5), (4, 5), (3, 5)]这个列表的含义是蛇头在第 5 列第 5 行后面依次是身体。当蛇向左移动时新的列表头部变成(4, 5)尾部(3, 5)被移除。如果吃到食物就不移除尾部蛇身自然增长。用格子坐标而不是像素坐标的好处是碰撞判断、食物随机生成、蛇身绘制都非常直观。绘制时只需要把格子坐标乘以格子像素大小就能换算成屏幕坐标。3.2 游戏主循环整个游戏运行本质上是一个不停重复的循环处理用户输入方向键、退出按钮。根据输入更新游戏状态蛇头位置、分数、是否死亡。绘制当前画面蛇、食物、分数、背景。控制帧率让游戏速度保持稳定。代码骨架如下while running: for event in pygame.event.get(): if event.type pygame.QUIT: running False # 更新逻辑 # 绘制画面 pygame.display.flip() clock.tick(60)其中clock.tick(60)表示每秒最多运行 60 帧。对贪吃蛇这种格子游戏通常不需要 60 帧10 到 15 帧就够了否则蛇会快得没法操作。3.3 事件处理与方向控制pygame 的事件系统负责把键盘、鼠标、窗口关闭等操作转换成事件对象。方向键对应的写法是if event.type pygame.KEYDOWN: if event.key pygame.K_UP: direction (0, -1) elif event.key pygame.K_DOWN: direction (0, 1) elif event.key pygame.K_LEFT: direction (-1, 0) elif event.key pygame.K_RIGHT: direction (1, 0)这里的direction是一个向量表示蛇下一步在格子坐标系里的移动偏移。这里有一个关键限制蛇不能直接反向。比如蛇当前正在向右移动用户按了左键这个操作应该被忽略否则蛇会立刻咬到自己。判断方法很直接新方向不能等于当前方向的相反方向if new_direction[0] ! -direction[0] or new_direction[1] ! -direction[1]: direction new_direction注意这里要同时比较 X 和 Y 两个分量才能过滤掉反向操作。4. 实战一纯代码版贪吃蛇适合初学者先写一个不依赖外部图片素材的版本所有图形都使用 pygame 内置绘制函数完成。这样的好处是代码复制就能运行不会因为缺图片资源而报错。4.1 项目结构为了方便阅读建议在本地新建一个项目文件夹snake_game/ ├── snake_simple.py本文后面所有代码都放在snake_simple.py中。4.2 完整代码import random import sys import pygame # 初始化pygame pygame.init() # 窗口与地图参数 CELL_SIZE 20 GRID_WIDTH 40 GRID_HEIGHT 30 WINDOW_WIDTH CELL_SIZE * GRID_WIDTH WINDOW_HEIGHT CELL_SIZE * GRID_HEIGHT # 颜色定义 BLACK (0, 0, 0) WHITE (200, 200, 200) GREEN (0, 200, 0) RED (200, 0, 0) # 创建窗口 screen pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption(贪吃蛇 - 纯代码版) clock pygame.time.Clock() # 初始蛇的位置水平三个格子方向朝右 snake [(10, 15), (9, 15), (8, 15)] direction (1, 0) # 朝右移动 score 0 def random_food(): 在地图内随机生成食物避免生成在蛇身上。 while True: x random.randint(0, GRID_WIDTH - 1) y random.randint(0, GRID_HEIGHT - 1) if (x, y) not in snake: return (x, y) food random_food() running True while running: for event in pygame.event.get(): if event.type pygame.QUIT: running False elif event.type pygame.KEYDOWN: new_direction direction if event.key pygame.K_UP: new_direction (0, -1) elif event.key pygame.K_DOWN: new_direction (0, 1) elif event.key pygame.K_LEFT: new_direction (-1, 0) elif event.key pygame.K_RIGHT: new_direction (1, 0) # 防止直接反向 if new_direction[0] ! -direction[0] or new_direction[1] ! -direction[1]: direction new_direction # 计算蛇头新位置 head_x, head_y snake[0] new_head (head_x direction[0], head_y direction[1]) # 判断是否撞墙 if new_head[0] 0 or new_head[0] GRID_WIDTH or new_head[1] 0 or new_head[1] GRID_HEIGHT: break # 判断是否撞到自己 if new_head in snake: break snake.insert(0, new_head) # 判断是否吃到食物 if new_head food: score 10 food random_food() else: snake.pop() # 绘制背景 screen.fill(BLACK) # 绘制网格线为了视觉效果更清晰 for x in range(0, WINDOW_WIDTH, CELL_SIZE): pygame.draw.line(screen, WHITE, (x, 0), (x, WINDOW_HEIGHT)) for y in range(0, WINDOW_HEIGHT, CELL_SIZE): pygame.draw.line(screen, WHITE, (0, y), (WINDOW_WIDTH, y)) # 绘制食物 food_rect pygame.Rect(food[0] * CELL_SIZE, food[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, RED, food_rect) # 绘制蛇 for idx, segment in enumerate(snake): segment_rect pygame.Rect(segment[0] * CELL_SIZE, segment[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE) if idx 0: pygame.draw.rect(screen, GREEN, segment_rect) else: pygame.draw.rect(screen, (0, 120, 0), segment_rect) # 显示分数 font pygame.font.SysFont(Arial, 24) score_surface font.render(Score: {}.format(score), True, WHITE) screen.blit(score_surface, (10, 10)) pygame.display.flip() clock.tick(10) # 游戏结束后显示提示 font pygame.font.SysFont(Arial, 36) over_surface font.render(Game Over! Score: {}.format(score), True, RED) text_rect over_surface.get_rect(center(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)) screen.blit(over_surface, text_rect) pygame.display.flip() pygame.time.wait(2000) pygame.quit() sys.exit()4.3 代码运行与验证运行方式很简单在项目目录下执行python snake_simple.py运行后会出现一个黑色窗口里面有网格线、一条绿色蛇和一个红色食物。用键盘方向键控制蛇的移动吃到一个食物加 10 分撞墙或撞到自己后窗口中央会显示游戏结束信息然后自动退出。建议新手运行成功之后动手改几个参数来加深理解把clock.tick(10)改成clock.tick(20)体会游戏速度变化。把CELL_SIZE改成 30观察窗口变大的效果。把蛇的初始长度改成 5 个格子感受列表增长和碰撞躲避难度的变化。4.4 关键逻辑说明这段代码虽然只有几十行但含金量很足random_food()函数通过循环保证食物不会生成在蛇身处避免了食物出生在身体上导致无法吃到的问题。snake.insert(0, new_head)表示蛇头前进一步如果吃到食物就执行else分支之外的部分不删除尾部否则snake.pop()删除尾部蛇身长度保持不变。判断撞墙发生在移动之前所以蛇头坐标一旦越界游戏直接结束。“防止直接反向”的判断放在了按键分支里保证同一帧内连续按两个方向键时逻辑顺序仍然正确。5. 实战二带图片与音效的完整版贪吃蛇纯代码版虽然能跑但视觉上比较朴素。下面把项目升级成带图片资源和音效的完整版。这个版本在原本的框架上增加了三个功能图片加载与兜底方案、音效播放、开始界面与结束界面。5.1 项目结构规划snake_game_full/ ├── assets/ │ ├── snake_head.png │ ├── food.png │ └── eat.wav ├── game.py如果你暂时没有合适的图片和音效文件可以参考下面的处理方式snake_head.png可以自己用画图工具画一个 20×20 的绿色方块或者从免费素材站下载一个 20×20 的 PNG 图片。透明背景更好。food.png红色圆形 20×20 PNG 图片。eat.wav一个非常短的“叮”声可以通过 Python 代码生成简单的 WAV 文件也可以直接录制、下载一个短音效。代码里会对图片加载做“找不到文件就退回绘制图形”的兜底处理所以即使你没有准备素材程序也不会崩溃。5.2 使用命名常量规划游戏参数在代码开头集中定义游戏参数后续改速度、改窗口大小都很方便import random import sys import pygame # 初始化 pygame.init() pygame.mixer.init() CELL_SIZE 20 GRID_WIDTH 40 GRID_HEIGHT 30 WINDOW_WIDTH CELL_SIZE * GRID_WIDTH WINDOW_HEIGHT CELL_SIZE * GRID_HEIGHT FPS 12 WHITE (255, 255, 255) BLACK (0, 0, 0) RED (200, 0, 0) GREEN (0, 180, 0) DARK_GREEN (0, 120, 0)5.3 定义 Game 类用面向对象的方式把游戏状态、绘制、逻辑封装在一起。这样结构更清晰后续扩展也不容易把代码搞乱。class Game: def __init__(self): self.screen pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption(贪吃蛇 - 图片音效完整版) self.clock pygame.time.Clock() self.running True self.state START # START / PLAYING / GAME_OVER # 游戏数据 self.snake [] self.direction (1, 0) self.score 0 # 字体 self.font_large pygame.font.SysFont(microsoftyahei, 48) self.font_normal pygame.font.SysFont(microsoftyahei, 24) # 加载资源 self.head_img self.load_image(assets/snake_head.png) self.food_img self.load_image(assets/food.png) self.eat_sound self.load_sound(assets/eat.wav) self.reset() def load_image(self, path): 加载图片失败时返回None。 try: img pygame.image.load(path).convert_alpha() return pygame.transform.scale(img, (CELL_SIZE, CELL_SIZE)) except Exception: return None def load_sound(self, path): 加载音效失败时返回None。 try: return pygame.mixer.Sound(path) except Exception: return None def reset(self): 重置游戏状态开始新一局。 self.snake [(10, 15), (9, 15), (8, 15)] self.direction (1, 0) self.score 0 self.food self.random_food() self.state PLAYING需要注意中文状态下 Windows 的字体名可能是microsoftyahei微软雅黑如果你的系统字体名不同可以改为simhei或Arial。SysFont的第一个参数是字体名称不同平台有差异如果出现中文乱码直接改成系统的中文字体名称即可。5.4 核心逻辑方法在 Game 类中继续补充随机生成食物、移动、事件处理、绘制等方法。def random_food(self): 在地图中随机生成食物避免与蛇重叠。 while True: x random.randint(0, GRID_WIDTH - 1) y random.randint(0, GRID_HEIGHT - 1) if (x, y) not in self.snake: return (x, y) def handle_events(self): 处理窗口关闭和键盘事件。 for event in pygame.event.get(): if event.type pygame.QUIT: self.running False elif event.type pygame.KEYDOWN: if self.state START: if event.key pygame.K_SPACE: self.reset() elif self.state PLAYING: new_direction self.direction if event.key pygame.K_UP: new_direction (0, -1) elif event.key pygame.K_DOWN: new_direction (0, 1) elif event.key pygame.K_LEFT: new_direction (-1, 0) elif event.key pygame.K_RIGHT: new_direction (1, 0) # 防止直接反向 if new_direction[0] ! -self.direction[0] or new_direction[1] ! -self.direction[1]: self.direction new_direction elif self.state GAME_OVER: if event.key pygame.K_SPACE: self.reset() def update(self): 更新游戏逻辑只在PLAYING状态执行。 if self.state ! PLAYING: return head_x, head_y self.snake[0] new_head (head_x self.direction[0], head_y self.direction[1]) # 撞墙判断 if new_head[0] 0 or new_head[0] GRID_WIDTH or new_head[1] 0 or new_head[1] GRID_HEIGHT: self.state GAME_OVER return # 撞自己判断 if new_head in self.snake: self.state GAME_OVER return self.snake.insert(0, new_head) if new_head self.food: self.score 10 if self.eat_sound: self.eat_sound.play() self.food self.random_food() else: self.snake.pop() def draw(self): 根据状态绘制画面。 self.screen.fill(BLACK) if self.state START: self.draw_start_screen() elif self.state PLAYING: self.draw_game_screen() else: self.draw_game_over_screen() pygame.display.flip()5.5 绘制画面与开始/结束界面把绘制逻辑也拆开三块分别是开始界面、游戏主画面、结束界面。def draw_start_screen(self): title_text self.font_large.render(贪吃蛇, True, GREEN) tip_text self.font_normal.render(按空格键开始游戏, True, WHITE) title_rect title_text.get_rect(center(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 - 60)) tip_rect tip_text.get_rect(center(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 20)) self.screen.blit(title_text, title_rect) self.screen.blit(tip_text, tip_rect) def draw_game_screen(self): # 绘制食物优先使用图片图片不存在时用红色方块替代 if self.food_img: self.screen.blit(self.food_img, (self.food[0] * CELL_SIZE, self.food[1] * CELL_SIZE)) else: food_rect pygame.Rect(self.food[0] * CELL_SIZE, self.food[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(self.screen, RED, food_rect) # 绘制蛇身体 for idx, segment in enumerate(self.snake): x segment[0] * CELL_SIZE y segment[1] * CELL_SIZE if idx 0: if self.head_img: self.screen.blit(self.head_img, (x, y)) else: pygame.draw.rect(self.screen, GREEN, (x, y, CELL_SIZE, CELL_SIZE)) else: pygame.draw.rect(self.screen, DARK_GREEN, (x, y, CELL_SIZE, CELL_SIZE)) # 绘制分数 score_surface self.font_normal.render(Score: {}.format(self.score), True, WHITE) self.screen.blit(score_surface, (10, 10)) def draw_game_over_screen(self): over_text self.font_large.render(Game Over!, True, RED) score_text self.font_normal.render(Score: {}.format(self.score), True, WHITE) tip_text self.font_normal.render(按空格重新开始, True, WHITE) over_rect over_text.get_rect(center(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 - 60)) score_rect score_text.get_rect(center(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)) tip_rect tip_text.get_rect(center(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 60)) self.screen.blit(over_text, over_rect) self.screen.blit(score_text, score_rect) self.screen.blit(tip_text, tip_rect) def run(self): 游戏主循环。 while self.running: self.handle_events() self.update() self.draw() self.clock.tick(FPS) pygame.quit() sys.exit()最后在文件末尾加上入口调用if __name__ __main__: game Game() game.run()5.6 运行与验证在项目根目录执行python game.py运行结果和纯代码版类似但多了以下改进启动后先显示“贪吃蛇”标题界面按空格开始。吃到食物时如果音效文件存在会播放“叮”的声音。蛇头显示图片如果图片不存在则自动回退为绿色方块。游戏结束后回到结束界面按空格可以直接重新开始不需要重启程序。这个版本相比第一个版本的工程化程度更高而且因为有了界面状态切换已经接近一个小型游戏的基础框架了。6. 常见问题与排查思路在实际运行 pygame 项目时新手经常遇到下面这些问题。这里整理成表格方便你在开发时对照排查。问题现象常见原因解决思路pygame导入报 ModuleNotFoundErrorpygame 没有安装成功或 pip 安装到了别的 Python 环境确认命令行中执行的是同一个 Python 的 pip使用python -m pip install pygame重新安装窗口一闪而过就关闭程序没有进入 while 主循环或循环条件立刻变成 False检查running变量的变化确认没有误写为 False方向键没反应事件处理代码放在了 update 之后或者没有检测 KEYDOWN确保在 for event 循环中处理pygame.KEYDOWN并且事件循环写在 update 之前蛇可以反向然后立刻死亡没有过滤反向方向键增加方向判断新方向不能等于当前方向的相反方向中文文字显示为方框字体名不对或系统缺少对应中文字体改用pygame.font.SysFont的可用中文字体名称或使用系统字体文件路径图片加载失败路径错误、图片格式不支持、路径中的目录不存在确认assets目录存在图片路径正确建议使用 PNG 格式音效没有声音缺少音效文件、音频设备问题、没有调用pygame.mixer.init()确认文件存在初始化时先调用pygame.mixer.init()检查系统音量游戏速度太快clock.tick()数值设置过高将帧率值调低比如 10 到 15让每步移动间隔更明显食物生成在蛇身上随机生成时没有排除蛇身坐标使用 while 循环不断生成随机点直到坐标不与蛇身重叠为止游戏结束后无法重新开始没有实现 reset 逻辑或状态没有切回 PLAYING参考本文 Game 类的reset()方法统一重置蛇、方向、分数和食物如果遇到其他问题最有效的排查方法是分阶段打印日志程序启动后打印pygame.init()是否成功。每次update()执行后打印新的蛇头和方向向量。发生状态切换时打印当前状态名称。这样能很快定位是事件处理、逻辑更新还是绘制环节出了问题。7. 最佳实践与工程建议到这里一个完整可玩的贪吃蛇游戏已经做出来了。不过既然你是为了学习不妨再看看代码还能怎么优化。下面几点是我在实际教学和项目维护中总结出的建议。7.1 数据与绘制分离游戏逻辑里尽量不要直接操作像素坐标。蛇、食物、碰撞判断全部使用格子坐标只在最后绘制时做换算。这样做的好处是逻辑清晰而且后期如果调整格子大小只需要改一个常量。7.2 使用面向对象组织项目如果代码只有几十行写成一坨问题不大。可一旦加入界面状态、音效、图片、多人模式函数之间就会互相传参非常容易出错。把游戏状态封装在类里然后在主循环中调用handle_events()、update()、draw()三个方法是一个非常适合 2D 游戏项目的骨架。这个模式在 pygame 社区和正式游戏项目中都很常见。7.3 资源加载要做兜底图片和音效文件属于外部资源文件缺失、路径改错、格式不支持都可能发生。稳妥的方法是加载失败时返回None绘制或播放时先判断是否存在。这样最少不会让程序直接崩溃也能在调试时通过日志快速发现资源问题。7.4 状态管理决定代码可扩展性本文用START、PLAYING、GAME_OVER三个状态区分界面。你可以在这个基础上继续增加更多状态比如暂停状态PAUSED在游戏中按 P 键暂停再按一次继续。状态切换时只需要在handle_events里增加对应分支然后在draw里加一个绘制分支即可其他代码不用大改。7.5 常量收敛到顶层窗口宽高、格子大小、帧率、颜色、初始蛇长都建议写成模块级常量或类常量。这样调整参数时不需要翻到具体代码里去修改而且能避免同一个数字多处使用后上下文不同步的问题。后续如果想做一个游戏配置模块直接把这些常量迁移到配置文件或 JSON 中即可。7.6 注意帧率与蛇速的关系贪吃蛇比较特殊帧率太高反而会让蛇移动过快、几乎无法操作。更精细的设计可以拆成“逻辑速度”和“渲染速度”逻辑层每 N 帧更新一次渲染层保持 60 帧保证动画流畅。不过对入门项目来说直接把clock.tick()设置为移动速度即可这已经能覆盖绝大部分场景。8. 总结与学习路线通过完成这个 pygame 贪吃蛇项目你已经实际体验了游戏开发中最关键的一环理解一个程序如何通过“事件接收 → 逻辑更新 → 画面绘制”的循环持续运行。同时你也掌握了几个必须吃透的基础点坐标系的表示、列表在游戏状态中的应用、碰撞检测的两种常见方式、资源加载与失败兜底、界面状态切换。这些知识点组合起来足够支撑你继续做打砖块、飞机大战等二维游戏。如果你接下来想继续深入我建议按这个顺序往下探索加上难度升级蛇每吃到 3 个食物速度提升一档。加上墙壁蛇碰到四周墙壁不会死而是从对面穿出来。加上暂停功能P 键暂停方向键锁定。尝试记录历史最高分保存到本地文件。试着把蛇的身体改成图片或不同颜色的渐变效果。最终如果你还想挑战自己可以尝试给这个项目加一个简单的开始菜单、选择难度、甚至是“AI 自动寻路贪吃蛇”的算法比如用 BFS 搜索安全路径来驱动蛇自动吃食物。那已经是一个不错的算法入门项目了。希望这篇教程能帮你跑通第一款 pygame 小游戏。如果你在运行过程中遇到了没有覆盖到的报错可以把错误信息贴到评论区我们互相交流一起解决。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →