-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontrollers.py
111 lines (83 loc) · 2.76 KB
/
controllers.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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from models import Game
from views import GameView
class GameController:
def __init__(self):
self.game = Game()
self.view = GameView()
def run(self):
print(self.view.intro())
while(True):
players = input(self.view.number_of_players())
if players == "1":
self.play(
HumanController(player=1),
ComputerController(player=2)
)
elif players == "2":
self.play(
HumanController(player=1),
HumanController(player=2)
)
else:
print(self.view.number_of_players_error())
continue
break
self.play_again()
def play_again(self):
resp = input(self.view.play_again)
if resp.lower() != 'n':
self.game = Game()
print(self.view.newlines())
self.run()
def play(self, player1, player2):
self.display_board()
for i in range(9):
if i % 2 == 0:
player1.move(self.game)
else:
player2.move(self.game)
self.display_board()
if self.game.is_won():
return self.game_results(player1, player2)
def game_results(self, player1, player2):
if self.game.winner:
if player1.marker == self.game.winner:
print(self.view.win_player(player=1))
elif player2.marker == self.game.winner:
print(self.view.win_player(player=2))
else:
print(self.view.draw())
def display_board(self):
print(self.view.board(self.game.board))
class PlayerController:
def __init__(self, player):
self.player = player
self.view = GameView()
if player == 1:
self.marker = 'X'
self.opponent = 'O'
else:
self.marker = 'O'
self.opponent = 'X'
def move(self, game):
raise NotImplementedError()
class HumanController(PlayerController):
def move(self, game):
while True:
move = input(self.view.next_move(self.player))
try:
move = int(move) - 1
except ValueError:
move = -1
if move not in game.available_positions:
print(self.view.move_not_valid)
else:
break
game.mark(self.marker, move)
class ComputerController(PlayerController):
def move(self, game):
move, _ = game.maximized(self.marker, self.opponent)
game.mark(self.marker, move)
print(self.view.next_move(self.player, move + 1))