-
Notifications
You must be signed in to change notification settings - Fork 1
/
game_ai.py
157 lines (142 loc) · 4.26 KB
/
game_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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
def test_horiz(board_layout, test_val):
# _
# return 1 if won
# return 0 if not-won
for row in board_layout:
in_a_row_count = 0
for col in row:
if col == test_val:
in_a_row_count += 1
if in_a_row_count == 4:
return 1
else:
in_a_row_count = 0
def test_vert(board_layout, test_val):
# |
# return 1 if won
# return 0 if not-won
for col in range(7):
in_a_row_count = 0
for row in range(6):
if board_layout[row][col] == test_val:
in_a_row_count += 1
if in_a_row_count == 4:
return 1
else:
in_a_row_count = 0
def test_forward_diag(board_layout, test_val):
# /
# return 1 if won
# return 0 if not-won
for i in range(7):
in_a_row_count = 0
for j in range(6):
try:
if board_layout[5 - j][i + j] == test_val:
in_a_row_count += 1
if in_a_row_count == 4:
return 1
else:
in_a_row_count = 0
except IndexError:
break
for i in range(6):
in_a_row_count = 0
for j in range(6):
try:
if board_layout[i - j][j] == test_val:
in_a_row_count += 1
if in_a_row_count == 4:
return 1
else:
in_a_row_count = 0
except IndexError:
break
def test_back_diag(board_layout, test_val):
# \
# return 1 if won
# return 0 if not-won
for i in range(7):
in_a_row_count = 0
for j in range(6):
try:
if board_layout[j][i + j] == test_val:
in_a_row_count += 1
if in_a_row_count == 4:
return 1
else:
in_a_row_count = 0
except IndexError:
break
for i in range(6):
in_a_row_count = 0
for j in range(6):
try:
if board_layout[i + j][j] == test_val:
in_a_row_count += 1
if in_a_row_count == 4:
return 1
else:
in_a_row_count = 0
except IndexError:
break
#########################################################
# API for machine learning
def apply_action(turn, board, action):
# update the board after applying the action
# turn is int representing player 1 or 2
# board is list
# action is int representing column (0 - 5)
for i in range(5, -1, -1):
if board[i][action] == 0:
if turn == 1:
board[i][action] = 1
break
elif turn == 2:
board[i][action] = 2
break
def get_actions(board):
# return a list of possible actions
avail_actions = []
for i in range(7):
if board[0][i] == 0:
avail_actions.append(i)
return avail_actions
def detect_winner(board, turn):
# return 1 or 2 if either of these players won, or return None
# turn == player turn, but also the value for that player on the board
# test _
if test_horiz(board, turn):
return turn
# test |
if test_vert(board, turn):
return turn
# test /
if test_forward_diag(board, turn):
return turn
# test \
if test_back_diag(board, turn):
return turn
return None
def initialize_board():
# create a new board and return it
return [[0 for x in range(7)] for x in range(6)]
def play_game_ai():
# functions available to you: load_model() and get_model_action(model, board)
# initialize everything
board = initialize_board()
turn = 1
model = load_model()
game_won = False
# play the game!
while not game_won:
avail_actions = get_actions(board)
action = get_model_action(turn, board, model)
apply_action(turn, board, action)
if detect_winner(board, turn):
return turn
else:
if turn == 1:
turn = 2
else:
turn = 1