Python小游戏开发实战:从猜数字到贪吃蛇,兴趣驱动编程入门

Python小游戏开发实战:从猜数字到贪吃蛇,兴趣驱动编程入门 先不急着报班也不急着刷几十集视频。这次我们直接拿游戏开头用 Python 写几个能跑、能玩、能改的小游戏。标题里说“兴趣程度拉满”其实背后就一句话——Python 的反馈链路太短了写完代码立刻能看到图形窗口、命令行交互和游戏逻辑跑起来这种即时反馈是保持学习动力的关键。这篇文章不搞空谈直接带你完成三件事第一用纯 Python 写一个“猜数字”命令行游戏理解变量、循环、条件判断和随机数第二用内置的 turtle 模块做一个键盘控制的小游戏理解事件监听和坐标运动第三用 pygame 写一个简易版“贪吃蛇”理解游戏主循环、碰撞检测和分数系统。最后我会补充打包成 exe、资源占用观察、常见报错排查和工程化建议。整个过程中不会出现难以理解的抽象概念所有代码都可以复制到本地直接运行。哪怕你之前没写过一行代码跟着这篇文章走完也会对 Python 能做什么、学习路径该怎么规划有一个清晰的判断。1. 核心能力速览先把这篇文章涉及的技术内容整理成一张速览表。你可以对照自己的基础和目标决定先跑哪个项目。能力项说明项目类型Python 命令行小游戏、turtle 图形游戏、pygame 桌面游戏基础要求会安装 Python 即可不要求有编程经验核心知识点变量、数据类型、循环、条件判断、函数、随机数、事件监听图形方案turtle内置、pygame需 pip 安装打包能力支持使用 PyInstaller 打包成 exe运行平台Windows / macOS / Linux均支持显存/GPU不需要纯 CPU 运行开发环境VS Code、PyCharm、IDLE 均可最低系统自带文本编辑器就行适合场景Python 入门练习、教学演示、课后作业、兴趣驱动学习从表格可以看到这类项目的硬件门槛几乎为零任何一台能装 Python 的电脑都能跑。这也是我推荐用游戏入门 Python 的原因它屏蔽了“环境配置劝退”这个最大的新手障碍。2. 适用场景与学习边界游戏开发在 Python 学习路径里的定位很特殊它不是最赚钱的方向也不是性能最强的方向但它是反馈最直接的方向。当你输入一串代码屏幕上立刻出现一个可以操作的小窗口时那种“我能控制计算机”的感觉比看十遍语法教程都管用。2.1 适合什么人完全零基础的人这篇文章的三个项目难度递增从命令行到图形界面每一步都有可运行结果。学过语法但缺少练手项目的学生猜数字和贪吃蛇是经典的“数据结构 逻辑”练习题。需要做教学演示的老师和家长turtle 和 pygame 能直观展示程序运行过程适合课堂演示。想快速了解 Python 能干什么的观望者通过游戏项目可以快速判断自己是否适合继续深入。2.2 能解决什么问题帮助理解“代码是怎么跑起来的”游戏主循环、事件响应、状态更新这些概念在其他 Python 项目中也会反复出现。降低起步难度用游戏的形式让变量和循环变得可感知。产出可以分享的作品做好的小游戏可以打包发给朋友玩这是持续学习的动力来源。2.3 不适合什么场景不适合当作求职作品命令行游戏和简单 2D 游戏很难写进专业简历。不适合追求高性能游戏开发Python 游戏性能有限复杂 3D 游戏通常使用 Unity、Unreal 等引擎。不适合替代系统学习游戏项目是引路石不是全部。后续如果要做数据分析、爬虫、Web 开发仍需对应方向的系统练习。2.4 合规与安全边界使用 turtle 和 pygame 都属于本地代码练习不涉及网络请求和用户数据但仍需注意如果参考其他人的游戏源码请在开源许可范围内使用和修改不要直接抄袭商用。如果你的游戏计划发布上线需要确认用到的图片、音频素材都有合法授权。如果你打算把游戏打包分发在 exe 中要避免内置恶意代码发布前应自查依赖来源。3. 环境准备与前置条件在开始写代码之前先把 Python 环境准备好。这里给出一个通用检查清单不限定具体版本——因为 Python 3.8 到 3.12 之间的大部分版本都能运行本文代码你根据自己系统情况选一个稳定的即可。3.1 操作系统与 Python 版本支持 Windows 10/11、macOS、主流 Linux 发行版。推荐安装 Python 3.10 或更高版本教程和依赖支持都比较完善。不建议使用 Python 2.x本文所有代码基于 Python 3。3.2 安装 Python在 Windows 上到 Python 官网下载安装包勾选“Add Python to PATH”然后一路 Next。在 macOS 上可以使用官方安装包也可以使用 Homebrewbrew install python3.12在 Linux 上常见发行版自带 Python 3你可以用系统包管理器安装。例如 Ubuntusudo apt update sudo apt install python3 python3-pip安装完成后打开终端或命令行输入以下命令验证python --version如果这个命令能输出版本号说明 Python 已装好。注意 Windows 上如果提示找不到命令可以试试python3或者重新勾选 PATH 安装。3.3 准备开发环境这一步不强制。你完全可以用系统自带的文本编辑器写.py文件然后命令行运行。但有一个趁手的编辑器会舒服很多推荐两个VS Code免费插件丰富安装 Python 扩展后支持语法高亮、代码补全、单文件运行。PyCharm Community免费版够用适合新手管理项目结构。对于本文的三个小项目单个.py文件就能完成不需要额外准备数据库、浏览器驱动、GPU 驱动等重型依赖。3.4 安装第三方库三个项目中猜数字使用纯内置模块randomturtle 游戏使用内置模块turtle都不需要额外安装。只有 pygame 需要手动安装pip install pygame安装完成后可以验证一下python -m pygame.examples.aliens如果能看到一个小游戏窗口弹出来说明 pygame 安装成功。3.5 运行方式在命令行中进入.py文件所在目录执行python 文件名.py或者使用编辑器自带的“运行”按钮。这里建议刚开始写代码时养成“命令行运行”的习惯后续接接口、做批量处理时会更自然。4. 项目一命令行猜数字游戏第一个项目不做图形界面只做命令行交互。目的不是炫技而是让你用最短的代码把 Python 的基本语法和程序执行流程串起来。4.1 代码实现新建一个guess_number.py文件输入以下代码import random def main(): print(猜数字游戏开始) print(我已经想好了一个 1 到 100 之间的整数。) target random.randint(1, 100) attempts 0 while True: try: guess int(input(请输入你猜的数字)) except ValueError: print(输入无效请输入一个整数。) continue attempts 1 if guess target: print(太小了再大一点。) elif guess target: print(太大了再小一点。) else: print(f恭喜你猜对了答案就是 {target}。) print(f你一共猜了 {attempts} 次。) break play_again input(是否再来一局(y/n)) if play_again.lower() y: main() else: print(感谢游玩再见) if __name__ __main__: main()4.2 运行与效果在命令行运行python guess_number.py程序会输出类似下面的交互猜数字游戏开始 我已经想好了一个 1 到 100 之间的整数。 请输入你猜的数字50 太大了再小一点。 请输入你猜的数字25 太小了再大一点。 请输入你猜的数字37 恭喜你猜对了答案就是 37。 你一共猜了 3 次。4.3 代码拆解这段代码覆盖了 Python 入门阶段最重要的几个知识点import random导入模块使用随机数功能。def main():定义函数组织代码结构。while True:无限循环配合break实现“猜中后退出”。try/except ValueError捕获异常确保用户输入的是数字。f-string格式化输出把变量嵌进字符串。if __name__ __main__:Python 文件作为脚本直接运行时执行main()函数。这是一个标准写法后续所有项目都会用到。4.4 判断成功与扩展方向判断标准很直接程序能持续接收输入能根据猜大了还是猜小了给出反馈最终猜中后能选择重开。这个项目可以按这些方向扩展增加难度切换比如 1 到 1000。增加猜的次数上限超过就失败。记录历史输入避免重复猜测。把游戏封装成函数方便在别的项目里调用。5. 项目二turtle 键盘控制小游戏第二个项目开始接触图形界面。Python 内置的 turtle 库是一个很适合入门的图形画布工具它不用安装任何第三方依赖就能创建一个窗口控制一个小海龟在屏幕上移动。5.1 代码实现新建一个turtle_game.py文件输入以下代码import turtle # 初始化窗口 screen turtle.Screen() screen.title(turtle 键盘控制小游戏) screen.bgcolor(lightblue) screen.setup(width600, height600) # 创建玩家角色 player turtle.Turtle() player.shape(turtle) player.color(green) player.penup() player.speed(0) # 移动步长 step 20 def move_up(): player.setheading(90) player.forward(step) def move_down(): player.setheading(270) player.forward(step) def move_left(): player.setheading(180) player.forward(step) def move_right(): player.setheading(0) player.forward(step) # 键盘监听 screen.listen() screen.onkey(move_up, Up) screen.onkey(move_down, Down) screen.onkey(move_left, Left) screen.onkey(move_right, Right) print(使用方向键控制小海龟移动。) turtle.done()5.2 运行与效果运行python turtle_game.py运行后会出现一个浅蓝色窗口里面有一只绿色的海龟。按键盘方向键海龟会朝对应方向移动。窗口关闭前程序会一直保持监听状态。5.3 代码拆解这个项目引入了几个新概念窗口初始化turtle.Screen()创建画布setup()设置大小。角色创建turtle.Turtle()创建对象shape()设置形状penup()去掉移动轨迹。事件监听screen.listen()开始监听键盘screen.onkey(函数, 按键)把按键绑定到对应函数。方向控制setheading()设置朝向forward()向前移动。5.4 判断成功与扩展方向判断标准是窗口正常打开方向键能控制海龟移动角色不会卡死。扩展方向有很多在画布中随机生成“食物”海龟碰到食物后得分。给海龟添加边界检测碰到边缘后反弹或回到中心。增加第二个海龟让两个人分别控制。5.5 关于 turtle 的小提示turtle 模块在 Python 3.13 里可能会被标记为维护状态但它在 Python 3.8 到 3.12 的常规版本里仍然可用。如果你安装的是最新版本且使用 turtle 时报错可以考虑降级到 Python 3.12或者直接跳到下面的 pygame 项目。它的定位是教学工具不适合做大型项目。6. 项目三pygame 贪吃蛇第三个项目把难度提升一档做一个经典的“贪吃蛇”。这个项目会用到第三方库 pygame它提供游戏窗口、事件循环、碰撞检测等基础能力适合理解“游戏是怎么一帧一帧跑起来的”。6.1 安装 pygame在命令行执行pip install pygame安装完成后可以用下面的命令快速验证python -m pygame.examples.aliens能弹出游戏窗口说明 pygame 环境正常。6.2 代码实现新建一个snake_game.py文件输入以下代码import pygame import random import sys # 初始化 pygame pygame.init() # 常量设置 WIDTH, HEIGHT 600, 600 CELL_SIZE 20 FPS 10 # 颜色定义 BLACK (0, 0, 0) WHITE (255, 255, 255) GREEN (0, 200, 0) RED (200, 0, 0) # 初始化窗口 screen pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(贪吃蛇) # 时钟控制帧率 clock pygame.time.Clock() # 蛇的初始位置和方向 snake [(WIDTH // 2, HEIGHT // 2)] direction (CELL_SIZE, 0) # 食物随机生成 def random_food(): while True: x random.randint(0, WIDTH // CELL_SIZE - 1) * CELL_SIZE y random.randint(0, HEIGHT // CELL_SIZE - 1) * CELL_SIZE if (x, y) not in snake: return (x, y) food random_food() score 0 font pygame.font.SysFont(simhei, 24) # 游戏主循环 while True: # 事件处理 for event in pygame.event.get(): if event.type pygame.QUIT: pygame.quit() sys.exit() if event.type pygame.KEYDOWN: if event.key pygame.K_UP and direction ! (0, CELL_SIZE): direction (0, -CELL_SIZE) elif event.key pygame.K_DOWN and direction ! (0, -CELL_SIZE): direction (0, CELL_SIZE) elif event.key pygame.K_LEFT and direction ! (CELL_SIZE, 0): direction (-CELL_SIZE, 0) elif event.key pygame.K_RIGHT and direction ! (-CELL_SIZE, 0): direction (CELL_SIZE, 0) # 更新蛇头位置 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] WIDTH or new_head[1] 0 or new_head[1] HEIGHT or new_head in snake ): break snake.insert(0, new_head) # 吃到食物 if new_head food: score 1 food random_food() else: snake.pop() # 绘制画面 screen.fill(BLACK) for segment in snake: pygame.draw.rect( screen, GREEN, (segment[0], segment[1], CELL_SIZE, CELL_SIZE) ) pygame.draw.rect( screen, RED, (food[0], food[1], CELL_SIZE, CELL_SIZE) ) score_surface font.render(f得分: {score}, True, WHITE) screen.blit(score_surface, (10, 10)) pygame.display.flip() clock.tick(FPS) # 游戏结束后显示分数 print(f游戏结束最终得分{score}) pygame.quit()6.3 运行与效果运行python snake_game.py窗口打开后按方向键控制蛇头移动吃到红色食物后蛇身变长、得分增加。撞到墙壁或自身时游戏结束命令行会输出最终得分。6.4 代码拆解这个项目的核心是“游戏主循环”事件处理pygame.event.get()获取所有事件比如关闭窗口、按键。状态更新根据方向更新蛇头位置判断是否吃到食物、是否撞墙、是否撞到自己。画面绘制screen.fill()清屏pygame.draw.rect()绘制蛇和食物pygame.display.flip()更新画面。帧率控制clock.tick(FPS)把循环速度限制在每秒 10 帧。在 Python 游戏开发中主循环是绕不开的概念。理解它之后很多游戏框架都会更容易上手。6.5 判断成功与常见失败原因判断标准是窗口打开稳定蛇能持续移动方向控制正确食物被吃到后分数增加撞墙或撞自己后程序退出。常见失败原因按键方向反了检查方向向量。上方向是(0, -CELL_SIZE)下方向是(0, CELL_SIZE)左方向是(-CELL_SIZE, 0)右方向是(CELL_SIZE, 0)。蛇移动太快或太慢调整FPS值。窗口启动后黑屏没反应检查杀毒软件是否拦截窗口或尝试调整 pygame 版本。中文显示为方框这是字体问题。pygame.font.SysFont(simhei, 24)在 Windows 上一般能显示中文如果不行就换成pygame.font.Font(None, 24)使用默认字体或者直接改用英文Score: 0不影响游戏逻辑。6.6 扩展方向增加加速机制随着分数提高FPS跟随增加。增加障碍物在地图中间摆放静态矩形碰到就结束。增加暂停功能按空格键暂停和恢复。增加最高分记录把最高分写入本地文本文件每次启动时读取。增加游戏结束界面在窗口内显示“游戏结束”而不是只在命令行显示分数。下面是一个写入最高分的简单示例def save_high_score(score, filenamehigh_score.txt): try: with open(filename, r) as f: high int(f.read().strip()) except (FileNotFoundError, ValueError): high 0 if score high: with open(filename, w) as f: f.write(str(score)) print(新纪录) else: print(f最高分{high})7. 接口 API 与批量任务讨论严格来说这三个小游戏项目本身不提供对外 API也不涉及批量任务。但这里想单独开一节目的是帮你理清“游戏项目”和“服务化项目”的关系。如果你的目标是做真正的后端服务、数据分析平台或者自动化工具那你最终要用到的技能是“写一个函数接收输入返回结果”。这个能力在猜数字项目中已经有了雏形main()函数接收用户输入返回游戏结论在贪吃蛇中一个函数接收坐标列表和方向返回新的坐标列表。这些都是“接口思想”的雏形。为了让你把这种思想迁移到更通用的场景我可以给一个 FastAPI 的接口示例。这个示例不是游戏项目的一部分但它展示了“把逻辑封装成 API”之后别人如何通过 HTTP 请求调用你的功能# 这是一个独立的 FastAPI 示例需要先安装pip install fastapi uvicorn from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class GuessInput(BaseModel): guess: int target: int app.post(/check_guess) def check_guess(data: GuessInput): if data.guess data.target: return {result: smaller} elif data.guess data.target: return {result: bigger} else: return {result: correct} # 启动方式 # uvicorn main:app --host 127.0.0.1 --port 8000启动后用 curl 或 Python requests 调用curl -X POST http://127.0.0.1:8000/check_guess \ -H Content-Type: application/json \ -d {guess: 50, target: 37}返回{result:bigger}这个示例的意义在于告诉你游戏代码里的函数逻辑可以无缝迁移到 Web 服务里。如果你的目标是学习 Python 进阶先把“写函数”这一关练扎实后面对接 API、做自动化脚本都会顺畅很多。8. 资源占用与性能观察写游戏类 Python 项目时很多读者会关心资源占用。这里给你一个观察思路和通用经验不需要高端工具用系统自带的任务管理器就能完成。8.1 如何观察 CPU 和内存占用在 Windows 上按Ctrl Shift Esc打开任务管理器找到对应的python.exe进程可以看到 CPU 和内存占用。在 macOS 上打开“活动监视器”同样能找到 Python 进程。三个项目里的资源占用大致是猜数字占用极低几乎可以忽略因为程序 90% 的时间在等待用户输入。turtle 小游戏窗口开启后占用很低主要消耗集中在图形绘制事件。pygame 贪吃蛇FPS 设置为 10 时占用很低如果把 FPS 调高到 60 或 120CPU 占用会上升因为主循环刷新频率变快了。需要注意的是这些项目的开销和 GPU 无关不需要显卡。也不需要 CUDA、CUDNN 等深度学习依赖。8.2 影响性能的关键变量窗口大小贪吃蛇窗口越大每次绘制要填充的像素就越多CPU 占用会上升。FPS 值刷新率越高主循环执行越频繁。蛇身长度蛇身越长循环绘制每个线段的时间越长但在这个量级下压力仍然很小。食物随机生成逻辑如果地图很大random_food()可能随机很多次才找到空位。8.3 如何降低资源占用降低 FPS 到 5-10适合教学演示。缩小窗口尺寸例如WIDTH, HEIGHT 400, 400。在绘制时先清屏再绘制不要使用透明背景。如果本机同时运行多个 Python 进程注意逐个关闭再启动新的测试。8.4 端口冲突与进程残留游戏项目本身不占用端口但如果你后续使用 FastAPI 或 Flask 做接口服务会碰到端口占用问题。常见的解决方法是换端口uvicorn main:app --host 127.0.0.1 --port 8001如果 8000 端口被占用换成 8001 或 8080。遇到顽固进程时可以强制结束Windows 下在 PowerShell 中结束 Python 进程Get-Process python | Stop-Process -ForcemacOS / Linux 下使用pkill -f python注意这条命令会杀光当前所有 Python 进程使用前先保存好自己的代码和任务。9. 常见问题与排查方法把新手最容易遇到的一批问题整理成表格。代码能跑通但结果不符合预期时通常都能在里面找到方向。问题现象可能原因排查方式解决方案运行python提示找不到命令Python 未安装或未配置环境变量检查终端输入python --version重新安装并勾选 Add Python to PATH代码中中文显示乱码文件编码格式不对检查代码文件编码在文件开头加# -*- coding: utf-8 -*-或使用 UTF-8 编码保存turtle 窗口闪退代码末尾缺少turtle.done()检查代码最后一行在末尾添加turtle.done()它会让窗口保持打开pygame 窗口闪退主循环没有持续运行或代码提前退出检查 while 循环是否缺少pygame.display.flip()确保while True循环中包含事件处理和画面更新导入 pygame 报 ModuleNotFoundErrorpygame 未安装或装到了不同的 Python 环境执行 pip listfindstr pygame按方向键没反应事件绑定写法不对或窗口没有焦点检查screen.listen()是否被调用确保先调用screen.listen()再绑定onkey蛇可以反向穿越自己方向翻转判断不完整检查方向互斥条件当前方向为右时不能直接按左需要像代码示例那样用if direction ! (-CELL_SIZE, 0)判断游戏运行后 CPU 占用 100%FPS 设置过高或主循环里没有休眠检查clock.tick(FPS)是否存在添加clock.tick(FPS)把 FPS 控制在合理范围打包成 exe 后杀毒软件报毒PyInstaller 临时释放机制容易触发误报确认代码无恶意行为不要随意下载未知来源的构建工具打包时使用可信 PyInstaller 版本发布给他人前建议说明代码内容另外如果安装了新版 Python比如 3.13turtle 报错或行为异常可以暂时切换到 3.12 版本。这不是 bug而是模块维护状态的问题。10. 最佳实践与使用建议到这里你已经能在本地跑通三个 Python 游戏项目。接下来我按自己的经验给你几条建议能帮你避免后期踩坑。10.1 先小参数测试每次改动代码后先跑一个最小用例。比如猜数字游戏先手动输入一次错误答案和一次正确答案验证逻辑是否正常。不要一上来就改几十个参数否则出问题很难定位。10.2 保留最小可运行版本很多新手喜欢把代码越写越长结果改坏了之后回不到能运行的状态。建议每次修改前复制一份独立文件例如snake_game_v1.py、snake_game_v2.py。这不丢人——正式项目里这叫版本管理新手阶段先养成备份习惯最重要。10.3 模型文件和素材分目录管理虽然这三个项目不需要外部模型但一旦你开始扩展音效、图片、字体就要遵循目录规范snake_game/ ├── game.py ├── assets/ │ ├── images/ │ ├── sounds/ │ └── fonts/ └── high_score.txt这样能避免代码和素材混在一起也方便后续打包。10.4 日志和可读性游戏项目规模小但建议从一开始就保留简单日志。例如记录每次启动时间、最终得分。这个习惯在以后做爬虫、后端、自动化脚本时非常有用。10.5 接口服务要限制访问范围如果你参考第 7 节把游戏逻辑封装成 FastAPI 接口本地调试时建议绑定127.0.0.1不要默认暴露到局域网或公网。配置端口后用管理员权限运行防火墙命令时也要谨慎避免开放不必要的端口。10.6 合规使用素材与代码如果你想用网络上的图片、音效、字体请确认授权方式。pygame 项目用到的素材如果是付费资源或网图都不建议直接商用。引用别人的代码时保留原作者的版权注释。10.7 发布前做效果复核如果你想把游戏打包后发给朋友玩先在本机完整玩一遍确认退出逻辑正常、分数保存正常、没有意外闪退。如果有代码杀软误报可以写清楚源码和运行环境。11. 总结与下一步这篇文章从“用游戏提升 Python 兴趣”的角度给出了三个可直接运行的代码项目命令行猜数字、turtle 键盘控制、pygame 贪吃蛇。它们覆盖了 Python 入门最重要的几个语法点——变量、循环、条件、函数、随机数、事件监听、主循环同时又不需要 GPU 和高配置环境适合绝大多数新手直接上手。最值得先跑的是猜数字它只需要几行代码就能让你体验“编写程序、运行程序、程序响应输入”的完整流程。最容易踩坑的是 pygame 安装和环境变量配置遇到问题先看第 9 节排查表。贪吃蛇项目是最适合扩展的你可以按自己的想法加食物、加速、保存最高分这些改动都会直接喂给你更多 Python 技能。如果这三个项目都跑通了下一步可以考虑这四件事用tkinter给猜数字做一个简单图形界面练习按钮和输入框控件。把贪吃蛇的逻辑改写成“智能蛇”让蛇自动找食物这涉及简单的搜索算法。用requests和BeautifulSoup做一个爬虫项目把游戏分数提交到本地 Web 服务体验网络请求。学习 FastAPI 或 Flask把第 7 节的接口示例扩展成完整的 Web 项目。游戏只是入口Python 真正广阔的方向在数据分析、自动化、Web 开发和人工智能。但无论选哪条路先把“代码能跑、结果可控、问题可查”这三件事练成习惯后面的路会顺很多。建议收藏这篇文章备用下次上手新项目时可以拿着排查表直接对照。