|
from dataclasses import dataclass |
|
from enum import Enum |
|
|
|
class Player(Enum): |
|
X = 1 |
|
O = 2 |
|
|
|
@dataclass |
|
class GameBoard: |
|
board: list[list[str]] |
|
|
|
def __post_init__(self): |
|
self.board = [[' ' for _ in range(3)] for _ in range(3)] |
|
|
|
def print_board(self): |
|
for row in self.board: |
|
print(' | '.join(row)) |
|
print('---------') |
|
|
|
def is_valid_move(self, row, col): |
|
return 0 <= row < 3 and 0 <= col < 3 and self.board[row][col] == ' ' |
|
|
|
def make_move(self, row, col, player): |
|
if self.is_valid_move(row, col): |
|
self.board[row][col] = 'X' if player == Player.X else 'O' |
|
return True |
|
return False |
|
|
|
def check_win(self, player): |
|
for i in range(3): |
|
if self.board[i][0] == self.board[i][1] == self.board[i][2] != ' ': |
|
return True |
|
if self.board[0][i] == self.board[1][i] == self.board[2][i] != ' ': |
|
return True |
|
if self.board[0][0] == self.board[1][1] == self.board[2][2] != ' ': |
|
return True |
|
if self.board[0][2] == self.board[1][1] == self.board[2][0] != ' ': |
|
return True |
|
return False |
|
|
|
def is_draw(self): |
|
return all(cell != ' ' for row in self.board for cell in row) |