作者: 中文编程倡导者------ 李金雨
联系方式: wbtm2718@qq.com
系列: python中文编程入门教程** 核心理念: AI时代必须使用中文编程,母语编程阅读效率极高"
第13篇:综合实战------制作我的小游戏
开篇引入
本课目标
- 综合运用之前所学的所有知识
- 学习如何设计和实现一个完整的游戏
- 掌握游戏开发的基本流程
- 学会如何组织大型项目的代码结构
- 理解数据持久化在游戏中的应用
生活场景引入
同学们,你们一定玩过各种游戏,比如冒险游戏、角色扮演游戏、策略游戏等。这些游戏背后都有复杂的代码逻辑。今天,我们将运用之前所学的Python知识,制作一个属于自己的小游戏。
通过这个项目,你将学会如何将零散的知识整合起来,如何设计游戏的结构,如何实现游戏的核心功能,以及如何让游戏更加有趣和完善。
预期成果展示
在本课结束时,你将能够:
- 设计并实现一个完整的文字冒险游戏
- 理解游戏开发的基本流程
- 掌握如何组织大型项目的代码结构
- 实现游戏的存档和读档功能
- 运用面向对象编程思想设计游戏
项目选择
我们将制作一个文字冒险游戏,具有以下功能:
- 玩家输入名字开始游戏
- 多个场景选择(森林、城堡、洞穴)
- 遇到不同事件(战斗、宝藏、陷阱)
- 生命值和金币系统
- 存档读档功能
项目开发流程
- 需求分析:确定游戏的功能和玩法
- 设计数据结构:设计游戏中需要的数据结构
- 设计功能模块:将游戏分解为多个功能模块
- 设计模板和实例:使用面向对象编程设计游戏元素
- 逐步实现:先实现核心功能,再逐步完善
- 测试调试:测试游戏功能,修复bug
- 数据持久化:实现存档和读档功能
- 优化完善:添加细节,提升游戏体验
代码实现
1. 项目结构
文字冒险游戏/
├── main.py # 游戏入口
├── 游戏引擎.py # 游戏核心逻辑
├── 场景.py # 场景类
├── 玩家.py # 玩家类
├── 存档.py # 存档功能
└── 数据/ # 存储存档文件的目录
2. 玩家类(玩家.py)
python
"""玩家类"""
class 玩家:
"""玩家模板"""
def __init__(self, 姓名, 生命值=100, 金币=0):
"""初始构造功能"""
self.姓名 = 姓名
self.生命值 = 生命值
self.金币 = 金币
self.物品 = []
def 获得物品(self, 物品名称):
"""获得物品"""
self.物品.append(物品名称)
print(f"你获得了{物品名称}!")
def 失去物品(self, 物品名称):
"""失去物品"""
if 物品名称 in self.物品:
self.物品.remove(物品名称)
print(f"你失去了{物品名称}!")
else:
print(f"你没有{物品名称}!")
def 获得金币(self, 数量):
"""获得金币"""
self.金币 += 数量
print(f"你获得了{数量}金币!")
def 失去金币(self, 数量):
"""失去金币"""
if self.金币 >= 数量:
self.金币 -= 数量
print(f"你失去了{数量}金币!")
return True
else:
print("你的金币不足!")
return False
def 受伤(self, 伤害值):
"""受伤"""
self.生命值 = max(0, self.生命值 - 伤害值)
print(f"你受到了{伤害值}点伤害!当前生命值:{self.生命值}")
if self.生命值 == 0:
print("你死了!游戏结束!")
return True
return False
def 治疗(self, 恢复值):
"""治疗"""
self.生命值 = min(100, self.生命值 + 恢复值)
print(f"你恢复了{恢复值}点生命值!当前生命值:{self.生命值}")
def 显示状态(self):
"""显示状态"""
print(f"\n{self.姓名}的状态:")
print(f"生命值:{self.生命值}")
print(f"金币:{self.金币}")
print(f"物品:{self.物品 if self.物品 else '无'}")
print()
3. 场景类(场景.py)
python
"""场景类"""
import random
class 场景:
"""场景模板"""
def __init__(self, 名称, 描述):
"""初始构造功能"""
self.名称 = 名称
self.描述 = 描述
def 进入场景(self, 玩家):
"""进入场景"""
print(f"\n{self.名称}")
print(self.描述)
self.处理事件(玩家)
def 处理事件(self, 玩家):
"""处理场景事件"""
pass
class 森林场景(场景):
"""森林场景"""
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)
python
"""存档功能"""
import json
import os
class 存档管理:
"""存档管理类"""
def __init__(self, 存档目录="数据"):
"""初始构造功能"""
self.存档目录 = 存档目录
os.makedirs(self.存档目录, exist_ok=True)
def 保存游戏(self, 玩家, 存档名称="save.json"):
"""保存游戏"""
存档路径 = os.path.join(self.存档目录, 存档名称)
玩家数据 = {
"姓名": 玩家.姓名,
"生命值": 玩家.生命值,
"金币": 玩家.金币,
"物品": 玩家.物品
}
with open(存档路径, "w", encoding="utf-8") as 文件:
json.dump(玩家数据, 文件, ensure_ascii=False, indent=2)
print(f"游戏已保存到{存档路径}!")
def 加载游戏(self, 存档名称="save.json"):
"""加载游戏"""
存档路径 = os.path.join(self.存档目录, 存档名称)
if os.path.exists(存档路径):
with open(存档路径, "r", encoding="utf-8") as 文件:
玩家数据 = json.load(文件)
from 玩家 import 玩家
玩家实例 = 玩家(
玩家数据["姓名"],
玩家数据["生命值"],
玩家数据["金币"]
)
玩家实例.物品 = 玩家数据["物品"]
print(f"游戏已从{存档路径}加载!")
return 玩家实例
else:
print(f"存档文件{存档路径}不存在!")
return None
5. 游戏引擎(游戏引擎.py)
python
"""游戏引擎"""
from 玩家 import 玩家
from 场景 import 森林场景, 城堡场景, 洞穴场景
from 存档 import 存档管理
class 游戏引擎:
"""游戏引擎类"""
def __init__(self):
"""初始构造功能"""
self.玩家 = None
self.场景 = {
"森林": 森林场景(),
"城堡": 城堡场景(),
"洞穴": 洞穴场景()
}
self.存档管理 = 存档管理()
def 开始游戏(self):
"""开始游戏"""
print("欢迎来到文字冒险游戏!")
print("========================")
选择 = input("1. 新游戏 2. 加载游戏:")
if 选择 == "1":
姓名 = input("请输入你的名字:")
self.玩家 = 玩家(姓名)
elif 选择 == "2":
self.玩家 = self.存档管理.加载游戏()
if not self.玩家:
姓名 = input("请输入你的名字:")
self.玩家 = 玩家(姓名)
else:
姓名 = input("请输入你的名字:")
self.玩家 = 玩家(姓名)
self.游戏主循环()
def 游戏主循环(self):
"""游戏主循环"""
while True:
self.玩家.显示状态()
print("你可以去以下地方:")
for i, 场景名称 in enumerate(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("谢谢游玩,再见!")
break
else:
print("输入错误,请重新输入!")
# 检查玩家是否死亡
if self.玩家.生命值 == 0:
print("游戏结束!")
break
6. 主程序(main.py)
python
"""游戏入口"""
from 游戏引擎 import 游戏引擎
if __name__ == "__main__":
游戏 = 游戏引擎()
游戏.开始游戏()
项目要求
- 必须使用模板(类)来组织代码:使用面向对象编程思想设计游戏
- 必须使用初始构造功能( init):初始化游戏对象
- 数据必须保存到文件(实现存档功能):使用JSON格式保存游戏进度
- 代码必须分模块组织(至少2个.py文件):按照功能将代码分为多个模块
- 所有类名、方法名、变量名必须使用中文:严格按照全中文编程规范
项目开发流程
1. 需求分析
首先,我们需要明确游戏的功能和玩法:
- 玩家输入名字开始游戏
- 多个场景选择(森林、城堡、洞穴)
- 遇到不同事件(战斗、宝藏、陷阱)
- 生命值和金币系统
- 存档读档功能
2. 设计数据结构
根据需求,我们需要设计以下数据结构:
- 玩家:包含姓名、生命值、金币、物品
- 场景:包含名称、描述、事件处理
- 存档:保存玩家的状态
3. 设计功能模块
将游戏分解为以下功能模块:
- 玩家模块:处理玩家的状态和行为
- 场景模块:处理不同场景的事件
- 存档模块:处理游戏的存档和读档
- 游戏引擎模块:控制游戏的流程
4. 设计模板和实例
使用面向对象编程设计游戏元素:
- 玩家类:表示玩家角色
- 场景类:表示游戏场景
- 存档管理类:处理存档功能
- 游戏引擎类:控制游戏流程
5. 逐步实现
先实现核心功能,再逐步完善:
- 首先实现玩家类和场景类
- 然后实现游戏引擎和存档功能
- 最后添加细节和优化
6. 测试调试
测试游戏功能,修复bug:
- 测试游戏的基本流程
- 测试存档和读档功能
- 测试各种事件的处理
- 修复发现的bug
7. 数据持久化
实现存档和读档功能:
- 使用JSON格式保存游戏数据
- 实现保存和加载游戏的功能
8. 优化完善
添加细节,提升游戏体验:
- 添加更多的事件和场景
- 增加物品的效果
- 优化游戏的交互体验
动手实践
现在,让我们按照上述步骤来实现这个文字冒险游戏。
步骤1:创建项目目录结构
首先,创建项目的目录结构,包括主程序和各个模块文件。
步骤2:实现玩家类
实现玩家类,包含玩家的基本属性和方法。
步骤3:实现场景类
实现场景类,包括森林、城堡、洞穴三个场景,每个场景有不同的事件。
步骤4:实现存档功能
实现存档管理类,用于保存和加载游戏数据。
步骤5:实现游戏引擎
实现游戏引擎类,控制游戏的流程和逻辑。
步骤6:实现主程序
实现主程序,作为游戏的入口。
步骤7:测试游戏
运行游戏,测试各个功能是否正常。
知识总结
核心概念回顾
- 面向对象编程:使用类和对象来组织代码
- 模块和包:将代码分为多个模块,提高代码的可维护性
- 文件操作:使用文件操作实现数据持久化
- 条件判断:使用条件语句处理游戏中的选择
- 循环:使用循环实现游戏的主循环
- 随机事件:使用随机函数生成游戏中的随机事件
关键代码速查
| 功能 | 代码 | 说明 |
|---|---|---|
| 定义类 | class 类名: |
定义一个类 |
| 初始化方法 | def __init__(self, 参数): |
初始化对象的属性 |
| 保存JSON | json.dump(数据, 文件) |
将数据保存为JSON格式 |
| 读取JSON | json.load(文件) |
从JSON文件读取数据 |
| 随机选择 | random.choice(列表) |
从列表中随机选择一个元素 |
| 主循环 | while True: |
游戏的主循环 |
| 条件判断 | if 条件: |
处理游戏中的选择 |
常见错误提醒
- 模块导入错误:确保模块的导入路径正确
- 文件路径错误:确保文件路径的正确性
- JSON格式错误:确保保存和加载的JSON格式正确
- 逻辑错误:确保游戏逻辑的正确性
- 异常处理:添加适当的异常处理
课后作业
巩固练习题
- 为游戏添加更多的场景,比如沙漠、海洋、雪山等
- 为游戏添加更多的物品和道具,比如武器、防具、药水等
创意编程题
- 扩展游戏功能,添加任务系统和成就系统
- 改进游戏的战斗系统,添加更多的战斗选项和敌人类型
总结
通过本项目,你已经学会了如何综合运用Python的各种知识来制作一个完整的游戏。你学习了如何设计游戏的结构,如何实现游戏的核心功能,以及如何让游戏更加有趣和完善。
希望你在今后的学习中,能够继续探索Python的更多可能性,创造出更多有趣的项目!
学习交流
如果你在学习过程中遇到任何问题,欢迎联系我:
- ** 视频号,"时空系"
- 邮箱: wbtm2718@qq.com
- 其他提示:
- 本人正在开发纯中文编程语言和编译器,有兴趣的可以交流
- 本人正在写一本基于中国母语思维习惯的数学教材,可以让你一年内学完从初中到研究生的数学,而且可以让你快速掌握人工智能的关键数学知识,有兴趣的可以交流
祝你学习愉快!