Skip to content

Instantly share code, notes, and snippets.

@breeko
Last active January 28, 2018 02:15
Show Gist options
  • Save breeko/36d6421ab49c96843f7a7b0ecdfcdc8c to your computer and use it in GitHub Desktop.
Save breeko/36d6421ab49c96843f7a7b0ecdfcdc8c to your computer and use it in GitHub Desktop.
Mini-max with time penalty for tic-tac-toe
class MiniMaxTimeBot:
def __init__(self, time_penalty = -0.01):
""" Returns best move given game and player """
self.time_penalty = time_penalty
self.memo = {}
def play(self, game, player):
return self._mini_max(game, player)[0]
def _mini_max(self, game, player, num_moves=0):
""" Helper function for get_best_move. Returns best move and score given game and player """
if player not in self.memo:
self.memo[player] = {}
player_memo = self.memo[player]
if game not in player_memo:
if game.gameover():
best_move = None
best_score = game.score_game(player)
else:
alt_player = [alt_player for alt_player in game.legal_players if alt_player != player][0]
moves = game.get_moves()
best_score = float("-inf")
for move in moves:
clone = game.copy()
clone.move(player, move)
_, score = self._mini_max(clone, player=alt_player, num_moves=num_moves+1)
score *= -1
score += self.time_penalty * num_moves # Add a time penalty for every move taken
if score > best_score:
best_move = move
best_score = score
self.memo[player][game] = (best_move, best_score)
return self.memo[player][game]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment