# GESP等级：一级 | GESP Python 一级考点
# -*- coding: utf-8 -*-
"""
07第2节4 — if/else 双分支：二选一，必走一条
GESP 考点：#31（双分支结构）、#32（条件判断与分支执行）
=====================================================
课程对应：
  - 00:00-10:00 导入：岔路口游戏——上半屏往下走，下半屏往上走
  - 10:00-30:00 知识点：①if/else语法 ②二选一执行流程 ③if/else vs 两个if
  - 30:00-40:00 演示：if y>0→往下 else→往上 四位置测试
  - 40:00-55:00 实操：①补全if/else ②改颜色 ③多位置测试
  - 55:00-60:00 小测："if/else和两个if有什么区别？"
  - GESP 考点：#31 双分支结构、#32 条件判断与分支执行
  - 记忆钩子："if/else=岔路口，二选一，必走一条" "条件真走if，条件假走else"

运行方式：
  本文件按教学节奏从上到下顺序执行。
  每个环节有 input() 暂停，按 Enter 键进入下一环节。
"""
import turtle
import time

# =====================================================
# 【导入】00:00-10:00  上半屏往下走，下半屏往上走 → 二选一
# =====================================================
print("=" * 55)
print("【导入】岔路口：上半屏往下走，下半屏往上走")
print("=" * 55)
print()
print("想象一下：小乌龟走在一条水平线上。")
print("  如果身处上半屏（y > 0）→ 往下走")
print("  如果身处下半屏（y < 0）→ 往上走")
print("两条路，必须选一条，没有中间选项！")
print()

# =====================================================
# 【知识点】10:00-30:00  if/else 语法
# =====================================================
print("=" * 55)
print("【知识点】if/else = 如果…否则…（两条路必走一条）")
print("=" * 55)
print()
print("语法结构：")
print("  if 条件：")
print("      代码A    ← 条件成立时执行")
print("  else：")
print("      代码B    ← 条件不成立时执行")
print()
print("特点对比：")
print("  ① if/else：无论条件真假，总有一条被执行——二选一")
print("  ② 两个if：每个if独立判断，可能都执行、都不执行")
print()

# =====================================================
# 【演示】30:00-40:00  if y>0 → 往下, else → 往上
# =====================================================
print("=" * 55)
print("【演示】if/else 双分支 — 岔路口二选一")
print("=" * 55)
print()

# 创建海龟
t = turtle.Turtle()
t.speed(3)
t.pensize(3)
t.shape("turtle")

# 画中线（y=0）分界
t.penup()
t.goto(-350, 0)
t.pendown()
t.color("lightgray")
t.goto(350, 0)
t.penup()

# 标注
t.goto(-340, -20)
t.write("下半屏 (y < 0)", font=("Arial", 10, "normal"))
t.goto(-340, 10)
t.write("上半屏 (y > 0)", font=("Arial", 10, "normal"))

# 在四个位置测试：上半屏两个点、下半屏两个点
test_positions = [
    (-200, 100, "A(上半屏)"),    # y > 0
    ( 150,  80, "B(上半屏)"),    # y > 0
    (-150, -90, "C(下半屏)"),    # y < 0
    ( 200, -70, "D(下半屏)"),    # y < 0
]

t.color("black")
t.penup()

for x, y, label in test_positions:
    t.goto(x, y)
    t.pendown()
    t.setheading(0)               # 统一朝右

    # === if/else 双分支：二选一！===
    if t.ycor() > 0:               # 条件：在上半屏
        t.color("blue")
        t.right(90)                # 往下走
        t.forward(80)
        result = "↓ 往下走"
    else:                          # 否则：在下半屏
        t.color("orange")
        t.left(90)                 # 往上走
        t.forward(80)
        result = "↑ 往上走"
    # ================================

    print(f"  位置 {label}  y={y:3d}  →  {result}")

    # 在起点画个标记点
    t.penup()
    t.goto(x, y)
    t.dot(10, "black")

# 总结标语
t.penup()
t.goto(0, -180)
t.color("purple")
t.write("if/else = 岔路口，二选一，必走一条！",
        align="center", font=("Arial", 14, "bold"))

print()
input("按 Enter 键进入实操环节...")
t.clear()
t.penup()
t.home()

# =====================================================
# 【实操①】40:00-45:00  补全 if/else
# =====================================================
print()
print("=" * 55)
print("【实操①】补全 if/else 代码")
print("=" * 55)
print()

t.speed(2)
t.pensize(3)
t.shape("turtle")

# 画背景中线
t.penup()
t.goto(-300, 0)
t.pendown()
t.color("lightgray")
t.goto(300, 0)
t.penup()

print("请在下方补全：当 y > 0 时往下走，否则往上走")
print()

# 测试点：位置 (0, 80) 在上半屏
t.goto(0, 80)
t.pendown()
t.setheading(0)
t.color("red")

# ----- 学生需补全的 if/else 结构（注释提示）-----
if t.ycor() > 0:
    # 补全：让海龟往下走（right(90)，前进60步）
    t.right(90)
    t.forward(60)
    print(f"  位置 (0, {int(t.ycor())})  → 上半屏 → 往下走 ✓")
else:
    # 补全：让海龟往上走（left(90)，前进60步）
    t.left(90)
    t.forward(60)
    print(f"  位置 (0, {int(t.ycor())})  → 下半屏 → 往上走 ✓")
# -------------------------------------------------

t.penup()
t.goto(0, 80)
t.dot(8, "black")

print()
print("✅ 实操①完成！")

input("按 Enter 键继续实操②...")
t.clear()
t.penup()
t.home()

# =====================================================
# 【实操②】45:00-50:00  改条件画出上下不同颜色
# =====================================================
print()
print("=" * 55)
print("【实操②】改条件：不同区域画出不同颜色")
print("=" * 55)
print()

t.speed(2)
t.pensize(5)

# 画背景中线
t.penup()
t.goto(-300, 0)
t.pendown()
t.color("lightgray")
t.goto(300, 0)
t.penup()

print("规则：随机走 8 步，每步根据 y 坐标切换颜色")
print("  y > 0  →  红色")
print("  y <= 0 →  蓝色")
print()

t.goto(-250, -60)    # 起点在下半屏
t.pendown()

for step in range(8):
    # === if/else 控制颜色 ===
    if t.ycor() > 0:
        t.color("red")        # 上半屏红色
        region = "上半屏红"
    else:
        t.color("blue")       # 下半屏蓝色
        region = "下半屏蓝"
    # ========================

    x = t.xcor()
    y = t.ycor()
    print(f"  第{step+1}步  ({x:>4.0f}, {y:>4.0f})  →  {region}")

    # 随机移动：斜着走一段，大概率改变 y 位置
    t.forward(70)
    # 随机上下偏转
    if step % 2 == 0:
        t.left(45)
    else:
        t.right(45)

t.penup()
t.goto(0, -180)
t.color("purple")
t.write("if/else 切换颜色 ✓", align="center", font=("Arial", 14, "bold"))

print()
print("✅ 实操②完成！")

input("按 Enter 键继续实操③...")
t.clear()
t.penup()
t.home()

# =====================================================
# 【实操③】50:00-55:00  改进版：>0 画红, else 画蓝
# =====================================================
print()
print("=" * 55)
print("【实操③】改进版：y > 0 画红色箭头，else 画蓝色箭头")
print("=" * 55)
print()

t.speed(2)
t.pensize(3)
t.shape("turtle")

# 画背景中线
t.penup()
t.goto(-300, 0)
t.pendown()
t.color("lightgray")
t.goto(300, 0)
t.penup()

test_y_values = [50, -50, 100, -100, 30, -30]

print("在多个 y 位置测试 if/else 颜色切换：")
print()

for test_y in test_y_values:
    t.goto(-200, test_y)
    t.pendown()
    t.setheading(0)

    # === 改进版：条件判断画不同颜色 ===
    if test_y > 0:
        t.color("red")          # 大于0 画红色
        t.right(90)
        t.forward(70)
        direction = "↓ 红色向下"
    else:
        t.color("blue")         # else 画蓝色
        t.left(90)
        t.forward(70)
        direction = "↑ 蓝色向上"
    # ================================

    print(f"  y = {test_y:>4d}  →  {direction}")

    t.penup()
    t.goto(-200, test_y)
    t.dot(8, "black")

t.penup()
t.goto(0, -180)
t.color("purple")
t.write("实操③：大于0红色，else蓝色 ✓",
        align="center", font=("Arial", 14, "bold"))

print()
print("✅ 实操③完成！")

input("按 Enter 键进行小测...")
t.clear()
t.penup()
t.home()

# =====================================================
# 【小测】55:00-60:00  if/else 和 两个 if 有什么区别？
# =====================================================
print()
print("=" * 55)
print("【小测】if/else 和 两个 if 有什么区别？")
print("=" * 55)
print()
print("题目：")
print("  if/else 与 两个独立的 if，执行效果有什么不同？")
print()
print("分析对比：")
print()
print("  ┌─────────────────────────────────────────────────────┐")
print("  │  写法 A：if/else                        │")
print("  │    if t.ycor() > 0:                     │")
print("  │        t.right(90)    # 往下              │")
print("  │    else:                                │")
print("  │        t.left(90)     # 往上              │")
print("  │                                          │")
print("  │  → 两个分支互斥，条件真走if，假走else     │")
print("  │  → 且 只执行 其中一条，不会两条都走       │")
print("  └─────────────────────────────────────────────────────┘")
print()
print("  ┌─────────────────────────────────────────────────────┐")
print("  │  写法 B：两个独立的 if                    │")
print("  │    if t.ycor() > 0:                     │")
print("  │        t.right(90)                       │")
print("  │    if t.ycor() <= 0:                    │")
print("  │        t.left(90)                        │")
print("  │                                          │")
print("  │  → 两个条件独立判断，可能走0条、1条、     │")
print("  │     也可能走 2条（但此处条件互斥所以只走1条） │")
print("  │  → 不互斥时（如 if x>0 / if y>0），      │")
print("  │     可能两条都执行                            │")
print("  └─────────────────────────────────────────────────────┘")
print()
print("结论：")
print("  if/else  = 二选一，条件互斥，必选一条")
print("  两个 if  = 各自独立，条件不互斥时可都执行")
print()
print("记忆钩子：")
print("  if/else = 岔路口二选一，必走一条路！")
print()

# 可视化展示区别
t.speed(1)
t.pensize(3)

# 画两条垂直参考线
t.penup()
t.goto(-100, -150)
t.pendown()
t.color("gray")
t.goto(-100, 150)
t.penup()
t.goto(100, -150)
t.pendown()
t.goto(100, 150)
t.penup()

# 标注
t.goto(-130, 130)
t.color("black")
t.write("if/else", font=("Arial", 12, "bold"))
t.goto(80, 130)
t.write("两个if", font=("Arial", 12, "bold"))

# 准备测试：让 y=30（正数）
# 场景 A：if/else → 只会走一条
start_y = 30
t.goto(-100, start_y)
t.pendown()
t.color("green")
t.setheading(0)

if start_y > 0:           # 条件真
    t.right(90)           # 走这条
    t.forward(60)
else:                     # 不走
    t.left(90)
    t.forward(60)

print("  if/else：条件真 → 走了 right(90)，没走 left(90)")

# 场景 B：两个独立 if → 也只会走一条（因为条件互斥）
t.penup()
t.goto(100, start_y)
t.pendown()
t.color("green")
t.setheading(0)

if start_y > 0:
    t.right(90)
    t.forward(60)
    print("  第一个if 成立 → right(90)")

if start_y <= 0:
    t.left(90)
    t.forward(60)
    print("  第二个if 不成立 → 不执行")

# 再来一个演示：非互斥场景，
# 两个独立 if 可能都执行
t.penup()
t.goto(100, -50)
t.pendown()
t.color("purple")
t.setheading(0)

x_val = 50
y_val = 30
# 两个条件不互斥（一个看x，一个看y）
if x_val > 0:
    t.right(90)
    t.forward(40)
    print("  第一个if (x>0) 成立 → right ↓")

if y_val > 0:
    t.left(90)
    t.forward(40)
    print("  第二个if (y>0) 成立 → left ↑  ← 两条都走了！")

print()
print("结论验证：非互斥条件下，两个 if 可以两条都走！")


# =====================================================
# 总结
# =====================================================
print()
print("=" * 55)
print("【课堂总结】")
print("=" * 55)
print()
print("  ◇ if/else = 岔路口，二选一，必走一条")
print("  ◇ if 条件成立 → 执行 if 内的代码")
print("  ◇ if 条件不成立 → 执行 else 内的代码")
print("  ◇ 两个条件判断类问题，用 if/else 最清晰")
print()
print("记忆钩子：")
print("  if/else = 岔路口二选一，必走一条路！")
print("=" * 55)
print()

t.penup()
t.goto(0, -200)
t.color("purple")
t.write("今日总结：if/else = 岔路口，二选一，必走一条！",
        align="center", font=("Arial", 14, "bold"))

turtle.done()
