# ==========================================
# 🎮 少年侠客闯江湖 - 第 6 课
# 📚 本课知识点:字典 dict、元组 tuple
# ==========================================
import random
# --- 开场 ---
print("=" * 40)
print(" ⚔️ 少年侠客闯江湖 ⚔️")
print("=" * 40)
name = input("\n少年侠客,请赐名:")
# TODO: 把之前的散乱变量改为一个字典
# 提示:hero = {"name": name, "hp": 100, "max_hp": 100, ...}
# TODO: 用字典列表定义多种妖怪
# 提示:monsters = [{"name": "狐妖", "hp": 30, ...}, ...]
# TODO: 用字典存 NPC 数据和谜语
# (以下为前面课程的游戏逻辑,改用字典访问)
# 注意:之前的 hp 要改成 hero["hp"]
# ==========================================
# 🎮 少年侠客闯江湖 - 第 6 课(参考答案)
# 📚 本课知识点:字典 dict、元组 tuple
# ⚠️ 这是参考答案,请先让孩子自己尝试!
# ==========================================
import random
# --- 开场 ---
print("=" * 40)
print(" ⚔️ 少年侠客闯江湖 ⚔️")
print("=" * 40)
name = input("\n少年侠客,请赐名:")
# 用字典存储侠客数据(比散乱变量更整洁!)
hero = {
"name": name, "hp": 100, "max_hp": 100,
"attack": 15, "silver": 0, "backpack": [],
"battles_won": 0, "adventures": 0
}
# 用字典列表定义妖怪图鉴
monsters = [
{"name": "狐妖", "desc": "狡猾的精灵", "hp": 30, "attack": 8, "silver_drop": 10, "item_drop": "狐妖尾毛"},
{"name": "山魅", "desc": "山中怪影", "hp": 40, "attack": 12, "silver_drop": 15, "item_drop": "山魅石"},
{"name": "火鸦", "desc": "烈焰飞鸟", "hp": 50, "attack": 15, "silver_drop": 20, "item_drop": "火鸦羽"},
{"name": "影蛇", "desc": "暗影毒蛇", "hp": 25, "attack": 10, "silver_drop": 8, "item_drop": None},
]
# NPC 数据
npcs = [
{"name": "白胡老者", "riddle": "什么东西越长越短?", "answer": "蜡烛", "silver_correct": 15, "silver_wrong": 3},
{"name": "书生", "riddle": "四面都是山,中间有个田", "answer": "画", "silver_correct": 12, "silver_wrong": 3},
{"name": "铁匠", "riddle": "千锤百炼出深山,烈火焚烧也等闲", "answer": "石灰", "silver_correct": 10, "silver_wrong": 3},
]
# 路线数据(元组格式:(名称, 描述))
routes = [
("忘忧山", "山间清风拂面,偶有小妖出没"),
("龙王洞", "洞内阴暗潮湿,危机四伏"),
("幽灵峰", "雷电交加,强大妖怪盘踞于此"),
]
print(f"\n少年侠客【{hero['name']}】,踏入了江湖...")
# --- 路线选择 ---
print("\n前方出现三条路:")
for idx, (r_name, r_desc) in enumerate(routes, 1):
print(f" {idx}. {r_name} — {r_desc}")
choice = input("请选择路线(1/2/3):")
route_idx = int(choice) - 1 if choice in "123" else 0
route_name, _ = routes[route_idx]
print(f"\n{hero['name']}踏上了{route_name}...")
# --- 3 次遭遇 ---
for i in range(3):
if hero["hp"] <= 0:
break
print(f"\n{'=' * 35}\n 第 {i + 1} 次遭遇")
encounter = random.choice(["妖怪", "仙人"])
if encounter == "妖怪":
m = dict(random.choice(monsters)) # 复制一份妖怪数据
print(f"\n⚔️ {m['name']}({m['desc']})出现!HP:{m['hp']} ATK:{m['attack']}")
while hero["hp"] > 0 and m["hp"] > 0:
dmg = random.randint(5, hero["attack"])
m["hp"] -= dmg
print(f"💥 攻击!伤害 {dmg},{m['name']}剩余 {max(m['hp'], 0)}")
if m["hp"] <= 0:
break
m_dmg = random.randint(3, m["attack"])
hero["hp"] -= m_dmg
print(f"👹 反击!伤害 {m_dmg},{hero['name']}剩余 {max(hero['hp'], 0)}")
if hero["hp"] > 0:
hero["silver"] += m["silver_drop"]
hero["battles_won"] += 1
print(f"🎉 击败{m['name']}!+{m['silver_drop']}银两")
if m["item_drop"] and len(hero["backpack"]) < 10:
hero["backpack"].append(m["item_drop"])
print(f"🎁 获得:{m['item_drop']}")
else:
print(f"💀 {hero['name']}落败了...")
break
else:
npc = random.choice(npcs)
riddle = npc['riddle']
print(f"\n🧙 遇到{npc['name']}!\n '{riddle}'")
ans = input("答案:")
if ans == npc["answer"]:
hero["silver"] += npc["silver_correct"]
print(f"✨ 答对!+{npc['silver_correct']}银两")
else:
hero["silver"] += npc["silver_wrong"]
answer = npc['answer']
print(f"😊 答错了,答案是'{answer}'。+{npc['silver_wrong']}银两")
# --- 侠客状态卡 ---
hero["adventures"] += 1
print(f"\n╔{'═' * 30}╗")
print(f"║ 📋 {hero['name']} HP:{max(hero['hp'],0)}/{hero['max_hp']} ATK:{hero['attack']}")
print(f"║ 💰{hero['silver']} ⚔️{hero['battles_won']}胜 🎒{', '.join(hero['backpack']) or '空'}")
print(f"╚{'═' * 30}╝")