您的位置:首页 > 其它

强化学习实战 | 自定义Gym环境之显示字符串

2022-01-08 19:12 134 查看

如果想用强化学习去实现扫雷、2048这种带有数字提示信息的游戏,自然是希望自定义 gym 环境时能把字符显示出来。上网查了很久,没有找到gym自带的图形工具Viewer可以显示字符串的信息,反而是通过pyglet

import pyglet
from gym.envs.classic_control import rendering

class DrawText:
def __init__(self, label:pyglet.text.Label):
self.label=label
def render(self):
self.label.draw()

screen_width = 500
screen_height = 500

viewer = rendering.Viewer(screen_width, screen_height + 20)
text = 'hello world'
label = pyglet.text.Label(text, font_size=36,
x=100, y=250, anchor_x='left', anchor_y='bottom',
color=(255, 123, 255, 255))
label.draw()
viewer.add_geom(DrawText(label))
viewer.render(return_rgb_array=False)

其中,lable的坐标x y是以左下两边为x y轴(而Viewer是以左上边为轴,这意味着显示图案和文字还得用两套坐标系...),anchor_x 和 anchor_y 指的是label对象的锚点,即如何将label对象视为一个点,有top / bottom / center / baseline四种选择。

效果:

再配合 Python动态变量名定义与调用 的方法,就可以批量地显示字符串了:

import pyglet
from gym.envs.classic_control import rendering

class DrawText:
def __init__(self, label:pyglet.text.Label):
self.label=label
def render(self):
self.label.draw()

screen_width = 500
screen_height = 500
viewer = rendering.Viewer(screen_width, screen_height)

for i in range(10):
for j in range(10):
exec('label_{}_{} = {}'.format(i, j, None))
names = locals()
names['label_' + str(i) + '_' + str(j)] = pyglet.text.Label('{}'.format(j), font_size=15,
x=i*50+25, y=j*50+25, anchor_x='left', anchor_y='bottom',
color=(i*10, i*20, i*25, 255))
label = names['label_{}_{}'.format(i, j)]
label.draw()
viewer.add_geom(DrawText(label))

viewer.render(return_rgb_array=False)

其中,locals() 是程序运行过程中存放了所有局部变量名和对应值的字典。

效果:

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐