
上文已经描述了怎么创建和注册一个自定义的gym环境。但是环境类中的4个函数都是空的,本文将描述怎么实现那4个函数,实现一个完整的井字棋游戏的环境。
游戏规则:两个玩家在3x3的棋盘上,一方执X,一方执O。哪方先下的连续3个子(不管在对角,竖直还是水平方向)为胜。(类似五子棋)。赢得一方将会获得+100的奖励。
完整的环境代码访问GitHub。
其中,step函数已经指定了双方下棋的规则,也就是说这个程序不是依靠某个强化学习算法来下棋,而是靠固定规则。因为本系列文章的目的就是要说明如何自定义环境,而不是应用强化学习算法。
def step(self,target):
if self.done==1:
print('game over')
return [self.state,self.reward,self.done,self.add]
elif self.state[int(target/3)][target%3] != '-':
print('invalid step')
return [self.state,self.reward,self.done,self.add]
else:
if(self.counter%2==0):
self.state[int(target/3)][target%3]='o'
else:
self.state[int(target/3)][target%3]='x'
self.counter+=1
if(self.counter==9):
self.done=1
self.render()
win=self.check()
if(win):
self.done=1
print('Player ', win, 'wins. ', sep='',end='\n')
self.add[win-1]=1
if win==1:
self.reward=100
else:
self.reward=-100
return [self.state,self.reward,self.done,self.add]
环境的代码已经写好了,下面我们安装并且注册环境。
pip install -e .
我们编写下面的代码来测试环境。
import gym
import gym_tictac
env = gym.make('tictac-v0')
for e in range(3):
env.reset()
print("######")
print("EPISODE: ", e)
print("######")
for t in range(9):
env.render()
action = t
state, reward, done, info = env.step(action)
print("reward: ", reward)
print("")
env.close()
如果输出是这样
######
EPISODE: 0
######
- - -
- - -
- - -
o - -
- - -
- - -
reward: 0
o - -
- - -
- - -
o x -
- - -
- - -
reward: 0
o x -
- - -
- - -
o x o
- - -
- - -
reward: 0
o x o
- - -
- - -
o x o
x - -
- - -
reward: 0
o x o
x - -
- - -
o x o
x o -
- - -
reward: 0
o x o
x o -
- - -
o x o
x o x
- - -
reward: 0
o x o
x o x
- - -
o x o
x o x
o - -
Player 1wins.
reward: 100
意味着环境已经正确编写并配置。
这个环境已经足够简单了,action是固定规则,我们只是为了阐述自定义gym环境的配置。
下文会讲述gym环境如何结合PyBullet。