# GESP等级：一级 | GESP Python 一级考点
"""
第6课·第1节 —— print语法 + 转义字符
课程对应：
  - 00:00-10:00 导入：小乌龟的日记本——print把秘密照出来
  - 10:00-30:00 知识点：print("文字")/print(数字)/print(变量)/逗号拼接/\n\t\\
  - 30:00-40:00 演示：print(t.xcor()) 调试坐标
  - 40:00-55:00 实操：填空补全print / 预测\n\t输出 / 设计个人信息卡
  - 55:00-60:00 小测：\n的作用是？
  - GESP 考点：#27 print 输出语法、转义字符
  - 记忆钩子："文字穿引号 数字光膀子 变量直接用 \\n换行 \\t制表"

运行方式：
  每个函数独立运行，按教学节奏调用。
"""

import turtle
import time


# ============================================================
# 阶段一：导入——小乌龟的日记本（00:00-10:00）
# ============================================================
def demo_intro_print():
    """
    用turtle演示print的调试作用——把turtle的"秘密"照到控制台。
    老师逐行讲解：不用print时，turtle的坐标/方向是"看不见的秘密"。
    """
    print("=" * 60)
    print("🐢 小乌龟的日记本——print把秘密照出来！")
    print("=" * 60)
    print("\n🎯 核心：print 就像手电筒 🔦")
    print("   把程序运行中的值'照'到屏幕上！\n")

    t = turtle.Turtle()
    t.shape("turtle")
    t.speed(3)

    # ========== 第1步：先画几步，不加print ==========
    print("--- 第1步：小乌龟开始画画（你看不到它的内心世界）---\n")
    t.forward(100)
    t.left(90)
    t.forward(50)
    t.left(90)
    t.forward(100)

    print("小乌龟画了一个□，但它的坐标是多少？方向呢？")
    print("这些都是'秘密'——没有print我们就不知道！\n")
    time.sleep(1)

    # ========== 第2步：加上print，照出秘密 ==========
    print("--- 第2步：用print把秘密照出来！---\n")

    t.penup()
    t.goto(-200, 0)
    t.pendown()

    t.forward(100)
    print("📍 x坐标 =", t.xcor())       # 输出当前x坐标
    print("📍 y坐标 =", t.ycor())       # 输出当前y坐标
    print("🧭 方向 =", t.heading())      # 输出当前方向角度
    print()

    t.left(90)
    t.forward(50)
    print("📍 移动后 x =", t.xcor(), "y =", t.ycor())
    print()

    t.left(90)
    t.forward(100)
    print("📍 最终 x =", t.xcor(), "y =", t.ycor())
    print()

    # ========== 第3步：用print看颜色和画笔状态 ==========
    print("--- 第3步：print 还能看颜色和状态！---\n")

    t.color("red")
    print("🎨 画笔颜色:", t.pencolor())

    t.penup()
    print("✏️  画笔状态(按下?):", t.isdown())

    t.pendown()
    print("✏️  画笔状态(按下?):", t.isdown())

    print("\n🎯 总结：print 是调试神器——把秘密全照出来！")
    print("   记忆钩子：文字穿引号 数字光膀子 变量直接用")
    print("            \\n换行 \\t制表")

    turtle.done()


# ============================================================
# 阶段二：知识点讲解演示（10:00-30:00）
# ============================================================
def demo_print_text():
    """知识点①：print("文字")——穿引号"""
    print("=" * 60)
    print("📢 知识点①：print(\"文字\") —— 穿引号 🙌")
    print("=" * 60)
    print()

    # 正确示范
    print("--- ✅ 正确示范 ---")
    print("hello")              # 输出 hello
    print("你好吗？")           # 输出 你好吗？
    print('单引号也可以')       # 输出 单引号也可以
    print()

    # 错误示范（注释掉以免打断课堂节奏）
    # print("--- ❌ 错误示范 ---")
    # print(你好)  # 报错！没有引号，Python 以为"你好"是变量名

    print("💡 规则：文字必须穿引号！")
    print("   print(\"hello\") → hello")
    print("   print(你好) → ❌ 报错：变量名不存在")


def demo_print_number():
    """知识点②：print(数字)——光膀子"""
    print("=" * 60)
    print("📢 知识点②：print(数字) —— 光膀子 💪")
    print("=" * 60)
    print()

    print("--- 直接输出数字 ---")
    print(6)             # 输出 6
    print(3.14)          # 输出 3.14
    print(100)           # 输出 100
    print()

    print("--- 数字运算 ---")
    print(6 + 6)         # 输出 12（先算加法，再输出）
    print(10 - 3)        # 输出 7
    print(3 * 4)         # 输出 12
    print(10 / 3)        # 输出 3.3333333333333335
    print()

    print("--- 对比：有引号 vs 无引号 ---")
    print(6 + 6)         # 输出 12（数字加法）
    print("6" + "6")     # 输出 66（字符串拼接）
    print()

    print("💡 规则：数字直接写（光膀子），不要加引号！")


def demo_print_variable():
    """知识点③：print(变量名)——直接用"""
    print("=" * 60)
    print("📢 知识点③：print(变量名) —— 直接用 🧠")
    print("=" * 60)
    print()

    name = "小明"
    age = 10
    height = 1.45

    print("--- 输出变量值 ---")
    print(name)          # 输出 小明（变量name的值）
    print(age)           # 输出 10（变量age的值）
    print(height)        # 输出 1.45（变量height的值）
    print()

    print("--- 核心对比：有引号 vs 无引号 ---")
    print(name)          # 输出 小明（变量name的值）
    print("name")        # 输出 name（字母 n-a-m-e，是字符串！）
    print()

    print("💡 规则：print(name) 输出变量的值，print(\"name\") 输出文字 name！")
    print("   变量名直接写（不加引号），文字必须穿引号！")


def demo_print_comma():
    """知识点④：逗号拼接"""
    print("=" * 60)
    print("📢 知识点④：逗号拼接 —— 👉👉👉")
    print("=" * 60)
    print()

    print("--- 基本用法 ---")
    print(1, 2, 3)             # 输出 1 2 3
    print("a", "b", "c")       # 输出 a b c
    print("x =", 100)          # 输出 x = 100
    print()

    print("--- 混搭不同类型 ---")
    print("名字:", "小明", "年龄:", 10)
    print("结果:", 6 + 6, "是对的")
    print()

    print("--- 逗号拼接 vs 加号拼接 ---")
    print("逗号拼接:", 1, 2, 3)          # 有空格：1 2 3
    print("加号拼接:", "1" + "2" + "3")  # 无空格：123
    print()

    print("💡 规则：逗号隔开多个内容，输出时自动加空格！")
    print("   print(\"a\", \"b\", \"c\") → a b c")


def demo_escape_characters():
    """知识点⑤：转义字符——\\n \\t \\\\"""
    print("=" * 60)
    print("📢 知识点⑤：转义字符 —— \\n换行 ↘️  \\t制表 🤚  \\\\反斜杠 ✖️")
    print("=" * 60)
    print()

    # === \n 换行 ===
    print("--- ① \\n 换行 ---")
    print("第1行\n第2行")
    print()
    print("Hello\nWorld")
    print()

    print("💡 \\n 是'换行指令'——不是一个普通的字母 n！")
    print("   写 \\n 的地方，输出时会换到下一行")
    print()

    # === \t 制表符 ===
    print("--- ② \\t 制表符 ---")
    print("a\tb\tc")
    print("1\t2\t3")
    print()

    print("--- \\t 对齐效果：做表格 ---")
    print("姓名\t年龄\t班级")
    print("小明\t10\t501")
    print("小红\t11\t502")
    print("小刚\t9\t503")
    print()

    print("💡 \\t 跳到下一个制表位——相当于按 Tab 键！")
    print("   可以用来对齐列")
    print()

    # === \\ 反斜杠 ===
    print("--- ③ \\\\ 输出反斜杠 ---")
    print("\\")                   # 输出 \
    print("C:\\Users\\小明\\Documents")
    print()

    print("--- 对比：\\n vs \\\\n ---")
    print("\\n 是换行 →", end="")
    print("第一行\n第二行")
    print("\\\\n 是普通 \\n →", end="")
    print("第一行\\n第二行")
    print()

    print("💡 规则：反斜杠是'魔法开关'，想输出真正的反斜杠要写两个！")
    print("   \\\\  = 一个反斜杠")


def demo_all_in_one():
    """综合演示——一条龙展示所有知识点"""
    print("=" * 60)
    print("📢 综合演示：print 5种用法大集合")
    print("=" * 60)
    print()

    # ① print("文字")
    print("① print(\"文字\") →", end=" ")
    print("hello")

    # ② print(数字)
    print("② print(数字) →", end=" ")
    print(2024)

    # ③ print(变量)
    x = 100
    print("③ print(变量) →", end=" ")
    print(x)

    # ④ 逗号拼接
    print("④ 逗号拼接 →", end=" ")
    print("x =", x, "y =", 200)

    # ⑤ 转义字符
    print("⑤ 转义字符 →")
    print("   第一行\n   第二行")
    print("   a\tb\tc")
    print("   C:\\Users\\Student")

    print()
    print("🎯 记忆钩子：文字穿引号 数字光膀子 变量直接用")
    print("           逗号拼接空格连 \\n换行 \\t制表 \\\\反斜杠")


# ============================================================
# 阶段三：上机演示——print调试坐标（30:00-40:00）
# ============================================================
def demo_debug_turtle():
    """
    演示 print 在 turtle 调试中的核心作用。
    用 print(t.xcor()) 实时查看坐标变化。
    """
    print("=" * 60)
    print("🐢 演示：print 调试坐标——turtle 的秘密全照出来！")
    print("=" * 60)
    print()

    t = turtle.Turtle()
    t.shape("turtle")
    t.speed(2)

    print("--- 画一个正方形，每一步都输出坐标 ---\n")

    # 画一个正方形，每走一步都打印坐标
    side_length = 100
    for step in range(4):
        t.forward(side_length)
        print(f"步骤{step + 1}: x = {t.xcor():.0f}, y = {t.ycor():.0f}, 方向 = {t.heading():.0f}°")
        t.left(90)

    print()
    print("🎯 看到了吗？每一步 turtle 的坐标都在变化！")
    print("   print 把这些'看不见的秘密'全部照到了屏幕上！")
    print("   这就是调试——用 print 看程序运行过程中发生了什么\n")

    # 演示 print("x:{t.xcor()}") 控制台显示
    print("--- 进阶：用 f-string 格式化输出 ---")
    t.penup()
    t.goto(-200, -100)
    t.pendown()

    for i in range(3):
        t.forward(80)
        t.left(120)
        print(f"三角形顶点{i + 1}: ({t.xcor():.0f}, {t.ycor():.0f})")

    print()
    print("💡 用 f-string 可以像填空一样把变量值嵌入字符串！")
    print("   下一节课我们会详细学习 f-string ✨")

    turtle.done()


def demo_print_format_vs_raw():
    """
    演示 print 的格式化输出 vs 原始输出。
    用于对比 f-string 和普通 print 的区别。
    """
    print("=" * 60)
    print("📢 补充：print 格式化 vs 原始输出")
    print("=" * 60)
    print()

    x = 100
    y = 200
    name = "小乌龟"

    # 方式1：逗号拼接
    print("方式1（逗号拼接）:", "x =", x, "y =", y)

    # 方式2：加号拼接（只能连接字符串）
    print("方式2（加号拼接）:", "x = " + str(x) + ", y = " + str(y))

    # 方式3：f-string
    print(f"方式3（f-string）: x = {x}, y = {y}")

    print()
    print("💡 三种方式都能输出，f-string 最直观易懂！")


# ============================================================
# 阶段四：实操——练习参考答案（40:00-55:00）
# ============================================================
def demo_practice_answers():
    """实操练习的参考答案输出"""
    print("=" * 60)
    print("📝 实操练习参考答案")
    print("=" * 60)
    print()

    # === 练习1：填空补全print ===
    print("--- 练习1：填空补全print ---")
    # ① 输出文字
    print("① 输出文字:", "你好，Python！")
    # ② 输出数字
    print("② 输出数字:", 2024)
    # ③ 输出变量
    name = "小乌龟"
    print("③ 输出变量:", name)
    # ④ 逗号拼接
    print("④ 逗号拼接:", 1, 2, 3, 4, 5)
    # ⑤ 换行
    print("⑤ 换行:")
    print("第1行\n第2行")
    print()

    # === 练习2：预测输出 ===
    print("--- 练习2：预测转义字符输出 ---")
    print("题目A: print(\"Hello\\nWorld\")")
    print("输出:")
    print("Hello\nWorld")
    print()

    print("题目B: print(\"a\\tb\\tc\")")
    print("输出:")
    print("a\tb\tc")
    print()

    print("题目C: print(\"C:\\\\Users\\\\小明\")")
    print("输出:")
    print("C:\\Users\\小明")
    print()

    print("题目D: print(\"1\\n2\\t3\")")
    print("输出:")
    print("1\n2\t3")
    print()

    # === 练习3：个人信息卡 ===
    print("--- 练习3：个人信息卡 ---")
    print("=" * 30)
    print("      我的个人信息")
    print("=" * 30)
    print("姓名\t年龄\t身高\t喜欢的科目")
    print("小明\t10\t1.45\t编程")
    print("小红\t11\t1.52\t美术")
    print("小刚\t9\t1.38\t科学")
    print("=" * 30)


# ============================================================
# 阶段五：小测（55:00-60:00）
# ============================================================
def demo_quiz():
    """小测题目及正确答案"""
    print("=" * 60)
    print("📝 小测：\\n 的作用是？")
    print("=" * 60)
    print()
    print("正确答案：")
    print("  \\n 是换行符（换行指令）")
    print("  写在字符串里，输出时会在 \\n 的位置换到下一行")
    print()
    print("  例子：")
    print("  print(\"第1行\\n第2行\")")
    print("  → 第1行")
    print("  → 第2行")
    print()
    print("  身体动作：手肘下压 ↘️  齐喊：换行！")
    print()
    print("--- 记忆钩子全文 ---")
    print("  文字穿引号  🙌  双手比引号")
    print("  数字光膀子  💪  拍拍胳膊")
    print("  变量直接用  🧠  指指脑袋")
    print("  逗号来拼接  👉👉👉 手指点三下")
    print("  \\n 换行     ↘️  手肘下压")
    print("  \\t 制表     🤚  四指并拢")
    print("  \\\\ 反斜杠   ✖️  双倍斜杠")


# ============================================================
# 入口
# ============================================================
if __name__ == "__main__":
    print("🐢 第6课·第1节 —— print语法 + 转义字符")
    print("=" * 60)
    print()
    print("请选择要运行的功能：")
    print("  1  - 导入：小乌龟的日记本（00:00-10:00）")
    print("  2  - 知识点①：print(\"文字\") 穿引号")
    print("  3  - 知识点②：print(数字) 光膀子")
    print("  4  - 知识点③：print(变量) 直接用")
    print("  5  - 知识点④：逗号拼接")
    print("  6  - 知识点⑤：转义字符 \\n \\t \\\\")
    print("  7  - 综合演示：5种用法大集合")
    print("  8  - 演示：print调试turtle坐标（30:00-40:00）")
    print("  9  - 演示：格式化 vs 原始输出")
    print("  10 - 实操练习参考答案（40:00-55:00）")
    print("  11 - 小测答案（55:00-60:00）")
    print()

    try:
        choice = int(input("请输入数字 (1-11)，直接回车默认 7: ") or "7")
    except (ValueError, EOFError):
        choice = 7

    print()

    functions = {
        1: demo_intro_print,
        2: demo_print_text,
        3: demo_print_number,
        4: demo_print_variable,
        5: demo_print_comma,
        6: demo_escape_characters,
        7: demo_all_in_one,
        8: demo_debug_turtle,
        9: demo_print_format_vs_raw,
        10: demo_practice_answers,
        11: demo_quiz,
    }

    func = functions.get(choice)
    if func:
        func()
    else:
        print("无效选择，运行综合演示")
        demo_all_in_one()
