复制后棋盘和当前回合回到起点
Tic-Tac-Toe 的 `raw_env` 继承 `EzPickle`,复制或 pickle 往返时只按构造参数重建新环境,不保存进行中的棋盘、当前行动者、奖励、终止标记与合法动作掩码。复制对象看似成功,却已经退回初始状态,不能从原局面继续行动。

Farama Foundation 的多智能体强化学习环境库,提供 AEC 与 Parallel API,并收录棋类、Atari 等多种可供训练与评测的环境。Tic-Tac-Toe 是其中一个按智能体轮流行动的 Classic 环境。
构造参数只能重建空环境;完整的复制需要带走 AEC 棋局状态,同时把 pygame 渲染资源留在进程本地。
棋盘、回合、奖励与终止状态都属于运行中的对局
deepcopy(env) → raw_env(render_mode, size)只重放构造参数,无法接着当前局面行动
__getstate__ → __setstate__deepcopy 与 pickle:同一局面,两个独立环境
Tic-Tac-Toe 的 `raw_env` 继承 `EzPickle`,复制或 pickle 往返时只按构造参数重建新环境,不保存进行中的棋盘、当前行动者、奖励、终止标记与合法动作掩码。复制对象看似成功,却已经退回初始状态,不能从原局面继续行动。
复制环境需要保存 AEC 运行状态,而不是重新调用构造器;但 pygame 的 `screen` 和 `clock` 属于当前进程的渲染资源,不能直接随状态序列化。应保留棋局与智能体字段,单独排除渲染对象,并在复制对象再次渲染时按需重建。
移除 `EzPickle`,用 `__getstate__()` 复制环境字典、去掉 `clock` 并将 `screen` 置空;`__setstate__()` 恢复运行字段,并为 human 模式重建时钟。把显示资源初始化抽为 `_initialize_rendering()`,由 `reset()` 与 `render()` 共用,使复制后无需重置棋局也能重新渲染。
`deepcopy` 与 pickle 往返现在都保留中局棋盘、当前行动者、奖励、终止状态、观测和动作掩码;复制对象的 RGB 渲染与原环境一致,继续落子也不会修改原对象。终局测试额外锁定胜负奖励与双方终止标记,避免只修复进行中的局面。