/
toe.py
134 lines (108 loc) · 2.88 KB
/
toe.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
class Board:
def __init__(self):
self.board = [[' ' for col in range(3)] for row in range(3)]
self.value = None
self.move = None
def get_board(self):
return self.board
def __str__(self):
board = ''
for row in self.board:
board += "|".join(row)+"\n"
return board
def set_board(self,board):
self.board = board
self.value = None
def is_finished(self):
return self.check_three_same() is not None
def set_spot(self, row, col):
if self.board[row][col] ==' ':
self.board[row][col]=self.get_player()
return True
else:
return False
def get_value(self):
if not self.value:
self.update_knowledge()
return self.value
def update_knowledge(self):
winner = self.check_three_same()
if winner:
if winner == 'X':
self.value = 1
else:
self.value = -1
else:
self.value, self.move = self.create_children()
def make_move(self):
if self.is_finished():
print self
print "Game Over!"
return
if not self.move:
found = False
for r in range(len(self.board)):
for c in range(len(self.board)):
if self.set_spot(r,c):
found = True
break
if found:
break
print self
else:
self.set_spot(self.move[0], self.move[1])
print self
self.move = None
self.value = None
def robot_move(self):
self.update_knowledge()
self.make_move()
def get_player(self):
turns = 0
for r in self.board:
for i in r:
if i!=" ":
turns +=1
return 'X' if turns%2==0 else 'O'
def create_children(self):
player = self.get_player()
children_values = []
for row in range(len(self.board)):
for col in range(len(self.board)):
if self.board[row][col] == ' ':
child = Board()
child.set_board([r[:] for r in self.board])
child.set_spot(row,col)
child_value = child.get_value()
children_values.append([child_value, [row, col]])
if not children_values:
return [0, None]
return max(children_values) if player == 'X' else min(children_values)
def three_same(self, ls):
a,b,c = ls
if a == b and b == c:
if a == " ":
return None
else:
return a
else:
return None
def check_three_same(self):
successful_player = None
for row in self.board:
successful_player = successful_player or self.three_same(row)
for col in range(len(self.board)):
successful_player = successful_player or self.three_same([self.board[row][col] for row in range(len(self.board))])
successful_player = successful_player or self.three_same([self.board[0][0],self.board[1][1],self.board[2][2]])
successful_player = successful_player or self.three_same([self.board[0][2],self.board[1][1],self.board[2][0]])
return successful_player
if __name__ == '__main__':
board = Board()
while not board.is_finished():
if board.get_player() == 'X':
row = input("Enter row:")
col = input("Enter column:")
board.move = [row,col]
board.make_move()
else:
board.robot_move()