🟡 副驾驶 🤖 指导下操作

🎒 第 5 课:百宝背包

第 5 课:🎒 百宝背包

🎯 学习目标

  • 掌握列表 list 的基本操作(创建、append、pop、in、索引、遍历、len)
  • 实现背包系统(道具拾取和使用)

📚 家长预习指南(5 分钟)

本课核心要点

  • backpack = [] — 创建空列表,就像一个空背包
  • backpack.append("灵芝") — 把道具放进背包
  • backpack.pop(0) — 取出背包第一个道具
  • "灵芝" in backpack — 检查背包里有没有灵芝
  • len(backpack) — 查看背包里有几件道具

您的角色

🟡 副驾驶 — 孩子开始自己写代码,您在旁边指导


🔗 Scratch ↔ Python 对照

Scratch 积木 Python 代码 说明
我的列表 my_list = [] 创建列表
加入 东西列表 my_list.append("东西") 添加到末尾
列表 包含 东西 "东西" in my_list 检查是否包含
列表 的长度 len(my_list) 列表长度

📖 活动模块

模块 A — 列表是什么(15 分钟)

目标

用"背包"类比引入列表

  1. 类比:"列表就像侠客的背包,可以往里面放东西、取出东西、查看有什么"
  2. 练习基本操作:
backpack = []                    # 空背包
backpack.append("灵芝")          # 放入灵芝
backpack.append("金创药")        # 放入金创药
print(f"背包:{backpack}")       # 看看背包里有什么
print(f"背包里有 {len(backpack)} 件道具")

模块 B — 背包系统(20 分钟)

目标

战胜妖怪后随机掉落道具加入背包

在战斗胜利后添加道具掉落:

item = random.choice(["灵芝", "金创药", "狐妖尾毛", None])
if item is not None:
    backpack.append(item)
    print(f"🎁 获得道具:{item}!")

查看背包内容:

print("\n🎒 背包物品:")
for item in backpack:
    print(f"  · {item}")

模块 C — 使用道具(10 分钟)

目标

从背包中取出道具使用

if "灵芝" in backpack:
    backpack.remove("灵芝")
    hp = min(hp + 20, 100)  # 恢复 20 点,不超过上限
    print(f"🌿 使用灵芝!恢复 20 生命值!当前:{hp}")

🎮 运行游戏:收集道具的乐趣是本课的 fun moment!


🤖 AI 环节(指导下操作)

阶段

🟡 指导下操作 — 孩子在家长指导下向 AI 提问

任务

让孩子问 AI "Python 列表怎么删除指定元素?"

示例提示词

Python 列表怎么删除一个指定的元素?比如我有一个列表 ["灵芝", "金创药"],想删掉"灵芝"。


✅ 最小完成目标

  • [ ] 创建背包列表
  • [ ] 战斗胜利后道具进背包
  • [ ] 能查看背包内容

⭐ 扩展挑战

  • 限制背包容量(len(backpack) >= 10 时提示满了)
  • 实现"使用道具"功能(恢复生命值)

🐛 常见错误提示

错误 原因 解决
IndexError: list index out of range 访问了不存在的位置 先检查 len(list) > 0
ValueError: list.remove(x): x not in list 删除不存在的元素 先用 in 检查再删除

💻 代码查看

# ==========================================
# 🎮 少年侠客闯江湖 - 第 5 课
# 📚 本课知识点:列表 list(append/pop/in/遍历/len)
# ==========================================

import random

# --- 前面课程的代码 ---
print("=" * 40)
print("  ⚔️  少年侠客闯江湖  ⚔️")
print("=" * 40)

name = input("\n少年侠客,请赐名:")
hp = 100
attack = 15
silver = 0
battles_won = 0

# TODO: 创建一个空背包(列表)
# 提示:backpack = []

print(f"\n少年侠客【{name}】,踏入了江湖...")

# 路线选择
print("\n前方出现三条路:")
print("  1. 🏔️ 忘忧山    2. 🐉 龙王洞    3. 👻 幽灵峰")
choice = input("请选择路线(1/2/3):")
if choice == "1":
    route_name = "忘忧山"
elif choice == "2":
    route_name = "龙王洞"
elif choice == "3":
    route_name = "幽灵峰"
else:
    route_name = "忘忧山"
print(f"\n{name}踏上了{route_name}...")

# 3 次遭遇
for i in range(3):
    print(f"\n--- 第 {i + 1} 次遭遇 ---")
    encounter = random.choice(["妖怪", "仙人"])

    if encounter == "妖怪":
        monster_name = random.choice(["狐妖", "山魅", "影蛇"])
        monster_hp = random.randint(20, 40)
        monster_attack = random.randint(5, 12)
        monster_silver = random.randint(8, 15)
        print(f"⚔️ 遇到{monster_name}!")

        while hp > 0 and monster_hp > 0:
            damage = random.randint(5, attack)
            monster_hp -= damage
            print(f"💥 攻击!伤害 {damage}{monster_name}剩余 {max(monster_hp, 0)}")
            if monster_hp <= 0:
                break
            m_damage = random.randint(3, monster_attack)
            hp -= m_damage
            print(f"👹 反击!伤害 {m_damage}{name}剩余 {max(hp, 0)}")

        if hp > 0:
            silver += monster_silver
            battles_won += 1
            print(f"🎉 击败{monster_name}!+{monster_silver} 银两")

            # TODO: 战斗胜利后随机掉落道具加入背包
            # 提示:item = random.choice(["灵芝", "金创药", None])
            #       if item: backpack.append(item)

        else:
            print(f"💀 落败了...")
            break
    else:
        npc_name = random.choice(["白胡老者", "书生"])
        riddles = [("什么东西越长越短?", "蜡烛"), ("四面都是山,中间有个田", "画")]
        riddle, answer = random.choice(riddles)
        print(f"🧙 遇到{npc_name}!谜语:"{riddle}"")
        if input("答案:") == answer:
            silver += 15
            print("✨ 答对!+15 银两")
        else:
            silver += 3
            print(f"😊 答错了,答案是"{answer}"。+3 银两")

# TODO: 冒险结束后展示背包内容
# 提示:for item in backpack: print(f"  · {item}")

print(f"\n🏁 冒险结束!生命值:{max(hp,0)} 银两:{silver} 胜利:{battles_won}次")