Рубрики
Без рубрики

Tic-Tac-Toe с использованием Python

В этой статье мы будем проходить через шаги создания Tic-Tac-Toe, используя язык Python с нуля.

Автор оригинала: 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. Вы можете посетить здесь для кода. Если есть какие-либо предложения для игры, не стесняйтесь комментировать.