python系列之综合案例:用python开发《魔法学院入学考试》文字冒险游戏

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。

python系列前期章节

  1. python系列之注释与变量
  2. python系列之输入输出语句与数据类型
  3. python系列之运算符
  4. python系列之控制流程语句
  5. python系列之字符串
  6. python系列之列表
  7. python系列之元组
  8. python系列之字典
  9. python系列之集合
  10. python系列之函数基础
  11. python系列之函数进阶
  12. 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!")

四、代码设计思路

  1. 状态驱动架构

    • 使用字典存储玩家属性,便于全局修改
    • 通过场景函数返回结果决定后续流程(如return "success"
  2. 模块化函数设计

    • 每个游戏场景为独立函数,高内聚低耦合
    • 商店使用while循环保持交互,直到用户退出
  3. 高阶函数技巧

    • 在谜题库中使用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基础,还能体验游戏开发的乐趣。尝试添加你的创意,让这个游戏更加丰富多彩!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值