# GESP等级：一级 | GESP Python 一级考点
# ============================================
# 变量控制turtle —— 改一处，全部生效！
# GESP #16 变量控制turtle
# 记忆钩子："变量=遥控器，改sides改形状""改一处全变"
# ============================================
import turtle
import time

t = turtle.Turtle()
t.shape("turtle")
t.speed(5)

# ============================================
# 第一部分：无变量版（硬编码）—— 改得非常痛苦！
# 痛点唤醒：一个数字改4处，改100边形要改100处！
# ============================================
print("=" * 45)
print("第一部分：无变量版本 —— 硬编码的痛！")
print("=" * 45)
print()
print("画正方形——每个数字都是硬编码：")
print("  t.forward(100)    ← 改边长要改这里")
print("  t.right(90)       ← 改角度要改这里")
print("  t.forward(100)    ← 又要改！")
print("  t.right(90)       ← 又要改！")
print("  ... 4个数字各出现4次 = 改8处！")
print()

# 画无变量版本的正方形
t.penup(); t.goto(-200, 150); t.pendown()
t.color("gray")
t.write("无变量版：改8处！", font=("Arial", 10, "bold"))
t.forward(100); t.right(90)
t.forward(100); t.right(90)
t.forward(100); t.right(90)
t.forward(100); t.right(90)

print("【灵魂一问】画100边形，改几个数字？")
print("→ 100个forward + 100个right = 200处！！")
print()

input("按回车继续——看变量版如何拯救！")

# ============================================
# 第二部分：有变量版 —— 变量=遥控器
# 用 size / sides / angle 三个变量控制画图
# 改一处 → 全部生效！
# ============================================
t.clear()
print()
print("=" * 45)
print("第二部分：有变量版本 —— 改一处全变！")
print("=" * 45)
print()

t.penup(); t.goto(-200, 150); t.pendown()
t.color("blue")
t.write("有变量版：改1处就行！", font=("Arial", 10, "bold"))

size = 100        # 边长 —— 想改大小，只改这里！
sides = 4         # 边数
angle = 90        # 转角

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("size =", size, "  (边长)")
print("sides =", sides, " (边数 → range的次数)")
print("angle =", angle, " (转角)")
print()
print("改size=200 → 所有forward自动变大！")
print("改sides=6  → 循环6次 → 六边形！")
print()
print("【记忆钩子】变量=遥控器——改一处，全部生效！")
print()

input("按回车继续——看改size的神奇效果！")

# ============================================
# 第三部分：改 size —— 改一处，全部变大！
# ============================================
t.clear()
print()
print("=" * 45)
print("第三部分：改size=50 → 全部缩小！")
print("=" * 45)
print()

t.penup(); t.goto(-200, 150); t.pendown()
t.color("green")
t.write("size=50，全部缩小！", font=("Arial", 10, "bold"))

size = 50         # ← 只改这里！全部forward自动变！
sides = 4
angle = 90

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("只把 size=100 改成 size=50")
print("→ 所有 t.forward(size) 自动使用新值 50！")
print("→ 不用改4次，只改1次！")
print()
print("再改成 size=150 试试？→ 全部变大！")
print()

input("按回车继续——改sides变形状！")

# ============================================
# 第四部分：改 sides —— 正方形→六边形→八边形
# 关键是角度也要跟着变！
# ============================================
t.clear()
print()
print("=" * 45)
print("第四部分：改sides → 变形状！")
print("=" * 45)
print()

# --- 4.1：改sides=6，angle没改 → 踩坑 ---
t.penup(); t.goto(-200, 150); t.pendown()
t.color("red")
t.write("踩坑：sides=6但angle=90 → 画歪！", font=("Arial", 10, "bold"))

size = 100
sides = 6          # 改成六边形
angle = 90         # ← 忘了改角度！还是90°

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("踩坑现场！")
print("sides=6（六边形），但angle=90°没改")
print("→ 画出的不是六边形！收不了口！")
print("怎么办？ angle 也要跟着改！")
print("六边形转角 = 360 ÷ 6 = 60°")
print()

input("按回车继续——用360/sides一键拯救！")

# --- 4.2：360/sides 自动算角度 —— 救星！ ---
t.clear()
print()
print("=" * 45)
print("360/sides —— 角度自动算！")
print("=" * 45)
print()

t.penup(); t.goto(-200, 150); t.pendown()
t.color("purple")
t.write("360/sides = 自动算角度！", font=("Arial", 10, "bold"))

size = 100
sides = 6
angle = 360 / sides    # ← 让Python自动算！360÷6=60！

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("sides =", sides)
print("angle = 360 / sides =", angle)
print("→ 完美六边形！")
print()
print("现在把 sides=6 改成 sides=8 —— angle不用改！")
print("360/8=45°，自动算对！")
print()

input("按回车继续——看sides=8的八边形！")

# --- 4.3：sides=8 八边形 ---
t.clear()
t.penup(); t.goto(-200, 150); t.pendown()
t.color("orange")
t.write("sides=8 → 八边形！", font=("Arial", 10, "bold"))

size = 80
sides = 8
angle = 360 / sides    # ← 不用改！自动算！

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("sides =", sides)
print("angle = 360 /", sides, "=", angle)
print("→ 八边形！只改了一个数字 sides=8！")
print()

# --- 4.4：sides=10 十边形 ---
input("按回车继续——sides=10 十边形！")

t.clear()
t.penup(); t.goto(-200, 150); t.pendown()
t.color("cyan")
t.write("sides=10 → 十边形！", font=("Arial", 10, "bold"))

size = 60
sides = 10
angle = 360 / sides

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("sides =", sides)
print("angle = 360 /", sides, "=", angle)
print("→ 十边形！sides=3~100，随便改，角度自动对！")
print()

# --- 4.5：sides=3 三角形 ---
input("按回车继续——sides=3 三角形！")

t.clear()
t.penup(); t.goto(-200, 150); t.pendown()
t.color("pink")
t.write("sides=3 → 三角形！", font=("Arial", 10, "bold"))

size = 150
sides = 3
angle = 360 / sides

for i in range(sides):
    t.forward(size)
    t.right(angle)

print("sides =", sides)
print("angle = 360 /", sides, "=", angle)
print("→ 三角形！改sides=3，角度120°自动算！")
print()

# ============================================
# 第五部分：总结展示 —— 同一代码不同结果
# ============================================
input("按回车继续——总结：同一代码，不同结果！")

t.clear()
t.penup(); t.goto(-200, 100); t.pendown()
t.color("black")
t.write("同一代码，改变量 = 不同形状！", font=("Arial", 12, "bold"))

# 快速展示三排不同sides的图形
t.penup(); t.goto(-250, 50); t.pendown()
for sides in [3, 4, 6, 8, 10]:
    size = 50
    angle = 360 / sides
    t.color(["red", "blue", "green", "orange", "purple"][sides % 5])
    for i in range(sides):
        t.forward(size)
        t.right(angle)

print()
print("=" * 45)
print("总结：变量控制turtle")
print("=" * 45)
print()
print("  ① size/sides/angle = 三个遥控器按钮")
print("  ② 改size = 改大小")
print("  ③ 改sides = 改形状（边数）")
print("  ④ 360/sides = 角度自动算！")
print()
print("【记忆钩子】")
print("  ✅ 变量=遥控器——改sides改形状！")
print("  ✅ 改一处，全部生效！")
print("  ✅ 360/sides——不管sides是几，角度自动对！")
print()

# 最后停留在多个形状的画面上
t.penup(); t.goto(-200, -80); t.pendown()
t.color("black")
t.write("看！同一段代码，sides一变，形状全变！", font=("Arial", 11, "bold"))
turtle.done()
