天天看點

Part 1.2 - 實作一個井字棋遊戲的gym環境

Part 1.2 - 實作一個井字棋遊戲的gym環境

上文已經描述了怎麼建立和注冊一個自定義的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。

繼續閱讀