2v2 Tic-Tac-Toe

Ce script fait partie des projets Python de HyperSkill.

j'ai fait toute la formation python de Hyperskill pendant le Confinement 2020.

# write your code here
class TicTacToe:
def __init__(self):
self.char = ["X", "O"]
self.turn = 0
self.raw_cells = " "
self.cells = [self.raw_cells[i:i + 3] for i in range(0, len(self.raw_cells), 3)]
self.vertical = [[self.cells[i][r] for i in range(3)] for r in range(3)]
self.cells_dict = {k: v for k, *v in zip([3, 2, 1], *self.vertical)}
for _ in self.cells_dict:
self.cells_dict[_] = dict(zip(range(1, len(self.cells_dict[_]) + 1), self.cells_dict[_]))
def update(self, data):
self.raw_cells = ''.join([data[i][x] for i in data for x in data[i]])
self.cells = [self.raw_cells[i:i + 3] for i in range(0, len(self.raw_cells), 3)]
self.vertical = [[self.cells[i][r] for i in range(3)] for r in range(3)]
self.cells_dict = {k: v for k, *v in zip([3, 2, 1], *self.vertical)}
for _ in self.cells_dict:
self.cells_dict[_] = dict(zip(range(1, len(self.cells_dict[_]) + 1), self.cells_dict[_]))
def check_horizontal(self):
check = [set(self.cells[i]) for i in range(3)]
if any(True if i == {' '} else False for i in list(check)):
return False
if any([True if len(set(self.cells[i])) == 1 else False for i in range(3)]):
return [r.pop() for r in check if len(r) == 1]
return False
def check_vertical(self):
check = [set(self.vertical[i]) for i in range(3)]
if any(True if i == {' '} else False for i in list(check)):
return False
if any([True if len(set(self.vertical[i])) == 1 else False for i in range(3)]):
return [r.pop() for r in check if len(r) == 1]
return False
def check_diagonal(self):
numbers = [0, 1, 2], [2, 1, 0]
diagonal_cells = [[self.cells[i][i] for i in numbers[0]],
[self.cells[i][numbers[1][i]] for i in numbers[0]]]
check = [set(diagonal_cells[i]) for i in range(2)]
if any(True if i == {' '} else False for i in list(check)):
return False
if any([True if len(set(diagonal_cells[i])) == 1 else False for i in range(2)]):
return [r.pop() for r in check if len(r) == 1]
return False
def check_victory(self):
hor_check = self.check_horizontal()
if hor_check and len(hor_check) == 1:
return f"{hor_check[0]} wins"
ver_check = self.check_vertical()
if ver_check and len(ver_check) == 1:
return f"{ver_check[0]} wins"
dia_check = self.check_diagonal()
if dia_check and len(dia_check) == 1:
return f"{dia_check[0]} wins"
if all([set(self.raw_cells) == {'X', 'O'},
abs(self.raw_cells.count("X") - self.raw_cells.count("O")) == 1]):
return "Draw"
if any([len(hor_check) > 1 if type(hor_check) is not bool else False,
len(ver_check) > 1 if type(ver_check) is not bool else False,
len(dia_check) > 1 if type(dia_check) is not bool else False]):
return "Impossible"
if abs(self.raw_cells.count("X") - self.raw_cells.count("O")) > 1:
return "Impossible"
return False
def show_table(self):
print("---------\n"
"| {0} {1} {2} |\n"
"| {3} {4} {5} |\n"
"| {6} {7} {8} |\n"
"---------".format(*self.raw_cells))
def ask_player(self):
raw_coordinates = input("Enter the coordinates: ").split(" ")
if not raw_coordinates[0].isdigit() and not raw_coordinates[1].isdigit():
print("You should enter numbers!")
return self.ask_player()
if not all([1 <= int(raw_coordinates[0]) <= 3, 1 <= int(raw_coordinates[1]) <= 3]):
print("Coordinates should be from 1 to 3!")
return self.ask_player()
coordinates = [int(raw_coordinates[0]), int(raw_coordinates[1])]
self.add_entry(*coordinates)
def add_entry(self, x, y):
if self.cells_dict[y][x] != " ":
print("This cell is occupied! Choose another one!")
return self.ask_player()
self.cells_dict[y][x] = self.char[self.turn]
self.turn = int(not self.turn)
self.update(self.cells_dict)
def run(self):
while True:
self.show_table()
victory = self.check_victory()
if victory:
print(victory)
break
self.ask_player()
TicTacToe().run()
view raw tictactoe.py hosted with ❤ by GitHub

cyvax - 2024