Quick actions

cmd+k|ctrl+k

Navigation

Languages

Игра в Крестики-Нолики

Snippet info

Language

Python

Visibility

unlisted

Author

legacy-anonymous

Created

2023-08-29T12:34:07.94844Z

Updated

2023-08-29T12:34:07.94844Z

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!")
INFO