# GESP等级：二级 | GESP Python 二级考点
# ============================================
# 第4节：万能多边形——360÷N 公式
# 一个公式画所有正多边形！
# GESP #12 算术运算符(+ - * /)  #for综合
# ============================================

import turtle
t = turtle.Turtle()
t.shape("turtle")
t.speed(5)

# ============================================
# 第一部分：导入——转角从哪里来？
# ============================================

print("=" * 50)
print("【导入】画正三角形——每次转多少度？")
print("=" * 50)

t.penup()
t.goto(-200, 120)
t.pendown()
t.color("red")
t.pensize(3)

print("\n三角形有 3 条边，一圈 360°")
print("每次转角 = 360 ÷ 3 = 120°")
print("验证：120° × 3 次 = 360°，刚好一圈回到原点！\n")

for i in range(3):
    t.forward(100)
    t.right(120)

print("✅ 正三角形完成！转角 120°")

input("\n按回车继续——探索转角的秘密...")

# ============================================
# 第二部分：知识点① 转角 = 360 ÷ 边数
# ============================================

t.clear()
print()
print("=" * 50)
print("【知识点①】转角 = 360 ÷ 边数")
print("=" * 50)

print("\n为什么转角=360÷边数？")
print("  ✅ 海龟走完一个正多边形，总共转了 360°（一圈）")
print("  ✅ 有 N 条边，就要转 N 次")
print("  ✅ 每次转多少？等分：360 ÷ N")
print()

# 列出几个计算例子
print("┌──────────┬──────────────┬──────────────┐")
print("│  边数 N  │  公式        │  每次转角    │")
print("├──────────┼──────────────┼──────────────┤")
print("│  3       │  360 ÷ 3     │  120°        │")
print("│  4       │  360 ÷ 4     │  90°         │")
print("│  5       │  360 ÷ 5     │  72°         │")
print("│  6       │  360 ÷ 6     │  60°         │")
print("│  8       │  360 ÷ 8     │  45°         │")
print("│  10      │  360 ÷ 10    │  36°         │")
print("│  12      │  360 ÷ 12    │  30°         │")
print("└──────────┴──────────────┴──────────────┘\n")

print("记忆钩子：转角=360÷边数！一个公式画所有多边形！")

input("\n按回车继续——认识四种算术运算符...")

# ============================================
# 第三部分：知识点② 完整算术运算符 + - * /
# ============================================

t.clear()
print()
print("=" * 50)
print("【知识点②】Python 算术运算符 + - * /")
print("=" * 50)

print("\nPython 里的加减乘除：")
print()

# 加法
a, b = 100, 50
print(f"  加法 (+)  ：{a} + {b} = {a + b}")

# 减法
print(f"  减法 (-)  ：{a} - {b} = {a - b}")

# 乘法
print(f"  乘法 (*)  ：{a} × {b} = {a * b}")

# 除法
print(f"  除法 (/)  ：{a} ÷ {b} = {a / b}  → 结果是小数！")
print(f"  360 ÷ 3 = {360 / 3}")
print(f"  360 ÷ 5 = {360 / 5}")
print(f"  360 ÷ 8 = {360 / 8}")
print()

print("重点记住：除法 / 的结果是小数（浮点数）")
print("但 turtle.right() 接受小数角度，完全没问题！")

input("\n按回车继续——万能多边形公式登场...")

# ============================================
# 第四部分：知识点③ 万能代码
# ============================================

t.clear()
print()
print("=" * 50)
print("【知识点③】万能多边形代码")
print("=" * 50)

print("""
万能公式三板斧：

  ① 定边数：sides = N           ← 想画几边形？
  ② 算转角：angle = 360 / sides ← 每次转多少？
  ③ 画图形：for i in range(sides):
                forward(size)
                right(angle)

  改一个数字 N，就能画出任何正多边形！
""")

print("代码模板：")
print("-" * 40)
print("sides = 5          # 改成几就是几边形！")
print("angle = 360 / sides")
print("for i in range(sides):")
print("    t.forward(100)")
print("    t.right(angle)")
print("-" * 40)

input("\n按回车继续——演示 N=3 三角形...")

# ============================================
# 第五部分：演示 ① N=3 → 三角形
# ============================================

t.clear()
t.penup()
t.goto(-150, 0)
t.pendown()
t.color("red")
t.pensize(3)

sides = 3
angle = 360 / sides
size = 120

print()
print("=" * 50)
print(f"【演示①】sides = {sides} → 正三角形")
print(f"  angle = 360 ÷ {sides} = {angle}°")
print("=" * 50)

for i in range(sides):
    t.forward(size)
    t.right(angle)

print(f"✅ 正{sides}边形完成！转角 {angle}°")

input("\n按回车继续——演示 N=5 五边形...")

# ============================================
# 第六部分：演示 ② N=5 → 五边形
# ============================================

t.clear()
t.penup()
t.goto(-150, 0)
t.pendown()
t.color("orange")
t.pensize(3)

sides = 5
angle = 360 / sides
size = 100

print()
print("=" * 50)
print(f"【演示②】sides = {sides} → 正五边形")
print(f"  angle = 360 ÷ {sides} = {angle}°")
print("=" * 50)

for i in range(sides):
    t.forward(size)
    t.right(angle)

print(f"✅ 正{sides}边形完成！转角 {angle}°")

input("\n按回车继续——演示 N=12 十二边形...")

# ============================================
# 第七部分：演示 ③ N=12 → 十二边形（接近圆）
# ============================================

t.clear()
t.penup()
t.goto(-200, 0)
t.pendown()
t.color("green")
t.pensize(3)

sides = 12
angle = 360 / sides
size = 50

print()
print("=" * 50)
print(f"【演示③】sides = {sides} → 正十二边形")
print(f"  angle = 360 ÷ {sides} = {angle}°")
print(f"  边数越多，图形越接近圆形！")
print("=" * 50)

for i in range(sides):
    t.forward(size)
    t.right(angle)

print(f"✅ 正{sides}边形完成！转角 {angle}°")
print("看！12条边已经很像一个圆了！")

input("\n按回车继续——来个对比：从3边到12边...")

# ============================================
# 第八部分：对比展示——3, 4, 5, 6, 8, 12
# ============================================

t.clear()
t.penup()
t.goto(-350, 0)
t.pendown()
t.pensize(3)

print()
print("=" * 60)
print("【对比】从三角形到十二边形——边数越多，形状越圆！")
print("=" * 60)

colors = ["red", "orange", "gold", "green", "blue", "purple"]

for i, sides in enumerate([3, 4, 5, 6, 8, 12]):
    angle = 360 / sides
    size = 60
    t.color(colors[i])

    print(f"\n  sides={sides:2d}  angle=360÷{sides}={angle:6.2f}°  ", end="")

    for j in range(sides):
        t.forward(size)
        t.right(angle)

    t.penup()
    t.forward(110)
    t.pendown()

    print(f"✅ 正{sides}边形")

print("\n规律：边数↑ → 转角↓ → 图形越圆润")

input("\n按回车继续——计算挑战！先心算再上机...")

# ============================================
# 第九部分：实操——心算转角
# ============================================

t.clear()
print()
print("=" * 50)
print("【实操①】心算转角——360 ÷ N = ?")
print("=" * 50)

questions = [5, 8, 10, 6, 20]
answers = [360/5, 360/8, 360/10, 360/6, 360/20]

for q, a in zip(questions, answers):
    print(f"\n  360 ÷ {q} = ?")
    print(f"  你的答案：______ 度")
    input(f"  按回车揭晓答案...")
    print(f"  正确答案：360 ÷ {q} = {a}°")
    if a == int(a):
        print(f"           = {int(a)}°（整数！）")
    print()

input("\n按回车继续——补全万能多边形代码...")

# ============================================
# 第十部分：实操②——补全代码
# ============================================

t.clear()
print()
print("=" * 50)
print("【实操②】补全万能多边形代码")
print("=" * 50)

print("""
下面是一段不完整的代码，请你补全填空：

  import turtle
  t = turtle.Turtle()

  sides = 8                # ① 想画____边形？改这个数字！
  angle = ____ / sides     # ② 填空：用哪个算术符？
  size = 80

  for i in range(______):  # ③ 循环几次？（填变量名）
      t.forward(size)
      t.right(_______)     # ④ 每次转多少？（填变量名）

你的填空：
  ① 正 ____ 边形（sides=8）
  ② angle = ____ ÷ sides
  ③ range(________)
  ④ right(________)
""")

input("先想一想，然后按回车看答案...")

print()
print("=" * 40)
print("答案揭晓：")
print("  ① 正 8 边形")
print("  ② angle = 360 / sides")
print("  ③ range(sides)")
print("  ④ right(angle)")
print("=" * 40)

input("\n按回车继续——画正12边形实操...")

# ============================================
# 第十一部分：实操③——画正12边形
# ============================================

t.clear()
t.penup()
t.goto(-150, 0)
t.pendown()
t.pensize(3)
t.color("purple")

sides = 12
angle = 360 / sides
size = 50

print()
print("=" * 50)
print(f"【实操③】用万能公式画正{sides}边形")
print(f"  sides = {sides}")
print(f"  angle = 360 ÷ {sides} = {angle}°")
print("=" * 50)

print("\n  运行代码...")
for i in range(sides):
    t.forward(size)
    t.right(angle)

print(f"\n✅ 正{sides}边形画好了！")
print("转角 30°，转了12次，刚好360°一圈回来！")

# ============================================
# 第十二部分：综合展示——加减乘除全用上
# ============================================

input("\n按回车继续——加减乘除大综合演示...")

t.clear()
t.penup()
t.goto(-380, 100)
t.pendown()
t.pensize(2)

print()
print("=" * 60)
print("【综合】加减乘除 → 画一排渐变多边形")
print("=" * 60)

colors = ["red", "orange", "gold", "green", "blue", "purple", "pink", "brown"]

# 用加法/乘法控制边长递进
base_size = 30
step = 10                  # 每次边长 +10（用加法思想）

for i, sides in enumerate([3, 4, 5, 6, 8, 10, 12, 15]):
    angle = 360 / sides    # 除法：算转角
    size = base_size + i * step   # 乘法+加法：边长递增
    t.color(colors[i % len(colors)])

    print(f"  sides={sides:2d}  size={size:2d}  angle=360÷{sides}={360/sides:5.2f}°")

    for j in range(sides):
        t.forward(size)
        t.right(angle)

    t.penup()
    t.forward(size + 20)
    t.pendown()

print()
print("✅ 一排渐变多边形完成！")
print("用了：+（加法递增边长）×（乘法计算步长）/（除法算转角）")

input("\n按回车继续——小测验！")

# ============================================
# 第十三部分：小测验
# ============================================

t.clear()
print()
print("=" * 50)
print("【小测验】十边形的转角是多少？")
print("=" * 50)

print("""
  题目：正十边形（10条边），每次转角多少度？

  A. 30°
  B. 36°
  C. 40°
  D. 45°
""")

input("选好了吗？按回车看答案...")

print()
print("=" * 40)
print("正确答案：B. 36°")
print()
print("推导过程：")
print("  转角 = 360 ÷ 边数")
print("        = 360 ÷ 10")
print("        = 36°")
print("=" * 40)

# ============================================
# 第十四部分：终极展示——加减乘除创意
# ============================================

input("\n按回车继续——终极展示：加减乘除画螺旋多边形...")

t.clear()
t.penup()
t.goto(0, 0)
t.pendown()
t.speed(0)
t.pensize(2)

print()
print("=" * 60)
print("【终极展示】螺旋多边形——四个运算符齐上阵！")
print("=" * 60)

sides = 5                 # 五边形
angle = 360 / sides       # 除法：转角
size = 10                 # 起始边长
step = 3                  # 每次边长 +3（加法）
repeat = 30               # 重复30圈

print(f"  sides={sides}, 起始size={size}, 每圈+{step}, 共{repeat}圈")
print(f"  angle = 360 ÷ {sides} = {angle}°\n")

t.color("darkblue")

for i in range(repeat * sides):
    t.forward(size)
    t.right(angle)
    size = size + step / sides   # 边长缓慢增加（加法+除法）

print("✅ 螺旋五边形完成！")
print("用到了：")
print("  /  : 360/sides 算转角")
print("  +  : size + step/sides 递增边长")
print("  *  : repeat * sides 控制总步数")
print("  -  : 可以试试把 step 改成负值！")

# ============================================
# 总结
# ============================================

input("\n按回车查看总结...")

t.clear()
print()
print("=" * 50)
print("【本节总结】万能多边形——360÷N 公式")
print("=" * 50)

print("""
  ✅ 转角 = 360 ÷ 边数
     angle = 360 / sides

  ✅ 万能代码模版：
     sides = N           ← 改这里变多边形
     angle = 360 / sides
     for i in range(sides):
         forward(size)
         right(angle)

  ✅ 四种算术运算符：
     +  加法    100 + 50 = 150
     -  减法    100 - 50 = 50
     *  乘法    100 * 50 = 5000
     /  除法    360 / 5  = 72.0

  ✅ 边数越多 → 转角越小 → 图形越圆

  🧠 记忆钩子：
     "转角=360÷边数！一个公式画所有多边形！"
""")

t.hideturtle()
turtle.done()
