-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathai.py
66 lines (53 loc) · 1.69 KB
/
ai.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from utils import wins, MODE_VS, MODE_AI, MODE_AI_N
COMP = 1
HUMA = -1
DEFAULT_MAX = -10000 # default value when maximising
DEFAULT_MIN = 10000 # default value when minimising
WIN = 10 # win modifier
LOSE = -10 # lose modifier
def empty_cells(grid):
empty = []
for i, row in enumerate(grid):
for j, col in enumerate(row):
if col == None:
empty.append([i, j])
return empty
def evaluate(grid):
if wins(grid, 'X'):
return LOSE
if wins(grid, '0'):
return WIN
else:
return 0
def is_over(grid):
return wins(grid, 'X') or wins(grid, '0')
def minimax(grid, depth, player, alpha, beta):
if depth == 0 or is_over(grid):
return [evaluate(grid), -1, -1]
best = [DEFAULT_MAX, -1, -1] if player == COMP else [DEFAULT_MIN, -1, -1]
for c in empty_cells(grid):
i, j = c[0], c[1]
grid[i][j] = '0' if player == COMP else 'X'
score = minimax(grid, depth-1, -player, alpha, beta)
grid[i][j] = None
score[1], score[2] = i, j
if player == COMP:
if score[0] > best[0]:
best = score
alpha = max(best[0], alpha)
else:
if score[0] < best[0]:
best = score
beta = min(best[0], beta)
if beta <= alpha:
return best
return best
def move(board, mode):
if(mode == MODE_AI_N):
move = random.choice(empty_cells(board.grid))
else:
move = best_move(board.grid, DEFAULT_MAX, DEFAULT_MIN)
board.make_move(move[0], move[1])
def best_move(grid, alpha, beta):
best = minimax(grid, len(empty_cells(grid)), COMP, alpha, beta)
return (best[1], best[2])