import random
def print_board(board):
# Выводим текущее состояние доски
for row in board:
print(" ".join(row))
print()
def check_winner(board, player):
# Проверяем, есть ли выигрышные комбинации для данного игрока
# Проверяем строки и столбцы
for row in board:
if all(cell == player for cell in row):
return True
for col in range(3):
if all(board[row][col] == player for row in range(3)):
return True
# Проверяем диагонали
if all(board[i][i] == player for i in range(3)) or all(board[i][2 - i] == player for i in range(3)):
return True
return False
def get_available_moves(board):
# Возвращаем список доступных пустых клеток на доске
return [(row, col) for row in range(3) for col in range(3) if board[row][col] == " "]
def make_move(board, player, row, col):
# Делаем ход игрока на доске
board[row][col] = player
def is_board_full(board):
# Проверяем, заполнена ли доска полностью
return all(board[row][col] != " " for row in range(3) for col in range(3))
def play_game():
# Инициализация доски и игроков
board = [[" " for _ in range(3)] for _ in range(3)]
players = ["X", "O"]
current_player = random.choice(players)
while True:
print_board(board)
print(f"Player {current_player}'s turn.")
if current_player == "X":
# Ход игрока X (человека)
while True:
try:
row, col = map(int, input("Enter row and column (0-2) separated by space: ").split())
if (0 <= row < 3) and (0 <= col < 3) and (board[row][col] == " "):
break
else:
print("Invalid move. Try again.")
except ValueError:
print("Invalid input. Please enter two integers separated by a space.")
print()
else:
# Ход ИИ (случайный выбор из доступных клеток)
available_moves = get_available_moves(board)
row, col = random.choice(available_moves)
make_move(board, current_player, row, col)
if check_winner(board, current_player):
print_board(board)
print(f"Player {current_player} wins!")
break
elif is_board_full(board):
print_board(board)
print("It's a draw!")
break
# Переключение игроков
current_player = "X" if current_player == "O" else "O"
# Запуск игры
play_game()
def test_check_winner():
board1 = [
["X", "X", "X"],
[" ", "O", "O"],
[" ", "O", " "]
]
assert check_winner(board1, "X") == True
board2 = [
["O", "X", "X"],
["O", "X", "O"],
["X", "O", "X"]
]
assert check_winner(board2, "X") == True
board3 = [
["O", "X", "X"],
["X", "O", "O"],
["O", "X", "X"]
]
assert check_winner(board3, "X") == False
def test_get_available_moves():
board = [
["X", " ", "O"],
[" ", "O", "X"],
["X", " ", " "]
]
assert get_available_moves(board) == [(0, 1), (2, 1), (2, 2)]
def test_is_board_full():
board1 = [
["X", "O", "X"],
["O", "X", "O"],
["O", "X", "O"]
]
assert is_board_full(board1) == True
board2 = [
["X", "O", "X"],
["O", "X", "O"],
["O", "X", " "]
]
assert is_board_full(board2) == False
# Запуск тестов
test_check_winner()
test_get_available_moves()
test_is_board_full()
print("All tests passed!")