Last active
December 14, 2022 20:03
-
-
Save alirezapla/5853208be464dbb35e43deea03cf86e9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from dataclasses import dataclass | |
import random | |
@dataclass | |
class States: | |
start: str = "start" | |
gameover: str = "gameover" | |
next: str = "next" | |
class Table: | |
def __init__(self): | |
self.reset_game | |
self.table_status = {"result": States.start} | |
def insert_to_table(self, x: int, y: int, player: str): | |
# print(self.__game_lst, x, y, player) | |
self.__game_lst[x][y] = player | |
if self._gameover_cond == True: | |
self.table_status = {"result": States.gameover, "winner": player} | |
elif not self._check_empty: | |
self.table_status = {"result": States.gameover, "winner": "draw"} | |
self.reset_game | |
else: | |
self.table_status = {"result": States.next} | |
@property | |
def _check_empty(self): | |
rows = [" "] * 3 | |
for i, row in enumerate(self.__game_lst): | |
if " " in row: | |
return True | |
else: | |
rows[i] = 1 | |
if " " in rows: | |
return True | |
return False | |
@property | |
def _gameover_cond(self): | |
if ( | |
self.__game_lst[0][0] == self.__game_lst[1][1] | |
and self.__game_lst[1][1] == self.__game_lst[2][2] | |
and self.__game_lst[2][2] != " " | |
): | |
return True | |
elif ( | |
self.__game_lst[0][2] == self.__game_lst[1][1] | |
and self.__game_lst[1][1] == self.__game_lst[2][0] | |
and self.__game_lst[2][2] != " " | |
): | |
return True | |
elif self._check_rows: | |
return True | |
elif self._check_columns: | |
return True | |
return False | |
@property | |
def _check_rows(self): | |
for row in self.__game_lst: | |
if row[0] == row[1] and row[1] == row[2] and row[2] != " ": | |
return True | |
@property | |
def _check_columns(self): | |
for column in range(3): | |
if ( | |
self.__game_lst[0][column] == self.__game_lst[1][column] | |
and self.__game_lst[1][column] == self.__game_lst[2][column] | |
and self.__game_lst[2][column] != " " | |
): | |
return True | |
@property | |
def get_table(self): | |
return self.__game_lst | |
@property | |
def reset_game(self): | |
self.__game_lst = [] | |
for _ in range(3): | |
self.__game_lst.append([" "] * 3) | |
class Player: | |
def __init__(self, symbol) -> None: | |
if symbol == " ": | |
raise Exception("Not allowed") | |
self.__symbol = symbol | |
@property | |
def get_player_symbol(self): | |
return self.__symbol | |
class XO: | |
def __init__(self, player_1: Player, player_2: Player, table: Table) -> None: | |
self.players = [player_1, player_2] | |
self.table = table | |
self.__turn = None | |
@property | |
def turn_handler(self): | |
current_player=self.whos_turn | |
x, y = self._get_input(current_player) | |
self.table.insert_to_table(x, y, current_player.get_player_symbol) | |
@property | |
def whos_turn(self): | |
if self.__turn == None: | |
self.__turn = random.randint(0, 1) | |
return self.players[self.__turn] | |
self.__turn=int(not(self.__turn)) | |
return self.players[self.__turn] | |
def _get_input(self, player: Player): | |
for row in self.table.get_table: | |
print(row) | |
i = [100, 100] | |
check_empty = True | |
while i[0] > 2 or i[1] > 2 or not check_empty: | |
_input = input( | |
f"player {player.get_player_symbol} insert your position in row(1> <4) `space` column(1> <4) format \n", | |
) | |
result = _input.split(" ") | |
i[0], i[1] = int(result[0]) - 1, int(result[1]) - 1 | |
if self.table.get_table[i[0]][i[1]] != " ": | |
print("already taken") | |
check_empty = False | |
else: | |
check_empty = True | |
return i | |
def game_loop(): | |
player_1 = Player("x") | |
player_2 = Player("y") | |
table = Table() | |
xo_game = XO(player_1, player_2, table) | |
state = table.table_status | |
while state["result"] != States.gameover: | |
xo_game.turn_handler | |
state = table.table_status | |
print(f"winner:{state['winner']}") | |
if __name__ == "__main__": | |
game_loop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment