-
Notifications
You must be signed in to change notification settings - Fork 0
/
tictactoe.py
61 lines (52 loc) · 2.68 KB
/
tictactoe.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
class TicTacToe:
def __init__(self):
self.curr_player_sign = "X" # default value as "X" makes the 1st move
self.grid = [['_', '_', '_'] for _ in range(3)]
self.top, self.mid, self.bot =\
self.grid[0], self.grid[1], self.grid[2]
def print_grid(self):
print(f"{9 * '-'}\n| {' '.join(self.top)} |\n| {' '.join(self.mid)} |\n| {' '.join(self.bot)} |\n{9 * '-'}") # printing symbols separately so it's possible to have a blankspace between each of three sybmols
def switch_player(self):
self.curr_player_sign = "O" if self.curr_player_sign == "X" else "X"
def user_move(self):
try:
row, column = [int(x) - 1 for x in input("Enter the coordinates:").split()]
if self.grid[row][column] in "XO":
print("This cell is occupied! Choose another one!")
self.user_move()
else:
self.grid[row][column] = self.curr_player_sign
self.print_grid()
except ValueError:
print("You should enter numbers!")
return self.user_move()
except IndexError:
print("Coordinates should be from 1 to 3!")
return self.user_move()
def game_rules_validation(self):
""" Tic-Tac-Toe game for 2 players. X moves 1st then O.
The fist who will put own sign 3 time in row, column or horizontally - wins.
In all cells are occupied and there is no winner - it's a "Draw", game will be over with no winner.
"""
empty_cells = sum((self.top.count("_"), self.mid.count("_"), self.bot.count("_")))
if any([self.top[0] == self.top[1] == self.top[2] != "_", # top row
self.mid[0] == self.mid[1] == self.mid[2] != "_", # middle row
self.bot[0] == self.bot[1] == self.bot[2] != "_", # bottom row
self.top[0] == self.mid[0] == self.bot[0] != "_", # left column
self.top[1] == self.mid[1] == self.bot[1] != "_", # middle column
self.top[2] == self.mid[2] == self.bot[2] != "_", # right column
self.top[2] == self.mid[1] == self.bot[0] != "_", # main diagonal
self.top[0] == self.mid[1] == self.bot[2] != "_", # second diagonal
]):
print(f"{self.curr_player_sign} wins")
exit()
elif empty_cells < 1: # at least 1 move left # issue is here, DRAW function is not working
print("Draw")
exit()
if __name__ == '__main__':
game = TicTacToe()
game.print_grid() # print 1st clear grid/field
while True:
game.user_move()
game.game_rules_validation()
game.switch_player()