-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathminimax_alg.py
48 lines (38 loc) · 1.64 KB
/
minimax_alg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from math import inf as infinity
from collections import namedtuple
from const import Player
from game import Game
def evaluate(game: Game) -> bool:
if game.finished and game.winner == "o":
return 1
elif game.finished and game.winner == "x":
return -1
else:
return 0
def choose_best_move(game: Game, depth: int, player: Player) -> list:
if player.player_name == "computer":
best = [-1, -1, -infinity]
else:
best = [-1, -1, +infinity]
if depth == 0 or not game.available_fields:
score = evaluate(game)
return [-1, -1, score]
for field in game.available_fields:
new_game = game.copy()
new_game.update_single_field(player.mark, field)
if player.mark == "x" and player.player_name == "computer":
score = choose_best_move(new_game, depth - 1, Player(mark='o', player_name="user"))
elif player.mark == "x" and player.player_name == "user":
score = choose_best_move(new_game, depth - 1, Player(mark='o', player_name="computer"))
elif player.mark == "o" and player.player_name == "computer":
score = choose_best_move(new_game, depth - 1, Player(mark='x', player_name="user"))
elif player.mark == "o" and player.player_name == "user":
score = choose_best_move(new_game, depth - 1, Player(mark='x', player_name="computer"))
score[0], score[1] = field
if player.player_name == "computer":
if score[2] > best[2]:
best = score # max value
else:
if score[2] < best[2]:
best = score # min value
return best