示例#1
0
class Play:

    def __init__(self, AIModel, playerRole, inputter=DefaultInputter, displayer=DefaultDisplayer):
        self.aiModel = AIModel
        self.playerRole = playerRole
        self.inputter = inputter
        self.displayer = displayer

    def Start(self):
        self.game = Game()
        while not self.game.IsFull():
            self.displayer(self.game)
            if self.playerRole == self.game.GetCurrentPlayer():
                while True:
                    inputPos = self.inputter()
                    x, y = self.game.PosToXY(inputPos)
                    if self.game.IsEmpty(x, y):
                        break
                    else:
                        print("Place already taken up")
                        continue
            else:
                x, y = Train.GetNextBestMove(self.aiModel, self.game)

            self.game.Play(self.game.GetCurrentPlayer(), x, y)

            if self.game.GetWinner() != Game.EMPTY:
                self.displayer(self.game)
                print("Player %s wins ! " % Game.PLAYER_ATTR[self.game.GetWinner()]['name'])
                break
            elif self.game.IsFull():
                self.displayer(self.game)
                print("It's a tie !")
                break
示例#2
0
 def GetNextMove(model : ModelBase, game : Game, selector):
     # Inputs:
     #   Current game status
     # Outputs:
     #   (row, col) predicted by the model
     prediction = Train.GetPrediction(model, game)
     maxPos = selector(prediction)
     return Game.PosToXY(maxPos)
示例#3
0
    def PlayGames(self, games):
        y_true = np.zeros((self.batch, Game.BOARD_SIZE))
        for i, game in enumerate(games):
            # For each game, calculate y_true
            # which means we will try Game.BOARD_SIZE places and find out whether we will win.
            for pos in range(Game.BOARD_SIZE):
                x, y = Game.PosToXY(pos)
                if game.IsEmpty(x, y):
                    trainedPlayer = game.GetCurrentPlayer()
                    curGame = game.clone()
                    curGame.Play(trainedPlayer, x, y)
                    gameResult, steps = self.PlayGame(curGame)
                    if gameResult == trainedPlayer:
                        gameResult = (1 - 0.7) * ((0.5) ** (2 * (steps - 1) / (Game.BOARD_SIZE - game.steps))) + 0.7
                    else:
                        gameResult = ((steps - 1) / (Game.BOARD_SIZE - game.steps)) * 0.4
                    y_true[i, pos] = gameResult

        return y_true