🔴 观众 🤖 独立使用

💾 第 8 课:江湖存档

第 8 课:💾 江湖存档

🎯 学习目标

  • 掌握文件读写(open / with / read / write)
  • 学会用 json 模块序列化和反序列化数据
  • 掌握异常处理 try / except
  • 实现游戏存档和读档功能

📚 家长预习指南(5 分钟)

本课核心要点

  • with open("file.json", "w") as f: — 安全地打开文件写入(with 会自动关闭文件)
  • json.dump(data, f) — 把 Python 数据变成 JSON 文件保存
  • json.load(f) — 从 JSON 文件读取数据变回 Python
  • try: ... except FileNotFoundError: — 尝试执行,如果报错就优雅处理

您的角色

🔴 观众 — 孩子主导开发,您在旁边提供必要帮助


🔗 Scratch ↔ Python 对照

Scratch 概念 Python 代码 说明
云变量(数据保存) json.dump() / json.load() 保存/读取数据到文件

📖 活动模块

模块 A — 为什么要存档(10 分钟)

目标

引入"数据持久化"的需求

"玩了好几次冒险,关掉程序数据就没了!我们需要一个'存档'功能。"

模块 B — 存档与读档(25 分钟)

目标

实现 save_game() 和 load_game()

import json
from datetime import datetime

def save_game(hero):
    save_data = {"hero": hero, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
    with open("save.json", "w", encoding="utf-8") as f:
        json.dump(save_data, f, ensure_ascii=False, indent=2)
    print("💾 存档成功!")

def load_game():
    try:
        with open("save.json", "r", encoding="utf-8") as f:
            save_data = json.load(f)
        print(f"📂 读档成功!欢迎回来,{save_data['hero']['name']}!")
        return save_data["hero"]
    except FileNotFoundError:
        print("❌ 没有找到存档文件!")
        return None
    except json.JSONDecodeError:
        print("❌ 存档文件损坏!")
        return None

模块 C — 程序启动选择(10 分钟)

目标

游戏开头加入"新游戏/继续冒险"

print("1. 🆕 新游戏")
print("2. 📂 继续冒险")
choice = input("请选择:")
if choice == "2":
    hero = load_game()
    if hero is None:
        # 没有存档,开新游戏

🎮 运行游戏:保存→关闭→重新打开→数据还在!这是本课最大的 fun moment!


🤖 AI 环节(独立使用)

阶段

🔴 独立使用

任务

孩子独立问 AI

示例提示词

Python 的 try-except 是什么意思?帮我用简单的中文解释一下。


✅ 最小完成目标

  • [ ] 实现 save_game() 和 load_game() 函数
  • [ ] 关掉程序重开后数据还在

⭐ 扩展挑战

  • 处理存档损坏(JSONDecodeError)
  • 显示存档时间

🐛 常见错误提示

错误 原因 解决
FileNotFoundError 第一次运行没有存档 用 try-except 处理
中文乱码 没用 UTF-8 编码 open(..., encoding="utf-8")

💻 代码查看

# ==========================================
# 🎮 少年侠客闯江湖 - 第 8 课
# 📚 本课知识点:文件读写、json、try-except
# ==========================================

import random
import json
from datetime import datetime

# --- 游戏数据(同第 7 课)---
monsters = [
    {"name": "狐妖", "hp": 30, "attack": 8, "silver_drop": 10, "item_drop": "狐妖尾毛"},
    {"name": "山魅", "hp": 40, "attack": 12, "silver_drop": 15, "item_drop": "山魅石"},
]
npcs = [
    {"name": "白胡老者", "riddle": "什么东西越长越短?", "answer": "蜡烛", "silver_correct": 15, "silver_wrong": 3},
]

# TODO: 定义 save_game(hero) 函数
# 提示:用 json.dump 把 hero 数据保存到 save.json

# TODO: 定义 load_game() 函数
# 提示:用 try-except 处理 FileNotFoundError

# TODO: 游戏开头添加 "1-新游戏 2-继续冒险" 选择

# (以下为第 7 课的函数和主逻辑)