Skip to content

Instantly share code, notes, and snippets.

@alirezapla
Last active December 14, 2022 20:03
Show Gist options
  • Save alirezapla/5853208be464dbb35e43deea03cf86e9 to your computer and use it in GitHub Desktop.
Save alirezapla/5853208be464dbb35e43deea03cf86e9 to your computer and use it in GitHub Desktop.
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