井字棋¶

该环境是经典环境的一部分。请先阅读该页面以获取一般信息。
导入 |
|
---|---|
动作 |
离散 |
并行 API |
是 |
手动控制 |
否 |
智能体 |
|
智能体 |
2 |
动作形状 |
(1) |
动作值 |
[0, 8] |
观察形状 |
(3, 3, 2) |
观察值 |
[0,1] |
井字棋是一个简单的回合制策略游戏,其中两名玩家 X 和 O 轮流在 3x3 的格子上标记位置。第一个将自己的标记放置在水平、垂直或对角线上三格相连的玩家获胜。
观察空间¶
观察是一个字典,其中包含一个 'observation'
元素(这是下面描述的常规 RL 观察)和一个 'action_mask'
元素(它包含合法动作,在合法动作掩码部分进行了描述)。
主要观察是 3x3 棋盘的两个平面。对于 player_1,第一个平面代表 X 的放置,第二个平面显示 O 的放置。每个单元格的可能值是 0 或 1;在第一个平面中,1 表示 X 已放置在该单元格中,0 表示 X 未在该单元格中。类似地,在第二个平面中,1 表示 O 已放置在该单元格中,而 0 表示 O 未放置。对于 player_2,观察是相同的,但 X 和 O 交换了位置,因此 O 被编码在平面 1 中,X 被编码在平面 2 中。这允许进行自博弈。
合法动作掩码¶
当前智能体可用的合法动作可以在字典观察的 action_mask
元素中找到。action_mask
是一个二进制向量,向量的每个索引代表该动作是否合法。对于当前回合的智能体以外的任何智能体,action_mask
将全为零。执行非法动作将结束游戏,非法动作的智能体获得 -1 的奖励,所有其他智能体获得 0 的奖励。
动作空间¶
从 0 到 8 的每个动作代表在对应单元格中放置 X 或 O。单元格的索引如下:
0 | 3 | 6
_________
1 | 4 | 7
_________
2 | 5 | 8
奖励¶
赢家 |
输家 |
---|---|
+1 |
-1 |
如果游戏以平局结束,两名玩家都将获得 0 的奖励。
版本历史¶
v3:修复了任意调用 observe() 的错误 (1.8.0)
v2:观察中的合法动作掩码取代了 infos 中的非法动作列表 (1.5.0)
v1:由于采用了新的智能体迭代方案,即所有智能体完成后再进行迭代,所有环境的版本都增加了 (1.4.0)
v0:初始版本发布 (1.0.0)
用法¶
AEC¶
from pettingzoo.classic import tictactoe_v3
env = tictactoe_v3.env(render_mode="human")
env.reset(seed=42)
for agent in env.agent_iter():
observation, reward, termination, truncation, info = env.last()
if termination or truncation:
action = None
else:
mask = observation["action_mask"]
# this is where you would insert your policy
action = env.action_space(agent).sample(mask)
env.step(action)
env.close()
API¶
- class pettingzoo.classic.tictactoe.tictactoe.raw_env(render_mode: str | None = None, screen_height: int | None = 1000)[source]¶
-
- observation_space(agent)[source]¶
接收智能体并返回该智能体的观察空间。
对于相同的智能体名称,必须返回相同的值
默认实现是返回 observation_spaces 字典