Як створити гру в хрестики-нулики на Python?

Давайте створимо просту гру Tic Tac Toe на Python. Це допоможе вам вибудувати логіку гри та зрозуміти, як структурувати код.

Ігри – одна з розваг, які є у людей. Ми можемо знайти різні типи ігор в Інтернеті, на мобільних пристроях, комп’ютерах тощо. Зараз ми тут не для того, щоб створити одну з таких важких ігор. Ми збираємося створити гру CLI хрестики-нулики за допомогою Python.

Якщо ви не знайомі з Tic Tac Toe, пограйте в нього візуально тут зрозуміти. Не хвилюйтеся, навіть якщо ви цього не розумієте, ми це побачимо.

Хрестики-нулики

Підручник поділений на три різні розділи. У першому розділі ви дізнаєтеся, як грати в гру «хрестики-нулики». Після цього ми побачимо алгоритм, який допоможе нам придумати логіку гри. Нарешті ми побачимо структурований код і його пояснення.

Ви можете пропустити перший розділ, якщо ви вже знаєте, як грати в Tic Tac Toe.

Отже, без зайвих слів, давайте зануримося в наш перший розділ.

Гра в Tic Tac Toe

У грі буде двоє гравців. Два знаки представляють кожного гравця. У грі використовуються загальні знаки X і O. Нарешті, буде дошка з 9 коробками.

Подивіться візуально на дошку для хрестиків-нуликів.

Дошка Tic Tac Toe

Геймплей буде наступним.

  • Спочатку один користувач розмістить свій знак в одному з доступних порожніх полів.
  • Далі другий користувач розмістить свій знак в одному з доступних порожніх полів.
  • Мета гравців — розмістити свої відповідні знаки повністю по рядках, по стовпцях або по діагоналі.
  • Гра триває до тих пір, поки гравець не виграє гру або поки вона не завершиться внічию, заповнивши всі поля без виграшного матчу.

Давайте подивимося на деякі ігрові процеси.

Tic Tac Toe Win Геймплей

Гравець X виграє гру у наведеному вище ігровому процесі. Усі поля по діагоналі заповніть знаками X. Отже, відповідний гравець виграє гру.

  Чому я люблю свій Apple Watch

Всього є 8 способів розставити один і той же знак і виграти гру. Давайте подивимося всі 8 схем, які можуть виграти гру.

Хрестики-нулики Переможні композиції

І, нарешті, нічия заповнює дошку без жодного виграшного розташування. Сподіваюся, ви тепер розумієте, як грати в хрестики-нулики.

Тепер для вас час гри. Ви можете йти тут і грайте в неї, щоб повністю зрозуміти ігровий процес. Залиште це, якщо ви його вже отримали.

Тепер настав час перемістити розділ алгоритму.

Алгоритм

Зараз ми обговоримо алгоритм написання коду. Цей алгоритм допоможе вам написати код будь-якою мовою програмування на ваш вибір. Давайте подивимося, як це робиться.

  • Створіть дошку за допомогою 2-вимірного масиву та ініціалізуйте кожен елемент як порожній.
    • Ви можете зобразити порожнє за допомогою будь-якого символу. Тут ми будемо використовувати дефіс. “-“.
  • Напишіть функцію, щоб перевірити, заповнена дошка чи ні.
    • Ітерація по дошці та повернення false, якщо дошка містить порожній знак, або повернення true.
  • Напишіть функцію, щоб перевірити, виграв гравець чи ні.
    • Ми повинні перевірити всі можливості, які ми обговорювали в попередньому розділі.
    • Перевірте всі рядки, стовпці та дві діагоналі.
  • Напишіть функцію для показу дошки, оскільки ми будемо показувати дошку кілька разів користувачам під час гри.
  • Напишіть функцію для запуску гри.
    • Виберіть перший хід гравця випадковим чином.
    • Напишіть нескінченний цикл, який переривається, коли гра закінчується (або перемога, або нічия).
      • Покажіть дошку користувачеві, щоб вибрати місце для наступного ходу.
      • Попросіть користувача ввести номер рядка та стовпця.
      • Оновіть місце відповідним знаком гравця.
      • Перевірте, чи виграв гру поточний гравець чи ні.
      • Якщо поточний гравець виграв гру, надрукуйте повідомлення про виграш і розірвіть нескінченний цикл.
      • Далі перевірте, заповнена дошка чи ні.
      • Якщо поле заповнене, роздрукуйте повідомлення про розіграш і розірвіть нескінченний цикл.
    • Нарешті, покажіть користувачеві остаточний вигляд дошки.

Можливо, ви зможете візуалізувати те, що відбувається. Не хвилюйтеся, навіть якщо ви не до кінця це зрозуміли. Ви отримаєте більше ясності, коли побачите код.

  Як видалити сторінку в Microsoft Word

Отже, перейдемо до розділу коду. Я припускаю, що на вашому ПК встановлено Python, щоб спробувати код.

Код

Перегляньте наведений нижче код.

import random


class TicTacToe:

    def __init__(self):
        self.board = []

    def create_board(self):
        for i in range(3):
            row = []
            for j in range(3):
                row.append('-')
            self.board.append(row)

    def get_random_first_player(self):
        return random.randint(0, 1)

    def fix_spot(self, row, col, player):
        self.board[row][col] = player

    def is_player_win(self, player):
        win = None

        n = len(self.board)

        # checking rows
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[i][j] != player:
                    win = False
                    break
            if win:
                return win

        # checking columns
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[j][i] != player:
                    win = False
                    break
            if win:
                return win

        # checking diagonals
        win = True
        for i in range(n):
            if self.board[i][i] != player:
                win = False
                break
        if win:
            return win

        win = True
        for i in range(n):
            if self.board[i][n - 1 - i] != player:
                win = False
                break
        if win:
            return win
        return False

        for row in self.board:
            for item in row:
                if item == '-':
                    return False
        return True

    def is_board_filled(self):
        for row in self.board:
            for item in row:
                if item == '-':
                    return False
        return True

    def swap_player_turn(self, player):
        return 'X' if player == 'O' else 'O'

    def show_board(self):
        for row in self.board:
            for item in row:
                print(item, end=" ")
            print()

    def start(self):
        self.create_board()

        player="X" if self.get_random_first_player() == 1 else 'O'
        while True:
            print(f"Player {player} turn")

            self.show_board()

            # taking user input
            row, col = list(
                map(int, input("Enter row and column numbers to fix spot: ").split()))
            print()

            # fixing the spot
            self.fix_spot(row - 1, col - 1, player)

            # checking whether current player is won or not
            if self.is_player_win(player):
                print(f"Player {player} wins the game!")
                break

            # checking whether the game is draw or not
            if self.is_board_filled():
                print("Match Draw!")
                break

            # swapping the turn
            player = self.swap_player_turn(player)

        # showing the final view of board
        print()
        self.show_board()


# starting the game
tic_tac_toe = TicTacToe()
tic_tac_toe.start()

Перегляньте зразок виведення коду.

$ python tic_tac_toe.py 
Player X turn
- - -
- - -
- - -
Enter row and column numbers to fix spot: 1 1

Player O turn
X - -
- - -
- - -
Enter row and column numbers to fix spot: 2 1

Player X turn
X - -
O - -
- - -
Enter row and column numbers to fix spot: 1 2

Player O turn
X X -
O - -
- - -
Enter row and column numbers to fix spot: 1 3

Player X turn
X X O
O - -
- - -
Enter row and column numbers to fix spot: 2 2

Player O turn
X X O
O X -
- - -
Enter row and column numbers to fix spot: 3 3

Player X turn
X X O        
O X -        
- - O
Enter row and column numbers to fix spot: 3 2

Player X wins the game!

X X O
O X -
- X O

Деякі основні моменти, які допоможуть вам зрозуміти структуру коду.

  • Ми використали клас, щоб мати всі методи в одному місці. Це також може бути пакетом для багаторазового використання в іншому коді.
  • Далі ми визначили різні функції для кожного обов’язку, навіть якщо це невелике завдання. Це допомагає з легкістю підтримувати код.
  • Наведені вище два підходи допомагають нам легко оновити програму, якщо ми хочемо оновити гру.
  Як зробити будильник гучнішим

Не соромтеся адаптувати структуру та покращувати її на основі вашого проекту. Структурування коду не обмежено.

Заключні слова

Ура! 😎 Ви створили гру повністю з нуля. Це не одна з візуальних ігор, у які ми граємо щодня. Але це допомагає вам писати логіку та підтримувати чисту структуру коду. Дотримуйтесь подібних вказівок, щоб створити такі цікаві ігри. Подібні ігри можна знайти, якщо повернутися на кілька років у дитинство.

Щасливого кодування! 👩‍💻

Далі дізнайтеся, як створити гру вгадування чисел і модульне тестування за допомогою модуля Python unittest.

Вам сподобалось читати статтю? Як щодо того, щоб поділитися зі світом?