当前位置: 首页 > news >正文

第13篇:综合实战——制作我的小游戏 python中文编程

作者:中文编程倡导者—— 李金雨
联系方式:wbtm2718@qq.com
系列:python中文编程入门教程
** 核心理念: AI时代必须使用中文编程,母语编程阅读效率极高"

第13篇:综合实战——制作我的小游戏

开篇引入

本课目标

  • 综合运用之前所学的所有知识
  • 学习如何设计和实现一个完整的游戏
  • 掌握游戏开发的基本流程
  • 学会如何组织大型项目的代码结构
  • 理解数据持久化在游戏中的应用

生活场景引入

同学们,你们一定玩过各种游戏,比如冒险游戏、角色扮演游戏、策略游戏等。这些游戏背后都有复杂的代码逻辑。今天,我们将运用之前所学的Python知识,制作一个属于自己的小游戏。

通过这个项目,你将学会如何将零散的知识整合起来,如何设计游戏的结构,如何实现游戏的核心功能,以及如何让游戏更加有趣和完善。

预期成果展示

在本课结束时,你将能够:

  • 设计并实现一个完整的文字冒险游戏
  • 理解游戏开发的基本流程
  • 掌握如何组织大型项目的代码结构
  • 实现游戏的存档和读档功能
  • 运用面向对象编程思想设计游戏

项目选择

我们将制作一个文字冒险游戏,具有以下功能:

  • 玩家输入名字开始游戏
  • 多个场景选择(森林、城堡、洞穴)
  • 遇到不同事件(战斗、宝藏、陷阱)
  • 生命值和金币系统
  • 存档读档功能

项目开发流程

  1. 需求分析:确定游戏的功能和玩法
  2. 设计数据结构:设计游戏中需要的数据结构
  3. 设计功能模块:将游戏分解为多个功能模块
  4. 设计模板和实例:使用面向对象编程设计游戏元素
  5. 逐步实现:先实现核心功能,再逐步完善
  6. 测试调试:测试游戏功能,修复bug
  7. 数据持久化:实现存档和读档功能
  8. 优化完善:添加细节,提升游戏体验

代码实现

1. 项目结构

文字冒险游戏/ ├── main.py # 游戏入口 ├── 游戏引擎.py # 游戏核心逻辑 ├── 场景.py # 场景类 ├── 玩家.py # 玩家类 ├── 存档.py # 存档功能 └── 数据/ # 存储存档文件的目录

2. 玩家类(玩家.py)

"""玩家类"""class玩家:"""玩家模板"""def__init__(self,姓名,生命值=100,金币=0):"""初始构造功能"""self.姓名=姓名 self.生命值=生命值 self.金币=金币 self.物品=[]def获得物品(self,物品名称):"""获得物品"""self.物品.append(物品名称)print(f"你获得了{物品名称}!")def失去物品(self,物品名称):"""失去物品"""if物品名称inself.物品:self.物品.remove(物品名称)print(f"你失去了{物品名称}!")else:print(f"你没有{物品名称}!")def获得金币(self,数量):"""获得金币"""self.金币+=数量print(f"你获得了{数量}金币!")def失去金币(self,数量):"""失去金币"""ifself.金币>=数量:self.金币-=数量print(f"你失去了{数量}金币!")returnTrueelse:print("你的金币不足!")returnFalsedef受伤(self,伤害值):"""受伤"""self.生命值=max(0,self.生命值-伤害值)print(f"你受到了{伤害值}点伤害!当前生命值:{self.生命值}")ifself.生命值==0:print("你死了!游戏结束!")returnTruereturnFalsedef治疗(self,恢复值):"""治疗"""self.生命值=min(100,self.生命值+恢复值)print(f"你恢复了{恢复值}点生命值!当前生命值:{self.生命值}")def显示状态(self):"""显示状态"""print(f"\n{self.姓名}的状态:")print(f"生命值:{self.生命值}")print(f"金币:{self.金币}")print(f"物品:{self.物品ifself.物品else'无'}")print()

3. 场景类(场景.py)

"""场景类"""importrandomclass场景:"""场景模板"""def__init__(self,名称,描述):"""初始构造功能"""self.名称=名称 self.描述=描述def进入场景(self,玩家):"""进入场景"""print(f"\n{self.名称}")print(self.描述)self.处理事件(玩家)def处理事件(self,玩家):"""处理场景事件"""passclass森林场景(场景):"""森林场景"""def__init__(self):"""初始构造功能"""super().__init__("森林","你走进了一片茂密的森林,阳光透过树叶洒在地上,周围传来各种动物的叫声。")def处理事件(self,玩家):"""处理森林事件"""事件=random.choice(["战斗","宝藏","陷阱","平静"])if事件=="战斗":print("突然,一只狼从灌木丛中跳了出来!")选择=input("你要:1. 战斗 2. 逃跑:")if选择=="1":伤害=random.randint(10,30)玩家.受伤(伤害)if玩家.生命值>0:玩家.获得金币(20)print("你成功击败了狼!")else:伤害=random.randint(5,15)玩家.受伤(伤害)print("你成功逃跑了,但受了点伤。")elif事件=="宝藏":金币=random.randint(10,50)玩家.获得金币(金币)物品=random.choice(["治疗药水","魔法卷轴","锋利的剑"])玩家.获得物品(物品)print("你发现了一个宝箱!")elif事件=="陷阱":伤害=random.randint(15,25)玩家.受伤(伤害)print("你踩到了陷阱!")else:print("你平静地穿过了森林。")class城堡场景(场景):"""城堡场景"""def__init__(self):"""初始构造功能"""super().__init__("城堡","你来到了一座古老的城堡,城堡的大门紧闭,周围有护城河环绕。")def处理事件(self,玩家):"""处理城堡事件"""事件=random.choice(["守卫","宝藏","陷阱","平静"])if事件=="守卫":print("城堡门口有一个守卫。")选择=input("你要:1. 贿赂 2. 战斗 3. 离开:")if选择=="1":if玩家.失去金币(50):玩家.获得物品("城堡钥匙")print("守卫收下了金币,给了你一把城堡钥匙。")elif选择=="2":伤害=random.randint(20,40)玩家.受伤(伤害)if玩家.生命值>0:玩家.获得金币(30)玩家.获得物品("城堡钥匙")print("你击败了守卫,获得了城堡钥匙!")else:print("你离开了城堡。")elif事件=="宝藏":if"城堡钥匙"in玩家.物品:金币=random.randint(50,100)玩家.获得金币(金币)物品=random.choice(["治疗药水","魔法卷轴","锋利的剑","魔法盾牌"])玩家.获得物品(物品)print("你用钥匙打开了城堡的大门,发现了一个巨大的宝藏!")玩家.失去物品("城堡钥匙")else:print("城堡的大门锁着,你需要一把钥匙。")elif事件=="陷阱":伤害=random.randint(20,30)玩家.受伤(伤害)print("你触发了城堡周围的陷阱!")else:print("你在城堡周围转了转,没有发现什么特别的东西。")class洞穴场景(场景):"""洞穴场景"""def__init__(self):"""初始构造功能"""super().__init__("洞穴","你进入了一个黑暗的洞穴,四周一片漆黑,只有微弱的光线从洞口透进来。")def处理事件(self,玩家):"""处理洞穴事件"""事件=random.choice(["怪物","宝藏","陷阱","平静"])if事件=="怪物":print("洞穴深处传来低沉的咆哮声,一个巨大的怪物出现了!")选择=input("你要:1. 战斗 2. 逃跑:")if选择=="1":伤害=random.randint(25,45)玩家.受伤(伤害)if玩家.生命值>0:玩家.获得金币(50)物品=random.choice(["治疗药水","魔法卷轴","锋利的剑","魔法盾牌","魔法头盔"])玩家.获得物品(物品)print("你成功击败了怪物!")else:伤害=random.randint(10,20)玩家.受伤(伤害)print("你成功逃跑了,但受了点伤。")elif事件=="宝藏":金币=random.randint(30,80)玩家.获得金币(金币)物品=random.choice(["治疗药水","魔法卷轴","锋利的剑","魔法盾牌"])玩家.获得物品(物品)print("你在洞穴深处发现了一个宝藏!")elif事件=="陷阱":伤害=random.randint(20,35)玩家.受伤(伤害)print("你踩到了洞穴里的陷阱!")else:print("你在洞穴里探索了一番,没有发现什么特别的东西。")

4. 存档功能(存档.py)

"""存档功能"""importjsonimportosclass存档管理:"""存档管理类"""def__init__(self,存档目录="数据"):"""初始构造功能"""self.存档目录=存档目录 os.makedirs(self.存档目录,exist_ok=True)def保存游戏(self,玩家,存档名称="save.json"):"""保存游戏"""存档路径=os.path.join(self.存档目录,存档名称)玩家数据={"姓名":玩家.姓名,"生命值":玩家.生命值,"金币":玩家.金币,"物品":玩家.物品}withopen(存档路径,"w",encoding="utf-8")as文件:json.dump(玩家数据,文件,ensure_ascii=False,indent=2)print(f"游戏已保存到{存档路径}!")def加载游戏(self,存档名称="save.json"):"""加载游戏"""存档路径=os.path.join(self.存档目录,存档名称)ifos.path.exists(存档路径):withopen(存档路径,"r",encoding="utf-8")as文件:玩家数据=json.load(文件)from玩家import玩家 玩家实例=玩家(玩家数据["姓名"],玩家数据["生命值"],玩家数据["金币"])玩家实例.物品=玩家数据["物品"]print(f"游戏已从{存档路径}加载!")return玩家实例else:print(f"存档文件{存档路径}不存在!")returnNone

5. 游戏引擎(游戏引擎.py)

"""游戏引擎"""from玩家import玩家from场景import森林场景,城堡场景,洞穴场景from存档import存档管理class游戏引擎:"""游戏引擎类"""def__init__(self):"""初始构造功能"""self.玩家=Noneself.场景={"森林":森林场景(),"城堡":城堡场景(),"洞穴":洞穴场景()}self.存档管理=存档管理()def开始游戏(self):"""开始游戏"""print("欢迎来到文字冒险游戏!")print("========================")选择=input("1. 新游戏 2. 加载游戏:")if选择=="1":姓名=input("请输入你的名字:")self.玩家=玩家(姓名)elif选择=="2":self.玩家=self.存档管理.加载游戏()ifnotself.玩家:姓名=input("请输入你的名字:")self.玩家=玩家(姓名)else:姓名=input("请输入你的名字:")self.玩家=玩家(姓名)self.游戏主循环()def游戏主循环(self):"""游戏主循环"""whileTrue:self.玩家.显示状态()print("你可以去以下地方:")fori,场景名称inenumerate(self.场景.keys(),1):print(f"{i}.{场景名称}")print("4. 保存游戏")print("5. 退出游戏")选择=input("请输入你的选择:")if选择=="1":self.场景["森林"].进入场景(self.玩家)elif选择=="2":self.场景["城堡"].进入场景(self.玩家)elif选择=="3":self.场景["洞穴"].进入场景(self.玩家)elif选择=="4":self.存档管理.保存游戏(self.玩家)elif选择=="5":print("谢谢游玩,再见!")breakelse:print("输入错误,请重新输入!")# 检查玩家是否死亡ifself.玩家.生命值==0:print("游戏结束!")break

6. 主程序(main.py)

"""游戏入口"""from游戏引擎import游戏引擎if__name__=="__main__":游戏=游戏引擎()游戏.开始游戏()

项目要求

  1. 必须使用模板(类)来组织代码:使用面向对象编程思想设计游戏
  2. 必须使用初始构造功能(init):初始化游戏对象
  3. 数据必须保存到文件(实现存档功能):使用JSON格式保存游戏进度
  4. 代码必须分模块组织(至少2个.py文件):按照功能将代码分为多个模块
  5. 所有类名、方法名、变量名必须使用中文:严格按照全中文编程规范

项目开发流程

1. 需求分析

首先,我们需要明确游戏的功能和玩法:

  • 玩家输入名字开始游戏
  • 多个场景选择(森林、城堡、洞穴)
  • 遇到不同事件(战斗、宝藏、陷阱)
  • 生命值和金币系统
  • 存档读档功能

2. 设计数据结构

根据需求,我们需要设计以下数据结构:

  • 玩家:包含姓名、生命值、金币、物品
  • 场景:包含名称、描述、事件处理
  • 存档:保存玩家的状态

3. 设计功能模块

将游戏分解为以下功能模块:

  • 玩家模块:处理玩家的状态和行为
  • 场景模块:处理不同场景的事件
  • 存档模块:处理游戏的存档和读档
  • 游戏引擎模块:控制游戏的流程

4. 设计模板和实例

使用面向对象编程设计游戏元素:

  • 玩家类:表示玩家角色
  • 场景类:表示游戏场景
  • 存档管理类:处理存档功能
  • 游戏引擎类:控制游戏流程

5. 逐步实现

先实现核心功能,再逐步完善:

  • 首先实现玩家类和场景类
  • 然后实现游戏引擎和存档功能
  • 最后添加细节和优化

6. 测试调试

测试游戏功能,修复bug:

  • 测试游戏的基本流程
  • 测试存档和读档功能
  • 测试各种事件的处理
  • 修复发现的bug

7. 数据持久化

实现存档和读档功能:

  • 使用JSON格式保存游戏数据
  • 实现保存和加载游戏的功能

8. 优化完善

添加细节,提升游戏体验:

  • 添加更多的事件和场景
  • 增加物品的效果
  • 优化游戏的交互体验

动手实践

现在,让我们按照上述步骤来实现这个文字冒险游戏。

步骤1:创建项目目录结构

首先,创建项目的目录结构,包括主程序和各个模块文件。

步骤2:实现玩家类

实现玩家类,包含玩家的基本属性和方法。

步骤3:实现场景类

实现场景类,包括森林、城堡、洞穴三个场景,每个场景有不同的事件。

步骤4:实现存档功能

实现存档管理类,用于保存和加载游戏数据。

步骤5:实现游戏引擎

实现游戏引擎类,控制游戏的流程和逻辑。

步骤6:实现主程序

实现主程序,作为游戏的入口。

步骤7:测试游戏

运行游戏,测试各个功能是否正常。

知识总结

核心概念回顾

  • 面向对象编程:使用类和对象来组织代码
  • 模块和包:将代码分为多个模块,提高代码的可维护性
  • 文件操作:使用文件操作实现数据持久化
  • 条件判断:使用条件语句处理游戏中的选择
  • 循环:使用循环实现游戏的主循环
  • 随机事件:使用随机函数生成游戏中的随机事件

关键代码速查

功能代码说明
定义类class 类名:定义一个类
初始化方法def __init__(self, 参数):初始化对象的属性
保存JSONjson.dump(数据, 文件)将数据保存为JSON格式
读取JSONjson.load(文件)从JSON文件读取数据
随机选择random.choice(列表)从列表中随机选择一个元素
主循环while True:游戏的主循环
条件判断if 条件:处理游戏中的选择

常见错误提醒

  1. 模块导入错误:确保模块的导入路径正确
  2. 文件路径错误:确保文件路径的正确性
  3. JSON格式错误:确保保存和加载的JSON格式正确
  4. 逻辑错误:确保游戏逻辑的正确性
  5. 异常处理:添加适当的异常处理

课后作业

巩固练习题

  1. 为游戏添加更多的场景,比如沙漠、海洋、雪山等
  2. 为游戏添加更多的物品和道具,比如武器、防具、药水等

创意编程题

  1. 扩展游戏功能,添加任务系统和成就系统
  2. 改进游戏的战斗系统,添加更多的战斗选项和敌人类型

总结

通过本项目,你已经学会了如何综合运用Python的各种知识来制作一个完整的游戏。你学习了如何设计游戏的结构,如何实现游戏的核心功能,以及如何让游戏更加有趣和完善。

希望你在今后的学习中,能够继续探索Python的更多可能性,创造出更多有趣的项目!

学习交流

如果你在学习过程中遇到任何问题,欢迎联系我:

  • ** 视频号,“时空系”
  • 邮箱:wbtm2718@qq.com
  • 其他提示:
  • 本人正在开发纯中文编程语言和编译器,有兴趣的可以交流
  • 本人正在写一本基于中国母语思维习惯的数学教材,可以让你一年内学完从初中到研究生的数学,而且可以让你快速掌握人工智能的关键数学知识,有兴趣的可以交流

祝你学习愉快!

http://www.cnnetsun.cn/news/2166899.html

相关文章:

  • 基于Next.js与Chakra UI的ChatGPT类AI应用前端模板开发指南
  • PyTorch DDP训练实战:从单卡脚本到多卡启动的完整避坑记录(含launch/spawn两种方式)
  • 保姆级教程:手把手教你用R语言和CIBERSORT分析肿瘤免疫浸润(附完整代码与避坑指南)
  • 50 小时算力券直送,AMD AI 开发者计划重磅来袭!
  • 网络安全零基础入门教程,全程超详细,看完一篇直接精通
  • 中星微星光五号:算力中心建设的理想国产芯片
  • 收藏!2026 年程序员彻底破防:大模型已颠覆行业,再不转型就晚了
  • XUnity.AutoTranslator:5分钟搞定Unity游戏多语言实时翻译的终极指南
  • Uniapp+Vue3+Ts项目升级实战:解决App.vue中globalData无法导出的两种实用方案
  • 权威统计加冕!悬镜安全蝉联四年全国第一,AI 驱动软件供应链安全赛道狂飙
  • 别再只用EMD和VMD了!试试这个2023年刚出的信号分解新算法FMD(附Matlab代码)
  • PHP 9.0异步AI服务上线前必须通过的9项安全审计(含CVE-2025-XXXX漏洞绕过检测清单)
  • 提示工程实战:从模块化设计到工作流集成的AI高效对话指南
  • 高级PyQt6桌面应用开发:实战项目与性能优化指南
  • 使用curl命令直接测试Taotoken的OpenAI兼容接口连通性
  • 火旺电报|微软OpenAI关系调整 Meta并购受阻 懂游宝并购 阿里医疗AI落地 iphone折叠屏动向
  • ComfyUI-Manager完整指南:三步掌握节点管理终极技巧
  • Go语言机器人框架golembot:模块化设计与事件驱动架构实践
  • 免费AMD Ryzen调试工具:如何用SMUDebugTool轻松优化你的硬件性能
  • 别再被行尾符搞懵了!手把手教你用 `git config core.autocrlf input` 搞定跨平台协作
  • 手把手调试GDDR6:从Power-On到Training的完整初始化流程与实战排错
  • ChatGPT微调实战:从LoRA、RLHF到DPO的完整技术解析
  • 从AddVectoredExceptionHandler被封到InstrumentationCallback:一次完整的Windows异常处理机制避坑指南
  • 初创团队如何借助 Taotoken 按 token 计费模式低成本验证 AI 产品创意
  • 免费解锁加密音乐:Unlock-Music 终极使用指南
  • Vue3项目实战:用KLineCharts库5分钟搞定一个可切换周期的K线图组件
  • 树莓派摄像头从吃灰到真香:手把手搭建一个简易家庭监控系统(含rpicam-vid录制与VLC播放)
  • 从‘拍电影’到‘做游戏’:手把手教你用UE5关卡蓝图实现摄像机平滑切换与镜头混合
  • 如何用Sunshine开源游戏串流服务器构建家庭游戏云:完整技术指南
  • LLM网页内容智能修剪与检索优化技术解析