Pos = tuple[int, int] Board = dict[Pos, str] # Only "X", "O" and "_" are valid. def read_board_from_file(filename: str) -> Board: """Return a `Board` from a simple text file which contains the current playing field, for example, as follows: XOX OXX ___ """ with open(filename, "r") as f: board = dict() for row, line in enumerate(f): for col, char in enumerate(line): board[(row, col)] = char if char in "XO_" else "_" return board def read_board_from_str(string: str) -> Board: """Return a `Board` from a simple string, which contains the current playing field in a continous form, for example, as follows: XOXOXX___ """ assert 9 == string.count("X") + string.count("O") + string.count("_") board = dict() for row in range(3): for col in range(3): board[(row, col)] = string[row * 3 + col] return board def print_board(board: Board): for row in range(3): for col in range(3): print(board[(row, col)], end="") print() def calculate_score(board: Board, depth: int) -> int: """ Return 10 if X wins, -10 if O wins or 0 if it is a draw or not decideable yet. """ pass def minimax(board: Board, depth: int, max_mode: bool) -> int: """ Use the minimax algorithm to determine if a current game state will (possibly) lead to a win, a lose or a draw. """ pass def return_best_move(board: Board) -> Pos: pass if __name__ == "__main__": board: Board = read_board_from_file("game.txt") print(return_best_move(board))