# GESP等级：一级 | GESP Python 一级考点
"""
第4课·第1节 —— 变量盒子演示代码
课程对应：
  - 30:00-40:00 演示：size=100; t.forward(size)→改size=50→forward(50)
  - 变量命名规范演示
  - 变量值追踪演示 x=10; x=20; x=x+5

记忆钩子：
  "变量=贴标签的盒子，标签是名字，里面是值"
  "一个等号装东西，两个等号比大小"
"""

import turtle

# ============================================================
# 演示1：变量控制小乌龟（30:00-40:00 阶段）
# ============================================================
def demo_variable_control():
    """演示变量控制小乌龟移动距离——改一处全部生效"""
    t = turtle.Turtle()
    t.shape("turtle")
    t.speed(3)

    # === 第一次：size=100，画大方块 ===
    size = 100  # 变量 size 的盒子里装了 100
    t.penup()
    t.goto(-200, 100)
    t.pendown()
    t.color("blue")

    # 用变量控制边长——画正方形
    for _ in range(4):
        t.forward(size)  # 小乌龟去 size 盒子里看，里面是 100
        t.right(90)

    # === 关键教学点：改 size，全部生效 ===
    # 老师："现在我把 size 盒子里纸条从 100 换成 50"
    size = 50   # 重新赋值：换了一张纸条，现在 size 盒子里装的是 50

    t.penup()
    t.goto(50, 100)
    t.pendown()
    t.color("red")

    # 同样代码，不同的 size——画小方块
    for _ in range(4):
        t.forward(size)  # 小乌龟再去 size 盒子里看，里面是 50！
        t.right(90)

    # === 再演示：size=150，画更大方块 ===
    size = 150  # 再次重新赋值

    t.penup()
    t.goto(-200, -150)
    t.pendown()
    t.color("green")

    for _ in range(4):
        t.forward(size)
        t.right(90)

    # 板书呼应：size = 100 → size = 50 → size = 150
    # "改一处，全部生效！——变量只记住最后一次装进去的值"
    turtle.done()


# ============================================================
# 演示2：变量值追踪——x = x + 5 的含义
# ============================================================
def demo_variable_update():
    """演示 x = x + 5 的物理含义：拿出来→加→放回去"""
    print("=" * 50)
    print("演示：变量值追踪——盒子 x 的值变化")
    print("=" * 50)

    x = 10       # 第一步：把 10 放进盒子 x
    print(f"第①步 x = 10  →  盒子 x 里面是: {x}")

    x = 20       # 第二步：换纸条，20 放进盒子 x
    print(f"第②步 x = 20  →  盒子 x 里面是: {x}")

    x = x + 5    # 第三步：拿出来(x=20) → 加5(20+5=25) → 放回去
    print(f"第③步 x = x + 5  →  (拿出 20 + 5 = 25) 放回去 → 盒子 x 里面是: {x}")

    print()
    print("实物演示：")
    print("  1. 手伸进盒子，拿出纸条 20  ←  x")
    print("  2. 在纸条上写 +5  →  变成 25")
    print("  3. 把纸条 25 放回盒子  ←  x = 25")
    print()
    print("关键理解：= 不是数学课的'等于'，而是'装进去'的动作！")
    print()

    # 再演示一个 x = x * 2
    x = 10
    print(f"初始 x = {x}")
    x = x * 2  # 拿出来 10，乘以 2，放回去 20
    print(f"x = x * 2  →  x = {x}")
    x = x * 2  # 拿出来 20，乘以 2，放回去 40
    print(f"x = x * 2  →  x = {x}")
    x = x * 2  # 拿出来 40，乘以 2，放回去 80
    print(f"x = x * 2  →  x = {x}")


# ============================================================
# 演示3：变量命名规范验证（10-30min 知识点阶段用）
# ============================================================
def demo_naming_rules():
    """展示合法/非法变量名的运行效果"""

    print("=" * 50)
    print("演示：变量命名规范")
    print("=" * 50)

    # 合法变量名演示
    size = 100
    score_1 = 95
    _count = 50
    num2024 = 2024

    print(f"✅ size = {size}         ← 全字母，合法")
    print(f"✅ score_1 = {score_1}    ← 字母+下划线+数字，合法")
    print(f"✅ _count = {_count}     ← 下划线开头，合法")
    print(f"✅ num2024 = {num2024}   ← 字母开头，数字结尾，合法")

    print()
    print("❌ 非法变量名（以下代码会报错，已注释）：")
    print("# 1size = 100     ← 数字开头，语法错误！")
    print("# my var = 50     ← 有空格，语法错误！")
    print("# class = 'hello' ← class 是 Python 关键字，语法错误！")
    print("# for = 10        ← for 是 Python 关键字，语法错误！")
    print()
    print("口诀：字母数字下划线，数字开头可不行，空格关键字别靠近！")


# ============================================================
# 入口
# ============================================================
if __name__ == "__main__":
    print("🐢 第4课·第1节 —— 变量盒子演示")
    print()

    # 先运行非 turtle 演示（控制台输出）
    demo_variable_update()
    print()
    demo_naming_rules()
    print()
    print("=" * 50)
    print("现在启动 turtle 图形演示...")
    print("=" * 50)

    # 再运行 turtle 演示（图形界面）
    demo_variable_control()
