Автор оригинала: Pankaj Kumar.
В этой статье мы будем проходить через шаги создания Tic-Tac-Toe, используя язык Python с нуля.
О игре
Tic-Tac-Toe – это игра из двух игроков, которая играет на 3 × 3 квадратной сетки. Каждый игрок занимает ячейку по очереди, с целью размещения трех знаков в горизонтальном, вертикальном или диагональном рисунке. Один игрок использует крест 'X'
как его маркер, в то время как другой использует ничтожество «О»
Отказ
Шаг 1: Дизайн Tic-Tac-Toe
Мы будем играть в Tic-Tac-Toe на командной строке, поэтому первое, что нам нужно сделать, это создать дизайн для нашего Tic-Tac-Toe.
Если игрок должен пометить определенную коробку, он должен ввести соответствующий номер, показанный в сетке. Предположим, мы хотим занять центральный блок, то мы будем вводить 5
в терминале. Эта сетка может быть сгенерирована:
# Function to print Tic Tac Toe def print_tic_tac_toe(values): print("\n") print("\t | |") print("\t {} | {} | {}".format(values[0], values[1], values[2])) print('\t_____|_____|_____') print("\t | |") print("\t {} | {} | {}".format(values[3], values[4], values[5])) print('\t_____|_____|_____') print("\t | |") print("\t {} | {} | {}".format(values[6], values[7], values[8])) print("\t | |") print("\n")
В указанном выше коде функция создает нашу игру Tic-Tac-Toe в соответствии с значениями, поставляемыми в качестве аргумента. Здесь аргумент, Значения
это список, содержащий состояние каждой ячейки в сетке.
Шаг 2: Хранить информацию с использованием структур данных
Ядро любой игры – это игровая механика позади нее. Поскольку это довольно простая игра для создания, вовлеченные механики тоже просты.
В любое мгновение времени нам нужна две важные данные:
- Статус сетки – У нас должна быть структура данных, которая хранит состояние каждой клетки, то есть занимается ли он или вакантным.
- Каждый игрок движется – Мы должны как-то иметь знание прошлых и настоящих движений каждого игрока, то есть позиции, занятые
'X'
и«О»
Отказ
Примечание: Обе информация может быть доступна с использованием состояния сетки, но потребовалось бы, чтобы пройти его каждый раз, когда нам понадобятся позиции игрока. Это можно назвать с течением времени по сравнению с пространственным сложностью компромисса. Это общая техника для сохранения времени.
# Function for a single game of Tic Tac Toe def single_game(cur_player): # Represents the Tic Tac Toe values = [' ' for x in range(9)] # Stores the positions occupied by X and O player_pos = {'X':[], 'O':[]}
Статус сетки управляется списком символов, которые могут иметь три возможных значения,
-
''
– вакантная клетка 'X'
– клетка, занятая игроком X«О»
– клетка, занятая игроком о
Каждый игрок движется хранятся в виде словаря списка целых чисел. Ключи – 'X'
и «О»
для соответствующего игрока. Их соответствующие списки содержат номера, приведенные к ячейкам сетки, они занимают.
Примечание: Переменная cur_player. хранит текущий игрок, что делает ход, как в ‘X’ или же ‘O’ .
Шаг 3: игровая петля
Каждая игра имеет какой-то игровой цикл, которая работает, пока не выиграет некоторый игрок, или игра заканчивается ничьей. В Tic-Tac-Toe каждая петлевая итерация относится к одному шагу, который делает любой игрок.
# Game Loop for a single game of Tic Tac Toe while True: print_tic_tac_toe(values)
Шаг 4: Ручка ввода игрока
В каждой игре итерации игрок должен ввести свой ход.
# Try exception block for MOVE input try: print("Player ", cur_player, " turn. Which box? : ", end="") move = int(input()) except ValueError: print("Wrong Input!!! Try Again") continue # Sanity check for MOVE inout if move < 1 or move > 9: print("Wrong Input!!! Try Again") continue # Check if the box is not occupied already if values[move-1] != ' ': print("Place already filled. Try again!!") continue
Мы создаем попробуйте
Блок, если игрок входит в некоторую непреднамеренное значение. Такое событие не должно останавливать игру, поэтому мы обрабатываем исключение ValueError
И продолжить с нашей игрой.
Нам нужно выполнить некоторые достоверные чеки, например, введенные значения – это правильная позиция, и если это действительная позиция, это уже занято?
Шаг 5: Обновить информацию
Согласно входу проигрывателя, нам нужно обновить информацию для плавного функционирования игры.
# Update game information # Updating grid status values[move-1] = cur_player # Updating player positions player_pos[cur_player].append(move)
Значения
Список обновляет ячейку, занятую в соответствии с текущим проигрывателем. Положение плеера добавляет позицию, просто сделанную текущим проигрывателем.
После обновления Значения
Список и звонок print_tic_tac_toe ()
Функция, сетка выглядит так:
Шаг 6: Проверить победу или нарисовать
После каждого хода мы должны проверить, выиграл ли кто-нибудь игрок, или игра была нарисована. Это можно проверить:
Функция звонков:
# Function call for checking win if check_win(player_pos, cur_player): print_tic_tac_toe(values) print("Player ", cur_player, " has won the game!!") print("\n") return cur_player # Function call for checking draw game if check_draw(player_pos): print_tic_tac_toe(values) print("Game Drawn") print("\n") return 'D'
Если кто-нибудь игрок выигрывает, то Single_Game ()
Функция возвращает текущий проигрыватель, который сделал шаг. В случае, если игра нарисована, 'D'
отправляется обратно.
Функции:
# Function to check if any player has won def check_win(player_pos, cur_player): # All possible winning combinations soln = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9], [1, 5, 9], [3, 5, 7]] # Loop to check if any winning combination is satisfied for x in soln: if all(y in player_pos[cur_player] for y in x): # Return True if any winning combination satisfies return True # Return False if no combination is satisfied return False # Function to check if the game is drawn def check_draw(player_pos): if len(player_pos['X']) + len(player_pos['O']) == 9: return True return False
check_win () – Функция имеет все выигрышные комбинации. Все это так, то есть, он проверяет, удовлетворено ли какие-либо из выигрышных комбинаций по позициям текущего игрока. Если это так, он возвращает Правда
Отказ Если ни одно из комбинаций не удовлетворено, то функция возвращает Ложь
Отказ
check_draw () – Состояние ничья довольно просто, так как игра нарисована, когда все «девять» предпринимаются позиции.
Шаг 7: Переключите текущий проигрыватель
Поскольку каждый игрок двигается только один раз в то время, поэтому после каждого удачного хода мы должны поменять текущий проигрыватель.
# Switch player moves if cur_player == 'X': cur_player = 'O' else: cur_player = 'X'
Что касается одной игры, это все, что нам нужно сделать. Но эта статья также представляет систему табло для поддержания отслеживания, если игроки хотят играть несколько игр.
Шаг 8: Введите имена игроков
Обязательно для любого табло отображается каждому имена игроков.
if __name__ == "__main__": print("Player 1") player1 = input("Enter the name : ") print("\n") print("Player 2") player2 = input("Enter the name : ") print("\n")
Шаг 9: Хранить информацию, связанную с игрой
Информация, такая как текущий проигрыватель, выбор игроков (поперечина или нет), доступные параметры (крест и ничто), а табло нужно хранить.
# Stores the player who chooses X and O cur_player = player1 # Stores the choice of players player_choice = {'X' : "", 'O' : ""} # Stores the options options = ['X', 'O'] # Stores the scoreboard score_board = {player1: 0, player2: 0}
По умолчанию текущий проигрыватель – это игрок, который ввел имя сначала.
Шаг 10: табло дизайна
Табло хранится как словарь, где ключи – это имена игроков, и значения их выигрыша.
# Function to print the score-board def print_scoreboard(score_board): print("--------------------------------") print(" SCOREBOARD ") print("--------------------------------") players = list(score_board.keys()) print(" ", players[0], " ", score_board[players[0]]) print(" ", players[1], " ", score_board[players[1]]) print("--------------------------------\n")
Чтобы отобразить табло, нам нужны имена игроков. Ключи извлекаются с использованием .keys ()
Функция, а затем преобразована в список, чтобы он мог проиндексировать при отображении баллов.
Шаг 11: Наружная игра игра
Нам нужна еще одна игровая петля, для управления несколькими спичками TIC-TAC-TOE. Каждый матч текущий проигрыватель выбирает свою марку ( 'x'
или 'o'
). Меню для выбора должно отображаться в каждой игре итерации игры:
# Game Loop for a series of Tic Tac Toe # The loop runs until the players quit while True: # Player choice Menu print("Turn to choose for", cur_player) print("Enter 1 for X") print("Enter 2 for O") print("Enter 3 to Quit")
Табло и меню выглядят так:
Шаг 12: Ручка и назначить выбор игрока
Каждая итерация, мы должны обрабатывать и хранить выбор текущего игрока.
# Try exception for CHOICE input try: choice = int(input()) except ValueError: print("Wrong Input!!! Try Again\n") continue # Conditions for player choice if choice == 1: player_choice['X'] = cur_player if cur_player == player1: player_choice['O'] = player2 else: player_choice['O'] = player1 elif choice == 2: player_choice['O'] = cur_player if cur_player == player1: player_choice['X'] = player2 else: player_choice['X'] = player1 elif choice == 3: print("Final Scores") print_scoreboard(score_board) break else: print("Wrong Choice!!!! Try Again\n")
Согласно выбору игрока, данные хранятся. Это важно, поскольку после каждой игры заканчивается, она скажет нам, какой игрок выиграл.
Шаг 13: Выполните матч
После хранения всей необходимой информации пришло время выполнить независимое совпадение и хранить выигрышную марку.
# Stores the winner in a single game of Tic-tac-toe winner = single_game(options[choice-1])
Шаг 14: Обновите табло
Нам нужно обновить табло после каждого матча TIC-TAC-TOE.
# Updates the scoreboard according to the winner if winner != 'D' : player_won = player_choice[winner] score_board[player_won] = score_board[player_won] + 1 print_scoreboard(score_board)
Если игра не закончилась на ничье, то мы обновляем табло.
Шаг 15: Переключите выбранный плеер
Это щедрое представление, что у каждого игрока должна быть возможность выбрать, какой знак они хотят. Для этого мы поменяем стоимость в cur_player
Отказ
# Switch player who chooses X or O if cur_player == player1: cur_player = player2 else: cur_player = player1
Полный рабочий код
# Function to print Tic Tac Toe def print_tic_tac_toe(values): print("\n") print("\t | |") print("\t {} | {} | {}".format(values[0], values[1], values[2])) print('\t_____|_____|_____') print("\t | |") print("\t {} | {} | {}".format(values[3], values[4], values[5])) print('\t_____|_____|_____') print("\t | |") print("\t {} | {} | {}".format(values[6], values[7], values[8])) print("\t | |") print("\n") # Function to print the score-board def print_scoreboard(score_board): print("\t--------------------------------") print("\t SCOREBOARD ") print("\t--------------------------------") players = list(score_board.keys()) print("\t ", players[0], "\t ", score_board[players[0]]) print("\t ", players[1], "\t ", score_board[players[1]]) print("\t--------------------------------\n") # Function to check if any player has won def check_win(player_pos, cur_player): # All possible winning combinations soln = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9], [1, 5, 9], [3, 5, 7]] # Loop to check if any winning combination is satisfied for x in soln: if all(y in player_pos[cur_player] for y in x): # Return True if any winning combination satisfies return True # Return False if no combination is satisfied return False # Function to check if the game is drawn def check_draw(player_pos): if len(player_pos['X']) + len(player_pos['O']) == 9: return True return False # Function for a single game of Tic Tac Toe def single_game(cur_player): # Represents the Tic Tac Toe values = [' ' for x in range(9)] # Stores the positions occupied by X and O player_pos = {'X':[], 'O':[]} # Game Loop for a single game of Tic Tac Toe while True: print_tic_tac_toe(values) # Try exception block for MOVE input try: print("Player ", cur_player, " turn. Which box? : ", end="") move = int(input()) except ValueError: print("Wrong Input!!! Try Again") continue # Sanity check for MOVE inout if move < 1 or move > 9: print("Wrong Input!!! Try Again") continue # Check if the box is not occupied already if values[move-1] != ' ': print("Place already filled. Try again!!") continue # Update game information # Updating grid status values[move-1] = cur_player # Updating player positions player_pos[cur_player].append(move) # Function call for checking win if check_win(player_pos, cur_player): print_tic_tac_toe(values) print("Player ", cur_player, " has won the game!!") print("\n") return cur_player # Function call for checking draw game if check_draw(player_pos): print_tic_tac_toe(values) print("Game Drawn") print("\n") return 'D' # Switch player moves if cur_player == 'X': cur_player = 'O' else: cur_player = 'X' if __name__ == "__main__": print("Player 1") player1 = input("Enter the name : ") print("\n") print("Player 2") player2 = input("Enter the name : ") print("\n") # Stores the player who chooses X and O cur_player = player1 # Stores the choice of players player_choice = {'X' : "", 'O' : ""} # Stores the options options = ['X', 'O'] # Stores the scoreboard score_board = {player1: 0, player2: 0} print_scoreboard(score_board) # Game Loop for a series of Tic Tac Toe # The loop runs until the players quit while True: # Player choice Menu print("Turn to choose for", cur_player) print("Enter 1 for X") print("Enter 2 for O") print("Enter 3 to Quit") # Try exception for CHOICE input try: choice = int(input()) except ValueError: print("Wrong Input!!! Try Again\n") continue # Conditions for player choice if choice == 1: player_choice['X'] = cur_player if cur_player == player1: player_choice['O'] = player2 else: player_choice['O'] = player1 elif choice == 2: player_choice['O'] = cur_player if cur_player == player1: player_choice['X'] = player2 else: player_choice['X'] = player1 elif choice == 3: print("Final Scores") print_scoreboard(score_board) break else: print("Wrong Choice!!!! Try Again\n") # Stores the winner in a single game of Tic Tac Toe winner = single_game(options[choice-1]) # Edits the scoreboard according to the winner if winner != 'D' : player_won = player_choice[winner] score_board[player_won] = score_board[player_won] + 1 print_scoreboard(score_board) # Switch player who chooses X or O if cur_player == player1: cur_player = player2 else: cur_player = player1
Время для игрового процесса!
Все шаги для создания игры были закончены. Сейчас самое время играть в игру.
Player 1 Enter the name : Luffy Player 2 Enter the name : Sanji -------------------------------- SCOREBOARD -------------------------------- Luffy 0 Sanji 0 -------------------------------- Turn to choose for Luffy Enter 1 for X Enter 2 for O Enter 3 to Quit 1 | | | | _____|_____|_____ | | | | _____|_____|_____ | | | | | | Player X turn. Which box? : 5 | | | | _____|_____|_____ | | | X | _____|_____|_____ | | | | | | Player O turn. Which box? : 1 | | O | | _____|_____|_____ | | | X | _____|_____|_____ | | | | | | Player X turn. Which box? : 9 | | O | | _____|_____|_____ | | | X | _____|_____|_____ | | | | X | | Player O turn. Which box? : 2 | | O | O | _____|_____|_____ | | | X | _____|_____|_____ | | | | X | | Player X turn. Which box? : 3 | | O | O | X _____|_____|_____ | | | X | _____|_____|_____ | | | | X | | Player O turn. Which box? : 7 | | O | O | X _____|_____|_____ | | | X | _____|_____|_____ | | O | | X | | Player X turn. Which box? : 6 | | O | O | X _____|_____|_____ | | | X | X _____|_____|_____ | | O | | X | | Player X has won the game!! -------------------------------- SCOREBOARD -------------------------------- Luffy 1 Sanji 0 -------------------------------- Turn to choose for Sanji Enter 1 for X Enter 2 for O Enter 3 to Quit 2 | | | | _____|_____|_____ | | | | _____|_____|_____ | | | | | | Player O turn. Which box? : 5 | | | | _____|_____|_____ | | | O | _____|_____|_____ | | | | | | Player X turn. Which box? : 3 | | | | X _____|_____|_____ | | | O | _____|_____|_____ | | | | | | Player O turn. Which box? : 2 | | | O | X _____|_____|_____ | | | O | _____|_____|_____ | | | | | | Player X turn. Which box? : 8 | | | O | X _____|_____|_____ | | | O | _____|_____|_____ | | | X | | | Player O turn. Which box? : 1 | | O | O | X _____|_____|_____ | | | O | _____|_____|_____ | | | X | | | Player X turn. Which box? : 9 | | O | O | X _____|_____|_____ | | | O | _____|_____|_____ | | | X | X | | Player O turn. Which box? : 6 | | O | O | X _____|_____|_____ | | | O | O _____|_____|_____ | | | X | X | | Player X turn. Which box? : 7 | | O | O | X _____|_____|_____ | | | O | O _____|_____|_____ | | X | X | X | | Player X has won the game!! -------------------------------- SCOREBOARD -------------------------------- Luffy 2 Sanji 0 -------------------------------- Turn to choose for Luffy Enter 1 for X Enter 2 for O Enter 3 to Quit 3 Final Scores -------------------------------- SCOREBOARD -------------------------------- Luffy 2 Sanji 0 --------------------------------
Заключение
Мы надеемся, что эта статья была веселой, а также информативной для читателя. Я также загрузил код на Github. Вы можете посетить здесь для кода. Если есть какие-либо предложения для игры, не стесняйтесь комментировать.