Как создать игру в крестики-нолики на Python?

Опубликовано: 2021-08-19

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

Игры - одно из развлечений, которые есть у людей. Мы можем найти разные типы игр в Интернете, мобильные, настольные и т. Д. Мы здесь не для того, чтобы делать одну из этих тяжелых игр сейчас. Мы собираемся создать игру в крестики-нолики с интерфейсом командной строки, используя Python.

Если вы не знакомы с Tic Tac Toe, поиграйте здесь визуально, чтобы понять. Не волнуйтесь, даже если вы этого не понимаете, мы это увидим.

Крестики-нолики

Учебник разделен на три разных раздела. В первом разделе вы узнаете, как играть в крестики-нолики. После этого мы увидим алгоритм, который поможет нам придумать логику игры. Наконец, мы увидим структурированный код и его объяснение.

Вы можете пропустить первый раздел, если уже знаете, как играть в крестики-нолики.

Итак, без лишних слов, давайте погрузимся в наш первый раздел.

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

В игре будет два игрока. Два знака представляют каждого игрока. Общие знаки, используемые в игре, - X и O. Наконец, будет доска с 9 ящиками.

Визуально посмотрите на доску для игры в крестики-нолики.

Доска для крестиков-ноликов
Доска для крестиков-ноликов

Геймплей будет следующим.

  • Сначала один пользователь поместит свой знак в одно из доступных пустых полей.
  • Затем второй пользователь поместит свой знак в одно из доступных пустых полей.
  • Цель игроков - разместить соответствующие знаки по строкам, столбцам или по диагонали.
  • Игра продолжается до тех пор, пока игрок не выиграет игру или не закончится ничья, заполнив все поля без выигрышного матча.

Посмотрим на некоторые игровые процессы визуально.

Крестики-нолики выиграть геймплей
Крестики-нолики выиграть геймплей

Игрок X выигрывает игру в вышеупомянутом игровом процессе. Все поля по диагонали заполните знаками X. Таким образом, соответствующий игрок выигрывает игру.

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

Выигрышные комбинации для крестиков-ноликов
Выигрышные комбинации для крестиков-ноликов

И, наконец, ничья заполняет доску без каких-либо выигрышных схем. Надеюсь, вы теперь понимаете, как играть в крестики-нолики.

Теперь это время для игр. Вы можете пойти сюда и поиграть, чтобы полностью понять игровой процесс. Оставьте, если он у вас уже есть.

Теперь пора переместить раздел алгоритмов.

Алгоритм

Теперь обсудим алгоритм написания кода. Этот алгоритм поможет вам написать код на любом языке программирования по вашему выбору. Посмотрим, как это делается.

  • Создайте доску, используя двумерный массив, и инициализируйте каждый элемент как пустой.
    • Вы можете изобразить пустоту любым понравившимся символом. Здесь мы будем использовать дефис. '-' .
  • Напишите функцию, чтобы проверять, заполнена ли доска или нет.
    • Перебрать доску и вернуть false если на доске есть пустой знак, или вернуть true .
  • Напишите функцию, чтобы проверять, выиграл игрок или нет.
    • Мы должны проверить все возможности, которые мы обсуждали в предыдущем разделе.
    • Проверьте все строки, столбцы и две диагонали.
  • Напишите функцию для отображения доски, поскольку мы будем показывать доску несколько раз пользователям, пока они играют.
  • Напишите функцию для запуска игры.
    • Случайным образом выбираем первый ход игрока.
    • Напишите бесконечный цикл, который прерывается по окончании игры (выигрыш или ничья).
      • Покажите доску пользователю, чтобы выбрать место для следующего хода.
      • Попросите пользователя ввести номер строки и столбца.
      • Обновите место с помощью соответствующего знака игрока.
      • Проверить, выиграл ли текущий игрок игру или нет.
      • Если текущий игрок выиграл игру, выведите сообщение о выигрыше и прервите бесконечный цикл.
      • Далее проверьте, заполнена ли доска или нет.
      • Если доска заполнена, распечатайте сообщение о розыгрыше и разорвите бесконечный цикл.
    • Наконец, покажите пользователю окончательный вид доски.

Возможно, вы сможете представить себе, что происходит. Не волнуйтесь, даже если вы не совсем поняли это. Когда вы увидите код, вы получите больше ясности.

Итак, перейдем к разделу кода. Я предполагаю, что на вашем компьютере установлен 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 XX - O - - - - - Enter row and column numbers to fix spot: 1 3 Player X turn XXO O - - - - - Enter row and column numbers to fix spot: 2 2 Player O turn XXO OX - - - - Enter row and column numbers to fix spot: 3 3 Player X turn XXOOX - - - O Enter row and column numbers to fix spot: 3 2 Player X wins the game! XXO OX - - XO

Некоторые основные моменты, которые помогут вам понять структуру кода.

  • Мы использовали класс, чтобы собрать все методы в одном месте. Его можно легко использовать повторно в каком-либо другом коде.
  • Затем мы определили разные функции для каждой ответственности, даже если это небольшая задача. Это помогает с легкостью поддерживать код.
  • Приведенные выше два подхода помогают нам легко обновлять приложение, если мы хотим обновить игру.

Не стесняйтесь адаптировать структуру и улучшать ее в зависимости от вашего проекта. Структурирование кода не ограничено.

Заключительные слова

Ура! Вы создали игру полностью с нуля. Это не одна из тех визуальных игр, в которые мы играем каждый день. Но это помогает вам писать логику и поддерживать чистую структуру кода. Следуйте аналогичным рекомендациям, чтобы создать несколько интересных игр, подобных этой. Вы можете найти похожие игры, если вернетесь на несколько лет назад в детство.

Удачного кодирования!

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