🟡 副驾驶 🤖 指导下操作

🔧 第 7 课:武功秘籍

第 7 课:🔧 武功秘籍(第一次重构)

🎯 学习目标

  • 掌握函数 def 的定义和调用
  • 理解参数返回值
  • 学会默认参数
  • 通过重构体验 DRY 原则(不重复自己)

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

本课核心要点

  • def battle(hero, monster): — 定义函数,像 Scratch 的"自制积木"
  • return True — 函数完成后返回一个结果
  • def battle(hero, monster, bonus=0): — 默认参数,不传就用默认值
  • 重构:把重复的代码提取成函数,代码更短更整洁

您的角色

🟡→🔴 过渡 — 观察孩子是否能看懂报错并尝试修改(过渡到辅助模式信号)


🔗 Scratch ↔ Python 对照

Scratch 积木 Python 代码 说明
我的积木 def my_function(): 定义函数
自制积木输入 def func(param): 带参数的函数
使用 我的积木 my_function() 调用函数

📖 活动模块

模块 A — 为什么要函数(15 分钟)

目标

观察代码中的重复逻辑,引入函数概念

  1. 看第 6 课的代码——"发现了吗?战斗的代码出现了很多次!"
  2. 引入概念:"把重复的代码打包成一个'按钮',按一下就执行"
  3. DRY 原则:"Don't Repeat Yourself — 不重复自己!"

模块 B — 提取函数(25 分钟)

目标

将战斗和 NPC 对话提取为函数

def battle(hero, monster):
    """回合制战斗,返回 True 胜利 / False 落败"""
    while hero["hp"] > 0 and monster["hp"] > 0:
        # 攻击逻辑...
    return hero["hp"] > 0

def talk_to_npc(hero, npc):
    """NPC 互动问答"""
    # 问答逻辑...

重构后主循环变得简洁:

if encounter == "妖怪":
    if battle(hero, monster):
        print("胜利!")
else:
    talk_to_npc(hero, npc)

模块 C — 函数的力量(10 分钟)

目标

运行重构后代码,确认功能不变但更整洁

🎮 运行游戏:功能一样但代码少了很多——重构的成就感!


🤖 AI 环节(指导下操作)

阶段

🟡 指导下操作

任务

孩子自己问 AI 代码重构

示例提示词

我的代码里有重复的战斗逻辑,怎么用 Python 函数改进?


✅ 最小完成目标

  • [ ] 至少提取 2 个函数(battle + talk_to_npc)
  • [ ] 代码功能不变,正常运行

⭐ 扩展挑战

  • 给 battle 加默认参数:battle(hero, monster, bonus=0)
  • 提取 show_status(hero) 函数

🐛 常见错误提示

错误 原因 解决
函数不执行 只定义了没调用 记得写 battle(hero, monster) 调用
NameError 函数内的变量在函数外用了 函数内的变量是"局部的",用 return 传出去

💻 代码查看

# ==========================================
# 🎮 少年侠客闯江湖 - 第 7 课
# 📚 本课知识点:函数 def(参数/返回值/默认参数)
# ==========================================

import random

# --- 游戏数据(和第 6 课一样)---
monsters = [
    {"name": "狐妖", "hp": 30, "attack": 8, "silver_drop": 10, "item_drop": "狐妖尾毛"},
    {"name": "山魅", "hp": 40, "attack": 12, "silver_drop": 15, "item_drop": "山魅石"},
    {"name": "火鸦", "hp": 50, "attack": 15, "silver_drop": 20, "item_drop": "火鸦羽"},
]
npcs = [
    {"name": "白胡老者", "riddle": "什么东西越长越短?", "answer": "蜡烛", "silver_correct": 15, "silver_wrong": 3},
    {"name": "书生", "riddle": "四面都是山,中间有个田", "answer": "画", "silver_correct": 12, "silver_wrong": 3},
]

# TODO: 提取 battle(hero, monster) 函数
# 提示:def battle(hero, monster):
#           """回合制战斗,返回 True/False"""
#           while hero["hp"] > 0 and monster["hp"] > 0:
#               ...
#           return hero["hp"] > 0

# TODO: 提取 talk_to_npc(hero, npc) 函数
# 提示:def talk_to_npc(hero, npc):
#           ...

# TODO: 用函数简化主循环代码