体育馆/宠物动物园:让 Tic Tac Toe 显示 ansi 文本

问题描述 投票:0回答:1

使用 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",它还会将一个长数组打印到终端。

我只想要我的井字游戏板的文本输出。我错过了什么?

reinforcement-learning openai-gym pettingzoo
1个回答
0
投票

我不清楚为什么窗口会打开,因为我也希望使用

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' ' ' ' ']]
    
© www.soinside.com 2019 - 2024. All rights reserved.