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

Создать игру Mastermind в Python – код разбития кода

Mastermind – это разбивная игра из двух игроков, в которой один игрок скрывает код, состоящий из цветов, в то время как другой игрок должен угадать его, используя

Автор оригинала: Pankaj Kumar.

Создать игру Mastermind в Python – код разбития кода

Mastermind – это разбитая кодовая игра из двух игроков, в которой один игрок скрывает код, состоящий из цветов, в то время как другой игрок должен угадать его, используя подсказки, данные бывшим игроком для каждого хода.

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

Игра Mastermind в Python – Демо

Без дальнейшего адо, давайте попадаем в дизайн часть игры.

Игра Mastermind Design

Оригинальная доска Mastermind показана ниже.

Mastermind.

Экранированный конец доски скрывает секретный код, тогда как полная доска основана на догадках, сделанных кодовым выключателем. Игра заканчивается, как только пользователь идентифицирует скрытый код.

Правая сторона доски на рисунке содержит серию белых и красных колышек, которые используются для обозначения подсказки, связанных с каждой попыткой.

  • Красный – Один из выбранных цветов находится в правильном положении, как в секретном коде
  • Белый – Один из выбранных цветов присутствует в коде, но позиция неверна.

Реализация Совета в терминале выглядит как:

Игра Mastermind Design

Верхний конец доски скрывает секретный код и раскрывается, когда проигрыватель отсутствует из шансов или нарушает код. До этого момента “УНК” для «Неизвестно» Показано.

Каждый участок доски обозначает поворот, сделанный игроком. Игра поддерживает шесть цветов, Красный , Зеленый , Желтый , Синий , Черный, Оранжевый Отказ Летчайшая панель обозначает подсказки на каждом ходу. «W» для белых и «R» для красных, используемых с оригинальным значением позади них

На рисунке, отображаемое выше, три из четырех цветов, выбранных пользователем, верны, но ни один из них не является правильным положением в соответствии с секретным кодом, поэтому три «W» в подсказках.

# Function to print the mastermind board
def print_mastermind_board(passcode, guess_codes, guess_flags):

	print("-----------------------------------------")
	print("\t      MASTERMIND")
	print("-----------------------------------------")

	print("    |", end="")
	for x in passcode:
		print("\t" + x[:3], end="")
	print()	

	for i in reversed(range(len(guess_codes))):
		print("-----------------------------------------")
		print(guess_flags[i][0], guess_flags[i][1], "|")
		

		print(guess_flags[i][2], guess_flags[i][3], end=" |")
		for x in guess_codes[i]:
			print("\t" + x[:3], end="")

		print()	
	print("-----------------------------------------")

Приведенный выше фрагмент кода отвечает за отображение доски MasterMind на терминале.

Структуры данных – Переменные игры

Для удобного разработки игровой логики нам нужна несколько структур данных.

  • Цвета – список цветов, участвующих в игре
  • Colours_map – сопоставление между числами и цветами
  • Площадь – секретный код
  • show_passcode – секретный код, который будет показан пользователю, список неизвестных
  • догадка_Code – список списков догадок, сделанных игроком
  • Угадай_флэлги – список списков подсказков, данных игроку
# The Main function
if __name__ == '__main__':

	# List of colors
	colors = ["RED", "GREEN", "YELLOW", "BLUE", "BLACK", "ORANGE"]

	# Mapping of colors to numbers	
	colors_map = {1:"RED", 2:"GREEN", 3:"YELLOW", 4:"BLUE", 5:"BLACK", 6:"ORANGE"}

	# Randomly selecting a passcode
	random.shuffle(colors)
	passcode = colors[:4]
	
	# Number of chances for the player
	chances = 8

	# The passcode to be shown to the user
	show_passcode = ['UNK', 'UNK', 'UNK', 'UNK']

	# The codes guessed by the player each turn
	guess_codes = [['-', '-', '-', '-'] for x in range(chances)]

	# The clues provided to the player each turn
	guess_flags = [['-', '-', '-', '-'] for x in range(chances)]

Каждая из этих структур данных приходит пригодным при работе с логикой игры для нашей реализации игры Mastermind.

Игровая петля

Одной из самых важных частей разработки игр является игровой петлей, которая отвечает за правильное функционирование движений и обновлений и обновлений для переменных игр.

# The current turn
turn = 0

# The GAME LOOP
while turn < chances:

Игровой цикл зависит от количества шансов и текущей очереди. Предполагается остановить игру всякий раз, когда шансы игрока исчерпаны.

Игровое меню

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

Наше игровое меню выглядит так:

Mastermind Game Menu
# The GAME MENU
print("-----------------------------------------")
print("\t\tMenu")
print("-----------------------------------------")
print("Enter code using numbers.")
print("1 - RED, 2 - GREEN, 3 - YELLOW, 4 - BLUE, 5 - BLACK, 6 - ORANGE")
print("Example: RED YELLOW ORANGE BLACK ---> 1 3 6 5")
print("-----------------------------------------")
print_mastermind_board(show_passcode, guess_codes, guess_flags)

Меню игры должно быть простым и доп.

Обработка ввода игрока

Вход для обработки игрока включает в себя три основных этапа: принимая вход проигрывателя, применяя некоторые достоверности чеков, и если все в порядке, сохраняя его в наши структуры данных.

Принимая ввод игрока

Как уже упоминалось в меню игры, игрок должен ввести четыре числа, каждый из которых соответствует определенному цвету, разделенному пробелами.

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

# Accepting the player input 
try:	
	code = list(map(int, input("Enter your choice = ").split()))
except ValueError:
	clear()
	print("\tWrong choice!! Try again!!")
	continue

Примечание: Очистить () Функция несет ответственность за сохранение терминала чистота, путем вымывки предыдущего выхода. Это требует от Python ОС библиотека.

Проверьте полный код ниже для объявления функции Очистить () Отказ

Применение здравоохранения

Next UP делает некоторые достоверные чеки на вход проигрывателя.

# Check if the number of colors nunbers are 4
if len(code) != 4:
	clear()
	print("\tWrong choice!! Try again!!")
	continue

# Check if each number entered corresponds to a number
flag = 0
for x in code:
	if x > 6 or x < 1:
		flag = 1

if flag == 1:			
	clear()
	print("\tWrong choice!! Try again!!")
	continue	

Хранение игрока движется

После того, как мы узнаем, что игрок сделал действительный ход, мы можем хранить его в игровых контейнерах.

# Storing the player moves
for i in range(4):
	guess_codes[turn][i] = colors_map[code[i]]	

Установите подсказки для каждого хода

Существует два набора флагов, которые должны быть назначены, «R», если цвет находится в правильном положении, как в секретном коде, и «W», если цвет правильно, но в неправильном положении.

# Process to apply clues according to the player input	
dummy_passcode = [x for x in passcode]	

pos = 0

# Loop to set up clues for the player move
for x in code:
	if colors_map[x] in dummy_passcode:
		if code.index(x) == passcode.index(colors_map[x]):
			guess_flags[turn][pos] = 'R'
		else:
			guess_flags[turn][pos] = 'W'
		pos += 1
		dummy_passcode.remove(colors_map[x])

random.shuffle(guess_flags[turn])				

Одна маленькая вещь, которую нужно помнить, переставляет флаги, поскольку оно может дать подсказки, связанные с позициями цветов.

Проверьте наличие выигрыша

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

# Check for win condition
if guess_codes[turn] == passcode:
	clear()
	print_mastermind_board(passcode, guess_codes, guess_flags)
	print("Congratulations!! YOU WIN!!!!")
	break

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

Обновите номер поворота

Одна маленькая, но очень важная задача – обновить номер поворота после каждого успешного движения игрока.

# Update turn	
turn += 1			
clear()

Последнее, но не самое меньшее, обрабатывает состояние потерь.

Проверьте наличие потерь

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

# Check for loss condiiton	
if turn == chances:
	clear()
	print_mastermind_board(passcode, guess_codes, guess_flags)
	print("YOU LOSE!!! Better luck next time!!!")	

Это завершает объяснение для создания Mastermind с использованием языка Python.

Полный код

import random
import os

def clear():
	os.system("clear")

# Function to print the mastermind board
def print_mastermind_board(passcode, guess_codes, guess_flags):


	print("-----------------------------------------")
	print("\t      MASTERMIND")
	print("-----------------------------------------")

	print("    |", end="")
	for x in passcode:
		print("\t" + x[:3], end="")
	print()	

	for i in reversed(range(len(guess_codes))):
		print("-----------------------------------------")
		print(guess_flags[i][0], guess_flags[i][1], "|")
		

		print(guess_flags[i][2], guess_flags[i][3], end=" |")
		for x in guess_codes[i]:
			print("\t" + x[:3], end="")

		print()	
	print("-----------------------------------------")

# The Main function
if __name__ == '__main__':

	# List of colors
	colors = ["RED", "GREEN", "YELLOW", "BLUE", "BLACK", "ORANGE"]

	# Mapping of colors to numbers	
	colors_map = {1:"RED", 2:"GREEN", 3:"YELLOW", 4:"BLUE", 5:"BLACK", 6:"ORANGE"}

	# Randomly selecting a passcode
	random.shuffle(colors)
	passcode = colors[:4]
	
	# Number of chances for the player
	chances = 8

	# The passcode to be shown to the user
	show_passcode = ['UNK', 'UNK', 'UNK', 'UNK']

	# The codes guessed by the player each turn
	guess_codes = [['-', '-', '-', '-'] for x in range(chances)]

	# The clues provided to the player each turn
	guess_flags = [['-', '-', '-', '-'] for x in range(chances)]
	
	clear()

	# The current turn
	turn = 0

	# The GAME LOOP
	while turn < chances:
		
		print("-----------------------------------------")
		print("\t\tMenu")
		print("-----------------------------------------")
		print("Enter code using numbers.")
		print("1 - RED, 2 - GREEN, 3 - YELLOW, 4 - BLUE, 5 - BLACK, 6 - ORANGE")
		print("Example: RED YELLOW ORANGE BLACK ---> 1 3 6 5")
		print("-----------------------------------------")
		print_mastermind_board(show_passcode, guess_codes, guess_flags)

		# Accepting the player input 
		try:	
			code = list(map(int, input("Enter your choice = ").split()))
		except ValueError:
			clear()
			print("\tWrong choice!! Try again!!")
			continue	

		# Check if the number of colors nunbers are 4
		if len(code) != 4:
			clear()
			print("\tWrong choice!! Try again!!")
			continue

		# Check if each number entered corresponds to a number
		flag = 0
		for x in code:
			if x > 6 or x < 1:
				flag = 1

		if flag == 1:			
			clear()
			print("\tWrong choice!! Try again!!")
			continue	

		# Storing the player input
		for i in range(4):
			guess_codes[turn][i] = colors_map[code[i]]	

		# Process to apply clues according to the player input	
		dummy_passcode = [x for x in passcode]	

		pos = 0

		# Loop to set up clues for the player move
		for x in code:
			if colors_map[x] in dummy_passcode:
				if code.index(x) == passcode.index(colors_map[x]):
					guess_flags[turn][pos] = 'R'
				else:
					guess_flags[turn][pos] = 'W'
				pos += 1
				dummy_passcode.remove(colors_map[x])

		random.shuffle(guess_flags[turn])				


		# Check for win condition
		if guess_codes[turn] == passcode:
			clear()
			print_mastermind_board(passcode, guess_codes, guess_flags)
			print("Congratulations!! YOU WIN!!!!")
			break

		# Update turn	
		turn += 1			
		clear()

# Check for loss condiiton	
if turn == chances:
	clear()
	print_mastermind_board(passcode, guess_codes, guess_flags)
	print("YOU LOSE!!! Better luck next time!!!")	

Заключение

Задача создания наших собственных игр может сначала казаться пугающими для любого новичка Python Programmer. Мы надеемся, что эта статья упростила некоторые концепции Python и сделали задачу, достижимы для читателя.

Не стесняйтесь комментировать ниже для любых предложений или запросов. Спасибо за чтение.