mirror of
https://github.com/sigmasternchen/html-tictactoe
synced 2025-03-15 03:28:55 +00:00
44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
from generator.model import DRAW, NOT_DETERMINED, WIN, LOSS
|
|
|
|
|
|
def transform_board_to_result(board):
|
|
winner = board.winner()
|
|
if winner == DRAW:
|
|
return DRAW
|
|
elif winner == NOT_DETERMINED:
|
|
return NOT_DETERMINED
|
|
elif winner == board.current:
|
|
return WIN
|
|
else:
|
|
return LOSS
|
|
|
|
|
|
def calculate_best_move(board):
|
|
player = board.current
|
|
candidates = []
|
|
|
|
winner = board.winner()
|
|
if winner != NOT_DETERMINED:
|
|
return None, transform_board_to_result(board)
|
|
|
|
for move in board.moves():
|
|
future = board.apply(move)
|
|
|
|
winner = future.winner()
|
|
|
|
if winner == player:
|
|
return move, WIN
|
|
elif winner == DRAW:
|
|
candidates.append((move, DRAW))
|
|
elif winner == NOT_DETERMINED:
|
|
opponent_move = calculate_best_move(future)
|
|
|
|
if opponent_move[1] == DRAW:
|
|
candidates.append((move, DRAW))
|
|
if opponent_move[1] == WIN:
|
|
candidates.append((move, LOSS))
|
|
if opponent_move[1] == LOSS:
|
|
candidates.append((move, WIN))
|
|
|
|
candidates.sort(key=lambda candidate: candidate[1], reverse=True)
|
|
return candidates[0]
|