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
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)
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