# GESP等级：一级 | GESP Python 一级考点
"""
第7课·第1节 —— if基础 + 比较运算符
课程对应：
  - 00:00-10:00 导入：传感器游戏——蒙眼乌龟碰线→传感器喊"撞墙！"
  - 10:00-30:00 知识点：①if语法 ②6个比较运算符 ③=赋值vs==比较
  - 30:00-40:00 演示：if t.xcor()>200: t.right(180)→掉头
  - 40:00-55:00 实操：补全if边界检测 / 判断=和==区别 / 乌龟碰墙掉头
  - 55:00-60:00 小测："==和=有什么区别？"
  - GESP 考点：#20 比较运算符、#21 if 条件判断
  - 记忆钩子："if=小乌龟眼睛看到墙就回头" "一个等号装东西两个等号比大小"

运行方式：
  每个函数独立运行，按教学节奏调用。
"""

import turtle
import time


# ============================================================
# 阶段一：导入——传感器游戏（00:00-10:00）
# ============================================================
def demo_intro_sensor():
    """
    用turtle模拟"蒙眼乌龟碰线"传感器游戏。
    老师演示：乌龟往前走，不做判断→冲出画布。
    引出if的作用：像传感器一样，检测到条件触发动作。
    """
    print("=" * 60)
    print("🐢 传感器游戏——蒙眼乌龟碰线")
    print("=" * 60)
    print("\n🎯 核心：条件满足 → 触发动作")
    print("   if 就像传感器——检测到墙就喊'撞墙！'\n")

    # ========== 第1步：乌龟蒙眼往前走（没有if检测）==========
    print("--- 第1步：蒙眼乌龟——没有传感器，冲出画布！---\n")

    t = turtle.Turtle()
    t.shape("turtle")
    t.speed(2)

    print("乌龟往前走，它看不到边界……")
    for i in range(30):
        t.forward(15)
    print("乌龟跑出画布了！因为它没有'眼睛'（if条件）\n")
    time.sleep(1)
    t.clear()

    # ========== 第2步：加上if传感器 ==========
    print("--- 第2步：装上传感器——if检测到墙就掉头！---\n")

    t.penup()
    t.goto(-300, 0)
    t.pendown()
    t.speed(2)

    print("现在乌龟有了'眼睛'（if条件），每次走一步都检查边界\n")

    for i in range(80):
        t.forward(10)

        # if 就是传感器——检测到"撞墙"条件
        if t.xcor() > 200:
            print(f"🚨 传感器触发！x坐标={t.xcor():.0f} > 200，掉头！")
            t.right(180)
            t.forward(10)

        # 左边界也检测
        if t.xcor() < -200:
            print(f"🚨 传感器触发！x坐标={t.xcor():.0f} < -200，掉头！")
            t.right(180)
            t.forward(10)

    print("\n🎯 总结：if 就像传感器——条件满足就触发动作！")
    print("   记忆钩子：if = 小乌龟眼睛看到墙就回头")

    turtle.done()


# ============================================================
# 阶段二：知识点讲解演示（10:00-30:00）
# ============================================================
def demo_if_syntax():
    """知识点①：if 语法结构"""
    print("=" * 60)
    print("📢 知识点①：if 语法结构")
    print("=" * 60)
    print()

    print("--- if 语法模板 ---")
    print("if 条件:")
    print("    条件成立时执行的代码  ← 缩进块")
    print("    可以写多行")
    print()

    print("--- 执行流程 ---")
    print("① 遇到 if，检查条件")
    print("② 条件为 True  → 执行缩进块")
    print("③ 条件为 False → 跳过缩进块")
    print("④ 继续执行后面的代码")
    print()

    # 演示：成立 vs 不成立
    print("--- 演示：条件成立 vs 不成立 ---")

    x = 100
    print(f"x = {x}")

    print(f"if x > 50:  →  条件成立（{x} > 50 是 True）")
    print("  输出：会执行")
    if x > 50:
        print("  ✅ 条件成立，缩进块被执行！")

    print()
    print(f"if x > 200: →  条件不成立（{x} > 200 是 False）")
    print("  输出：不会执行")
    if x > 200:
        print("  （这行不会被执行）")

    print()
    print("💡 规则：if 条件后面必须加冒号（:），缩进块要统一缩进！")


def demo_comparison_operators():
    """知识点②：6个比较运算符"""
    print("=" * 60)
    print("📢 知识点②：6个比较运算符")
    print("=" * 60)
    print()

    # 定义一些数值用于演示
    a, b = 10, 5
    c, d = 5, 8
    e, f = 7, 7

    print(f"a = {a}, b = {b}, c = {c}, d = {d}, e = {e}, f = {f}")
    print()

    # 1. > 大于
    print("--- ①  >  大于 ---")
    print(f"  {a} > {b}  →  {a > b}   (因为 {a} 大于 {b})")
    print(f"  {c} > {d}  →  {c > d}   (因为 {c} 不大于 {d})")
    print("  动作：右手斜向上张开 > 形状  '张嘴吃大的'")
    print()

    # 2. < 小于
    print("--- ②  <  小于 ---")
    print(f"  {c} < {d}  →  {c < d}   (因为 {c} 小于 {d})")
    print(f"  {a} < {b}  →  {a < b}   (因为 {a} 不小于 {b})")
    print("  动作：右手斜向下 < 形状  '尖尖指小的'")
    print()

    # 3. >= 大于等于
    print("--- ③  >= 大于等于 ---")
    print(f"  {a} >= {b}  →  {a >= b}   (大于成立)")
    print(f"  {e} >= {f}  →  {e >= f}   (等于成立)")
    print(f"  {c} >= {d}  →  {c >= d}   (既不大于也不等于)")
    print("  规则：> 或 = 有一个成立就是 True")
    print()

    # 4. <= 小于等于
    print("--- ④  <= 小于等于 ---")
    print(f"  {c} <= {d}  →  {c <= d}   (小于成立)")
    print(f"  {e} <= {f}  →  {e <= f}   (等于成立)")
    print(f"  {a} <= {b}  →  {a <= b}   (既不小于也不等于)")
    print()

    # 5. == 等于
    print("--- ⑤  == 等于（比较） ---")
    print(f"  {e} == {f}  →  {e == f}   (两边相等)")
    print(f"  {a} == {b}  →  {a == b}   (两边不相等)")
    print("  动作：双手平行平举   '两个等号比大小'")
    print()

    # 6. != 不等于
    print("--- ⑥  != 不等于 ---")
    print(f"  {a} != {b}  →  {a != b}   (两边不相等)")
    print(f"  {e} != {f}  →  {e != f}   (两边相等，所以不成立)")
    print("  动作：双手交叉 ✖️   '感叹号加不等号'")
    print()

    # 总结表
    print("--- 📊 总结对比表 ---")
    print("运算符  |  例子        |  结果")
    print("--------|-------------|------")
    print(f"  >     |  {a} > {b}        |  {a > b}")
    print(f"  <     |  {c} < {d}        |  {c < d}")
    print(f"  >=    |  {a} >= {a-5}      |  {a >= a-5}")
    print(f"  <=    |  {c} <= {c+3}      |  {c <= c+3}")
    print(f"  ==    |  {e} == {f}        |  {e == f}")
    print(f"  !=    |  {a} != {b}        |  {a != b}")
    print()

    print("💡 记忆口诀：")
    print("   大于小于张嘴吃   →  > <")
    print("   多一横就是等于   →  >=  <=")
    print("   两个等号比大小   →  ==")
    print("   感叹号加不等号   →  !=")


def demo_assign_vs_compare():
    """知识点③：= 赋值 vs == 比较"""
    print("=" * 60)
    print("📢 知识点③：= 赋值  vs  == 比较")
    print("=" * 60)
    print()

    print("--- 核心区别 ---")
    print("  =   赋值     → '把右边的值装进左边的变量'  📦")
    print("  ==  比较     → '判断左右两边是否相等'       ⚖️")
    print()

    # 演示赋值
    print("--- ① 赋值 = 演示 ---")
    x = 100  # 赋值
    print(f"  x = 100     → 把100装进变量x")
    print(f"  print(x)    → {x}")
    print()

    # 演示比较
    print("--- ② 比较 == 演示 ---")
    y = 100
    print(f"  y = {y}")
    print(f"  y == 100    → {y == 100}  (判断y的值是不是100)")
    print(f"  y == 50     → {y == 50}   (判断y的值是不是50)")
    print()

    # 对比演示
    print("--- ③ 对比：赋值 vs 比较 ---")
    print()

    print("  代码              |   含义          |   结果")
    print("  ------------------|-----------------|--------")
    print(f"  x = 200           |   赋值（装东西）  |   x = 200")
    print(f"  x == 200          |   比较（比大小）  |   {x == 200}  (假设 x = {x})")
    print(f"  if x == 200:      |   条件判断       |   条件成立 → 执行缩进块")
    print()

    # 展示错误用法（注释掉以免报错）
    print("--- ④ ❌ 常见错误：if 条件里写一个等号 ---")
    print("  # if x = 200:     ← 错误！= 是赋值，不能做条件")
    print("  #     print('是200')")
    print("  Python报错：SyntaxError（语法错误）")
    print()

    print("--- ⑤ ✅ 正确写法：if 条件里写两个等号 ---")
    print("  if x == 200:    ← 正确！== 是比较，结果是True/False")
    print("      print('是200')")
    print()

    print("💡 记住记忆钩子：")
    print("   '一个等号装东西  📦'   →  赋值用 =")
    print("   '两个等号比大小  ⚖️'   →  比较用 ==")
    print()
    print("  在 if 条件里出现等号，必须写两个（==）！")


def demo_all_comparison_interactive():
    """综合演示——所有比较运算符互动"""
    print("=" * 60)
    print("📢 综合演示：比较运算符大阅兵")
    print("=" * 60)
    print()

    print("--- 演示各种比较的 True/False ---\n")

    test_cases = [
        ("10 > 5", 10 > 5),
        ("3 < 8", 3 < 8),
        ("7 >= 7", 7 >= 7),
        ("7 >= 5", 7 >= 5),
        ("4 <= 5", 4 <= 5),
        ("4 <= 4", 4 <= 4),
        ("6 == 6", 6 == 6),
        ("6 == 3", 6 == 3),
        ("5 != 3", 5 != 3),
        ("5 != 5", 5 != 5),
    ]

    for expr, result in test_cases:
        mark = "✅" if result else "❌"
        print(f"  {expr:12s}  →  {mark} {result}")
    print()

    print("💡 每个比较表达式都会得到一个 True 或 False")
    print("   True  → 条件成立，if 缩进块会被执行")
    print("   False → 条件不成立，if 缩进块被跳过")


# ============================================================
# 阶段三：上机演示——乌龟碰墙掉头（30:00-40:00）
# ============================================================
def demo_turtle_hit_wall():
    """
    演示 if 在 turtle 边界检测中的应用。
    乌龟碰到墙（x坐标超出范围）自动掉头。
    """
    print("=" * 60)
    print("🐢 演示：乌龟碰墙掉头——if 是小乌龟的眼睛")
    print("=" * 60)
    print()

    t = turtle.Turtle()
    t.shape("turtle")
    t.speed(3)

    print("--- 第1步：没有 if——乌龟冲出画布 ---\n")
    print("乌龟蒙着眼往前走，它不知道边界在哪……")
    t.penup()
    t.goto(-300, 100)
    t.pendown()
    for i in range(40):
        t.forward(15)
    print("👻 乌龟消失啦！它跑出了画布！\n")
    time.sleep(1)

    # 清空重新画
    t.clear()
    t.penup()
    t.goto(-300, -50)
    t.pendown()

    print("--- 第2步：加上 if——乌龟看到墙了！---\n")
    print("现在给小乌龟装上'眼睛'（if条件）——")
    print("每走一步检查 x 坐标，超过 200 就掉头！\n")

    for i in range(100):
        t.forward(10)

        # if 检测右边界
        if t.xcor() > 200:
            print(f"  👁️ 看到右墙！x={t.xcor():.0f} > 200，掉头！")
            t.right(180)
            t.forward(10)

        # if 检测左边界
        if t.xcor() < -200:
            print(f"  👁️ 看到左墙！x={t.xcor():.0f} < -200，掉头！")
            t.right(180)
            t.forward(10)

    print("\n✅ 乌龟在墙之间来回走，不会再冲出画布啦！")
    print()
    print("🎯 关键代码：")
    print("   if t.xcor() > 200:     # 如果x坐标大于200")
    print("       t.right(180)        # 掉头")
    print()
    print("💡 记忆句：if = 小乌龟的眼睛——看到墙就回头！")

    turtle.done()


def demo_multiple_boundary():
    """
    演示四个方向的边界检测。
    """
    print("=" * 60)
    print("🐢 演示：四个方向边界检测")
    print("=" * 60)
    print()

    t = turtle.Turtle()
    t.shape("turtle")
    t.speed(5)

    print("让乌龟在四个边界内来回反弹！\n")

    # 用循环让乌龟随机方向移动，碰到任何边界都掉头
    directions = [0, 30, 45, 60, 90, 120, 135, 150, 180, 210, 225, 240, 270, 300, 315, 330]

    # 每次换一个方向前进
    for step in range(150):
        # 每5步换一个随机方向
        if step % 5 == 0:
            import random
            t.setheading(random.choice(directions))

        t.forward(5)

        # 检测四个边界
        border_hit = False
        if t.xcor() > 250:
            print(f"  → 碰到右边界！x={t.xcor():.0f}")
            border_hit = True
        elif t.xcor() < -250:
            print(f"  → 碰到左边界！x={t.xcor():.0f}")
            border_hit = True
        elif t.ycor() > 250:
            print(f"  → 碰到上边界！y={t.ycor():.0f}")
            border_hit = True
        elif t.ycor() < -250:
            print(f"  → 碰到下边界！y={t.ycor():.0f}")
            border_hit = True

        if border_hit:
            t.right(180)
            t.forward(5)

    print("\n🎯 多个 if 条件可以组合使用，每个条件独立判断！")
    print("   一个 if 检测一个条件，互不干扰。")

    turtle.done()


# ============================================================
# 阶段四：实操——练习参考答案（40:00-55:00）
# ============================================================
def demo_practice_answers():
    """实操练习的参考答案输出"""
    print("=" * 60)
    print("📝 实操练习参考答案")
    print("=" * 60)
    print()

    # === 练习1：补全 if 边界检测 ===
    print("--- 练习1：补全 if 边界检测 ---")
    print("题目：补全条件，让乌龟在 x > 150 时掉头")
    print()
    print("代码：")
    print("    import turtle")
    print("    t = turtle.Turtle()")
    print("    t.speed(2)")
    print("    for i in range(50):")
    print("        t.forward(10)")
    print("        ____ t.xcor() ____ 150:")
    print("            _______________")
    print()
    print("答案：")
    print("    if t.xcor() > 150:")
    print("        t.right(180)")
    print()

    # === 练习2：判断 = 和 == 区别 ===
    print("--- 练习2：判断 = 和 == 区别 ---")
    print()

    print("题目A：")
    print("    x = 100")
    print("    if x = 100:")
    print("        print('x是100')")
    print("→ 答案：错！if 条件里不能用 =，要用 ==")
    print("  正确写法：if x == 100:")
    print()

    print("题目B：")
    print("    y = 50")
    print("    if y == 50:")
    print("        print('y是50')")
    print("→ 答案：对！== 是比较，条件成立输出'y是50'")
    print()

    print("题目C：")
    print("    z = 200")
    print("    if z == 200:")
    print("        z = z - 50")
    print("        print('z减了50')")
    print("→ 答案：对！先比较 z==200 成立，再赋值 z=150，输出'z减了50'")
    print()

    # === 练习3：乌龟碰墙掉头 ===
    print("--- 练习3：乌龟碰墙掉头 ---")
    print("代码：")
    print("    import turtle")
    print("    t = turtle.Turtle()")
    print("    t.speed(3)")
    print("    for i in range(200):")
    print("        t.forward(10)")
    print("        if t.xcor() > 250:")
    print("            t.right(180)")
    print("        if t.xcor() < -250:")
    print("            t.right(180)")
    print()
    print("💡 两个 if 各自独立判断，互不干扰！")

    # 运行一个快速演示
    t = turtle.Turtle()
    t.speed(5)
    t.penup()
    t.goto(-200, 0)
    t.pendown()

    for i in range(150):
        t.forward(10)
        if t.xcor() > 250:
            t.right(180)
            t.forward(10)
        if t.xcor() < -250:
            t.right(180)
            t.forward(10)

    print("✅ 乌龟在 [-250, 250] 之间来回走！")

    turtle.done()


# ============================================================
# 阶段五：小测（55:00-60:00）
# ============================================================
def demo_quiz():
    """小测题目及正确答案"""
    print("=" * 60)
    print("📝 小测：== 和 = 有什么区别？")
    print("=" * 60)
    print()

    print("正确答案：")
    print()
    print("  =   → 赋值（assignment）")
    print("        把右边的值'装进'左边的变量")
    print("        记忆：'一个等号装东西'  📦")
    print("        例子：x = 100")
    print()
    print("  ==  → 比较（comparison）")
    print("        判断左右两边的值是否相等")
    print("        记忆：'两个等号比大小'  ⚖️")
    print("        例子：if x == 100:")
    print()
    print("  关键规则：")
    print("  1. 赋值用 =，比较用 ==")
    print("  2. if 条件里出现等号必须写两个（==）")
    print("  3. 在 if 里写一个等号（=）会报语法错误！")
    print()
    print("--- 记忆钩子全文 ---")
    print("  if 条件冒号换行        →  眼睛看到 + 比条件")
    print("  缩进里面写动作        →  右手向右推")
    print("  一个等号装东西  📦    →  单手抓东西")
    print("  两个等号比大小  ⚖️    →  双手平行比")
    print("  大于小于张嘴吃        →  右手比 > <")
    print("  多一横就是等于        →  >=  <=")
    print("  感叹号加不等号        →  !=  双手交叉 ✖️")


# ============================================================
# 入口
# ============================================================
if __name__ == "__main__":
    print("🐢 第7课·第1节 —— if基础 + 比较运算符")
    print("=" * 60)
    print()
    print("请选择要运行的功能：")
    print("  1  - 导入：传感器游戏（00:00-10:00）")
    print("  2  - 知识点①：if语法结构")
    print("  3  - 知识点②：6个比较运算符")
    print("  4  - 知识点③：=赋值 vs ==比较")
    print("  5  - 综合演示：比较运算符大阅兵")
    print("  6  - 演示：乌龟碰墙掉头（30:00-40:00）")
    print("  7  - 演示：四个方向边界检测")
    print("  8  - 实操练习参考答案（40:00-55:00）")
    print("  9  - 小测答案（55:00-60:00）")
    print()

    try:
        choice = int(input("请输入数字 (1-9)，直接回车默认 6: ") or "6")
    except (ValueError, EOFError):
        choice = 6

    print()

    functions = {
        1: demo_intro_sensor,
        2: demo_if_syntax,
        3: demo_comparison_operators,
        4: demo_assign_vs_compare,
        5: demo_all_comparison_interactive,
        6: demo_turtle_hit_wall,
        7: demo_multiple_boundary,
        8: demo_practice_answers,
        9: demo_quiz,
    }

    func = functions.get(choice)
    if func:
        func()
    else:
        print("无效选择，运行乌龟碰墙掉头演示")
        demo_turtle_hit_wall()
