不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。
python系列之综合案例2
python系列前期章节
- python系列之注释与变量
- python系列之输入输出语句与数据类型
- python系列之运算符
- python系列之控制流程语句
- python系列之字符串
- python系列之列表
- python系列之元组
- python系列之字典
- python系列之集合
- python系列之函数基础
- python系列之函数进阶
- python系统之综合案例:用python打造智能诗词生成助手
导语:为什么选择游戏作为Python项目?
在上一章中,咱们利用python打造了一个智能诗词生成助手,通过函数、用户交互为驱动来进行巩固前面所学的知识。而为了能更好的学以致用,举一反三的效果,本章将继续开发一个小项目,本项目是以游戏的形式作为驱动。
一、项目背景
文字冒险游戏天然适合变量、分支逻辑、函数交互等语法练习,且通过剧情驱动能让枯燥的代码变得生动。本文将以一个魔法学院入学考试为主题,逐步实现包含谜题、战斗、商店系统的游戏,覆盖Python核心语法,代码注释率超50%,零基础也能轻松上手!
二、项目亮点与知识点映射(需求分析)
游戏功能 | 对应的Python语法 |
---|---|
角色属性管理 | 变量、字典、数值运算 |
剧情分支选择 | 输入输出、if-else/while控制流程 |
商店交易系统 | 函数封装、参数传递 |
随机谜题生成 | 列表、随机数模块、lambda高阶函数 |
战斗回合制逻辑 (自行扩展) | 循环嵌套、函数返回值处理 |
三、功能实现
1. 游戏初始化:变量与数据结构
# 1. 游戏初始化:变量与数据结构
# -*- coding: utf-8 -*-
import random
# 玩家属性字典(变量与复合数据类型)
player = {
"name": "", # 通过输入赋值
"hp": 100, # 生命值
"coins": 50, # 金币(用于商店)
"wand": None, # 魔杖类型(影响战斗)
"flag": False # 入学状态,默认未入学
}
# 游戏商店物品(列表嵌套字典)
shop_items = [
{"name": "火焰魔杖", "price": 30, "attack": 15},
{"name": "冰霜魔杖", "price": 40, "defense": 10},
{"name": "生命药水", "price": 20, "hp": 30}
]
# 随机谜题库(使用lambda实现动态生成)
puzzles = [
{
# random.randint() 方法返回指定范围内的整数,这里取1-10,边界包含关系
"question": lambda: f"{random.randint(1, 10)} + {random.randint(1, 10)} = ?",
# 技术加法
"answer": lambda x, y: x + y
}
# 更多谜题可自行扩展...
]
def start_scene():
# 角色创建
player['name'] = input("请输入您的名字:")
print(f'欢迎【{player["name"]}】来到时王霍斯分校!')
# 跳转到入学考试场景
return "puzzle"
2. 核心函数设计(带详细注释)
场景1:入学考试谜题挑战
# 场景1:入学考试谜题挑战
def puzzle_scene():
"""
处理谜题挑战场景
返回值:
"success" - 通过考试
"failure" - 考试失败
"""
print("\n=== 第一关:算术谜题 ===")
puzzle = random.choice(puzzles) # 随机选择谜题
# 生成动态题目(利用lambda延迟计算)
q = puzzle["question"]() # 执行lambda生成题目
# 提取数字,字符串转数值
x = int(q.split('+')[0])
y = int(q.split('+')[1].split('=')[0])
correct_answer = puzzle.get("answer")(x, y) # 计算答案
# 玩家输入处理
user_answer = int(input(f"请回答:{q} "))
# 分支流程控制
if user_answer == correct_answer:
print("✅ 正确!获得10金币")
player["coins"] += 10 # 运算符应用
# 入学成功,设置角色身份
player['flag'] = True
return "success"
else:
print("❌ 错误!生命值-20")
player["hp"] -= 20
return "failure" if player["hp"] > 0 else "game_over"
场景2:魔法商店(函数封装与循环)
def shop_scene():
""" 商店交互系统 """
print("\n🛒 欢迎来到魔法商店!")
while True: # 循环控制流程
print("\n当前金币:", player["coins"])
for i, item in enumerate(shop_items, 1):
print(f"{i}. {item['name']} - 价格:{item['price']}金币")
choice = input("输入编号购买,或main返回角色场景: ")
if choice == 'main':
return 'main'
# 处理购买逻辑 try except 语法是后面学习的异常技术,这里是为了避免异常发生
try:
index = int(choice) - 1
selected = shop_items[index]
if player["coins"] >= selected["price"]:
player["coins"] -= selected["price"]
if "attack" in selected:
player["wand"] = selected["name"]
elif "hp" in selected:
player["hp"] += selected["hp"]
print(f"购买成功!当前属性:{player}")
else:
print("金币不足!")
except: # 异常处理
print("输入无效!")
3.封装业务
# 根据返回值切换场景
def update_scene(result='main'):
# 场景校验,先传进来的不是空值
if None != result:
# 入学考试场景
if "puzzle" == result:
return "puzzle"
elif 'main' == result: # 返回角色场景
# 调用函数
return by_main()
elif "shop" == result or 'success' == result: # 魔法商店场景 || 考试通过
return "shop"
elif 'failure': # 考试失败,重新考试
return "puzzle"
else:
# 其他情况,给出提示,让用户重新输入
print("您输入的指令有误,请重新输入!")
return update_scene(result='main')
else:
# 其他情况,给出提示
print("您输入的指令有误,请重新输入!")
# 返回角色场景业务
def by_main():
print(f'{("=" * 10)} {player["name"]}角色信息 {("=" * 20)}')
print(f'姓名:{player["name"]}\t 生命值:{player["hp"]}\t 入学状态:{"已入学" if player["flag"] else "未入学"}')
print(f'金币:{player["coins"]}\t 魔杖类型:{player["wand"]}')
print("目前开放功能:puzzle:【谜题挑战】 shop:【魔法商店】")
print("进入【谜题挑战】,请输入:puzzle,进入【魔法商店】,请输入:shop")
sc = input("请输入您的指令(game_over退出游戏):")
# 调用切换场景函数
if 'puzzle' != sc and 'shop' != sc and 'main' != sc and 'game_over' != sc:
# 其他输入校验
print("您输入的指令有误,请重新输入!")
return 'main'
elif 'game_over' == sc:
return sc
return sc
4. 主游戏循环(高阶函数应用)
def run_game():
""" 主控制流程 """
scenes = {
"start": start_scene, # 初始化场景
"puzzle": puzzle_scene, # 入学考试谜题挑战
"shop": shop_scene, # 魔法商店
"main": update_scene # 进入到场景选项
# "battle": battle_scene # 战斗场景(自行扩展)
}
current_scene = "start"
# 游戏主循环(函数作为字典值传递)
while current_scene != "game_over":
result = scenes[current_scene]() # 动态调用场景函数
current_scene = update_scene(result=result) # 根据返回值切换场景
# main只在该模块作为主程序运行时执行,而在模块被其他文件导入时不执行 调用主函数
if __name__ == '__main__':
run_game()
print("游戏已退出,Good Bye!")
四、代码设计思路
-
状态驱动架构
- 使用字典存储玩家属性,便于全局修改
- 通过场景函数返回结果决定后续流程(如
return "success"
)
-
模块化函数设计
- 每个游戏场景为独立函数,高内聚低耦合
- 商店使用
while循环
保持交互,直到用户退出
-
高阶函数技巧
- 在谜题库中使用lambda动态生成题目与答案
- 主循环通过字典映射场景函数,避免冗长if-else
五、运行效果示例
请输入您的名字:王一凡
欢迎【王一凡】来到时王霍斯分校!
=== 第一关:算术谜题 ===
请回答:4 + 1 = ? 3
❌ 错误!生命值-20
=== 第一关:算术谜题 ===
请回答:5 + 8 = ? 12
❌ 错误!生命值-20
=== 第一关:算术谜题 ===
请回答:8 + 9 = ? 17
✅ 正确!获得10金币
🛒 欢迎来到魔法商店!
当前金币: 60
1. 火焰魔杖 - 价格:30金币
2. 冰霜魔杖 - 价格:40金币
3. 生命药水 - 价格:20金币
输入编号购买,或main返回角色场景: 3
购买成功!当前属性:{'name': '王一凡', 'hp': 90, 'coins': 40, 'wand': None, 'flag': True}
当前金币: 40
1. 火焰魔杖 - 价格:30金币
2. 冰霜魔杖 - 价格:40金币
3. 生命药水 - 价格:20金币
输入编号购买,或main返回角色场景: main
========== 王一凡角色信息 ====================
姓名:王一凡 生命值:90 入学状态:已入学
金币:40 魔杖类型:None
目前开放功能:puzzle:【谜题挑战】 shop:【魔法商店】
进入【谜题挑战】,请输入:puzzle,进入【魔法商店】,请输入:shop
请输入您的指令(game_over退出游戏):puzzle
=== 第一关:算术谜题 ===
请回答:6 + 5 = ? 11
✅ 正确!获得10金币
🛒 欢迎来到魔法商店!
当前金币: 50
1. 火焰魔杖 - 价格:30金币
2. 冰霜魔杖 - 价格:40金币
3. 生命药水 - 价格:20金币
输入编号购买,或main返回角色场景: main
========== 王一凡角色信息 ====================
姓名:王一凡 生命值:90 入学状态:已入学
金币:50 魔杖类型:None
目前开放功能:puzzle:【谜题挑战】 shop:【魔法商店】
进入【谜题挑战】,请输入:puzzle,进入【魔法商店】,请输入:shop
请输入您的指令(game_over退出游戏):shop
🛒 欢迎来到魔法商店!
当前金币: 50
1. 火焰魔杖 - 价格:30金币
2. 冰霜魔杖 - 价格:40金币
3. 生命药水 - 价格:20金币
输入编号购买,或main返回角色场景: 3
购买成功!当前属性:{'name': '王一凡', 'hp': 120, 'coins': 30, 'wand': None, 'flag': True}
当前金币: 30
1. 火焰魔杖 - 价格:30金币
2. 冰霜魔杖 - 价格:40金币
3. 生命药水 - 价格:20金币
输入编号购买,或main返回角色场景: main
========== 王一凡角色信息 ====================
姓名:王一凡 生命值:120 入学状态:已入学
金币:30 魔杖类型:None
目前开放功能:puzzle:【谜题挑战】 shop:【魔法商店】
进入【谜题挑战】,请输入:puzzle,进入【魔法商店】,请输入:shop
请输入您的指令(game_over退出游戏):game_over
游戏已退出,Good Bye!
Process finished with exit code 0
六、如何扩展这个项目?
1、增加战斗系统
def battle_scene():
# 使用player["wand"]影响攻击力
# hp减少生命值
# 使用回合制逻辑
发挥自己的创造力,干起来吧~
2、增加存档功能
使用json模块保存玩家数据
3、设计更多谜题类型
比如字符串处理、逻辑推理题等
七、结语
通过这个项目,读者不仅能巩固python基础,还能体验游戏开发的乐趣。尝试添加你的创意,让这个游戏更加丰富多彩!