# GESP等级：一级 | GESP Python 一级考点
# ============================================
# 第5节：嵌套循环——循环里面套循环
# GESP #11 嵌套循环
# 记忆钩子："外层管几个,内层管什么""嵌套=乐高拼装"
# ============================================

import turtle
t = turtle.Turtle()
t.shape("turtle")
t.speed(8)

# ===== 第一步：用print理解嵌套循环的执行顺序 =====
print("=" * 60)
print("【知识点①】理解嵌套循环的执行顺序")
print("口诀：外层一次 → 内层完整 → 外层一次 → 内层完整")
print()

for j in range(3):                # 外层3次
    print("===== 外层第", j, "次 =====")
    for i in range(4):            # 内层4次
        print("  内层第", i, "次")
    print("===== 内层结束 =====")
    print()

print("观察到了吗？不是'外1→内1→外2→内2'交替！")
print("而是 外层1步 → 内层完整4步 → 外层1步 → 内层完整4步！")
print("总次数 = 外层3次 × 内层4次 =", 3 * 4, "次")
print()

input("按回车继续...")

# ===== 第二步：画12个正方形围一圈 =====
t.clear()
print()
print("=" * 60)
print("【知识点②】画12个正方形围一圈——嵌套循环经典案例")
print("分析：")
print("  外层：画12次 → range(12)")
print("  内层：每次画一个正方形（4条边）→ range(4)")
print("  转角：360° ÷ 12 = 30°")
print()

# 先设好初始位置
t.penup()
t.goto(0, -80)
t.pendown()

# 红色大圆点标记中心
t.dot(5, "red")

for j in range(12):               # 外层：画12次
    t.color("blue")
    for i in range(4):            # 内层：画一个正方形
        t.forward(50)
        t.right(90)
    t.right(30)                   # 画完一个，转30°（360÷12=30°）

print("12个正方形围一圈——完成！")
print("如果改成 range(24)，就画24个，转角改15°")
print()

input("按回车继续...")

# ===== 第三步：画8个三角形围一圈（学生实操演示）=====
t.clear()
print()
print("=" * 60)
print("【实操示范】画8个三角形围一圈")
print()

# 颜色列表
colors = ["red", "orange", "gold", "green",
          "blue", "purple", "pink", "cyan"]

t.penup()
t.goto(0, -100)
t.pendown()

for j in range(8):                # 外层：画8个三角形
    t.color(colors[j % 8])        # 每个三角形不同颜色
    t.begin_fill()                # 开始填充
    for i in range(3):            # 内层：每个三角形3条边
        t.forward(60)
        t.right(120)
    t.end_fill()                  # 结束填充
    t.right(45)                   # 转45°（360÷8=45°）

print("8个三角形围一圈！颜色各不相同！")
print()

input("按回车继续...")

# ===== 第四步：执行次数计算演示 =====
t.clear()
print()
print("=" * 60)
print("【知识点③】总次数 = 外层 × 内层")
print()

# 用计数变量验证
total = 0
for j in range(5):                # 外层5次
    for i in range(3):            # 内层3次
        total = total + 1
print("外层5次 × 内层3次 =", total, "次（total最终值）")
print("公式：外层次数 × 内层次数 = 总执行次数")
print()

# 进阶：观察 j 和 i 变化速度
print("【进阶观察】外层变化慢，内层变化快")
for j in range(3):
    for i in range(4):
        print("  (j=", j, ", i=", i, ")", sep="", end="")
    print()                       # 每轮内层结束换行

print()
print("看到规律了吗？")
print("j（外层）变化慢——0,0,0,0 → 1,1,1,1 → 2,2,2,2")
print("i（内层）变化快——0,1,2,3 → 0,1,2,3 → 0,1,2,3")
print("内层每轮都从0重新开始！")
print()

input("按回车继续...")

# ===== 第五步：拓展——画不同图形围一圈 =====
t.clear()
print()
print("=" * 60)
print("【拓展挑战】修改外层和内层——创造新图案！")
print()

# 画6个六边形围一圈
t.penup()
t.goto(0, -80)
t.pendown()
t.width(2)

for j in range(6):                # 外层：画6个六边形
    t.color("darkgreen")
    for i in range(6):            # 内层：六边形6条边
        t.forward(40)
        t.right(60)
    t.right(60)                   # 转角 360÷6=60°

print("6个六边形围一圈！")
print("思考：如果想画 n 个 m 边形围一圈，怎么写？")
print("  外层 range(n)，转角 360/n")
print("  内层 range(m)，转角 360/m")
print()

input("按回车继续...")

# ===== 第六步：陷阱演示——忘记转角度 =====
t.clear()
print()
print("=" * 60)
print("【陷阱演示】忘记转角度会怎样？")
print()

t.penup()
t.goto(0, 0)
t.pendown()
t.color("red")

for j in range(8):
    for i in range(4):
        t.forward(40)
        t.right(90)
    # 故意不加 right(45) —— 所有正方形重叠！

print("看到只有一个正方形？")
print("因为每次画完没有转角度——所有正方形都画在同一个位置！")
print("记住：**画完一个 → 转角度 → 画下一个**！")
print()

# 展示正确的：同样的代码多一个转角
t.penup()
t.goto(150, 0)
t.pendown()
t.color("blue")

for j in range(8):
    for i in range(4):
        t.forward(40)
        t.right(90)
    t.right(45)                   # ✅ 加了转角

print("右边蓝色是加了转角的——8个正方形围成一圈！")
print("对比鲜明！")
print()

input("按回车继续...")

# ===== 总次数小测验 =====
t.clear()
print()
print("=" * 60)
print("【小测验】GESP嵌套循环真题")
print()

print("题1：外层6次，内层4次，内层代码总执行次数？")
print("  答案：", 6 * 4, "次（6×4）")
print()
print("题2：以下代码输出什么？")
print("  count = 0")
print("  for j in range(4):")
print("      for i in range(5):")
print("          count = count + 1")
print("  print(count)")
print("  答案：", 4 * 5, "（4×5=20）")
print()
print("题3：以下代码画什么？")
print("  for j in range(6):")
print("      for i in range(3):")
print("          forward(50); right(120)")
print("      right(60)")
print("  答案：6个三角形围成一圈")
print()

# ===== 思维总结 =====
print("=" * 60)
print("嵌套循环 核心总结")
print()
print("① 外层管'几个'，内层管'什么'")
print("② 顺序：外层一次 → 内层完整 → 外层一次 → 内层完整")
print("③ 总次数 = 外层 × 内层")
print("④ 外层变化慢，内层变化快")
print("⑤ 画完一个图形记得转角度，否则全部重叠！")
print()
print("记忆钩子：")
print("  '外层管几个,内层管什么'")
print("  '嵌套=乐高拼装'")
print("  '总次数=外层×内层'")
print()

t.hideturtle()
turtle.done()
