強化學習實戰 | 自定義gym環境之顯示字串

埠默笙聲聲聲脈發表於2022-01-08

如果想用強化學習去實現掃雷、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)

效果:

 

相關文章