-
Notifications
You must be signed in to change notification settings - Fork 0
/
game.py
93 lines (66 loc) · 2.64 KB
/
game.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
from ai import AI
from ui import UI
class Game:
welcome_message = '\n{} {} {}\nWrite start to play or exit to quit!'.format(
'-' * 10, 'Tic Tac Toe!', '-' * 10)
winner_message = 'Game Over! Winner is {}'
winning_routes = [[(0, 0), (0, 1), (0, 2)],
[(0, 0), (1, 0), (2, 0)],
[(0, 0), (1, 1), (2, 2)],
[(1, 0), (1, 1), (1, 2)],
[(0, 1), (1, 1), (2, 1)],
[(0, 2), (1, 2), (2, 2)],
[(2, 0), (2, 1), (2, 2)],
[(2, 0), (1, 1), (0, 2)]]
def __init__(self):
self.UI = UI()
self.AI = AI(self.UI.BOARD, self.winning_routes)
self.player = None
self.game_over = False
def input_choice(self):
x = int(self.UI.get_input('x: '))
y = int(self.UI.get_input('y: '))
if self.are_x_y_valid(x, y) or self.UI.BOARD[x][y] != ' ':
raise ValueError
return (x, y)
def are_x_y_valid(self, x, y):
return x >= self.UI.SIZE or y >= self.UI.SIZE or x < 0 or y < 0
def start(self):
while self.game_over is False:
self.UI.print_map()
self.tick()
def tick(self):
try:
choice = self.input_choice()
except ValueError:
self.UI.display('\nInvalid input! Please reenter.\n')
return
self.UI.BOARD[choice[0]][choice[1]] = self.UI.X
if self.is_board_full():
self.trigger_game_over(None)
return
self.AI.attack()
is_there_a_winner = self.check_for_winner()
if is_there_a_winner is not False:
self.trigger_game_over(is_there_a_winner)
return
def check_for_winner(self):
for route in self.winning_routes:
if all(self.UI.BOARD[coords[0]][coords[1]] == self.UI.X for coords in route):
return self.UI.X
if all(self.UI.BOARD[coords[0]][coords[1]] == self.UI.O for coords in route):
return self.UI.O
return False
def is_board_full(self):
return all(all(block != ' ' for block in line) for line in self.UI.BOARD)
def trigger_game_over(self, winner):
self.game_over = True
self.UI.print_map()
self.UI.display(self.winner_message.format('Player' if winner == self.UI.X else
('Enemy' if winner == self.UI.O else winner)))
def go(self):
self.UI.display(self.welcome_message)
if self.UI.get_input('> ') == 'start':
self.start()
if __name__ == '__main__':
Game().go()