使用 Tic Tac Toe 环境:
from pettingzoo.classic import tictactoe_v3
env = tictactoe_v3.env(render_mode="ansi")
env.reset(seed=1)
env.step(1)
print(env.render())
这会输出一个空字符串 '',并且还会启动一个不必要/无法打开的 python 窗口。如果我指定 render_mode=" human",它会在新窗口中正确显示图形板,如果我指定 render_mode="rgb_array",它还会将一个长数组打印到终端。
我只想要我的井字游戏板的文本输出。我错过了什么?
我不清楚为什么窗口会打开,因为我也希望使用
ansi
渲染模式,渲染将在终端中完成。我猜这是井字棋实现中的一些小故障。您似乎正在寻找的是环境的表示state
。然而,根据本文档,并非所有环境都支持这一点 - 请参阅state()
。该文档对这些渲染方法有点误导。
果然,对于井字游戏:
> env.state()
NotImplementedError: state() method has not been implemented in the environment tictactoe_v3.
他们在代码中计算棋盘状态以便能够将其渲染(不幸的是,到一个窗口),但碰巧的是,在这个游戏中,状态等于两个玩家的观察结果,他们在之后看到了整个棋盘每个回合。所以你可以使用它来实现你自己的状态方法。这是我的版本:
import numpy as np
from pettingzoo.classic import tictactoe_v3
env = tictactoe_v3.raw_env(render_mode=None)
env.reset(seed=42)
env.step(0)
env.step(1)
env.step(2)
env.step(3)
env.step(4)
def get_state(env):
obs = env.observe("player_1")["observation"]
rvl = obs.ravel()
arr = np.empty(rvl.shape, int)
arr[::2] = 1
arr[1::2] = 2
rvl *= arr
grp_x = np.array(rvl[::2]).reshape(3, 3).T
grp_o = np.array(rvl[1::2]).reshape(3, 3).T
res = grp_x + grp_o
dct = {1: "X", 2: "O", 0: " "}
return np.vectorize(dct.get)(res)
res = get_state(env)
print(res)
env.close()
结果:
[['X' 'O' ' ']
['O' 'X' ' ']
['X' ' ' ' ']]