Игра Mastermind с использованием алфавитов и проверки в python - PullRequest
1 голос
/ 04 марта 2020

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

Секретный код в моем MasterMind представляет собой последовательность из 4 букв. Каждая буква в секретном коде уникальна и имеет значение от «А» до «Н». Некоторые примеры действительного секретного кода: «ABDF», «EGHC» и «DAFE» .

Следующие примеры недопустимы:

  • «ABBG» - содержит повторяющиеся символы «B».
  • «LHAD» - содержит символ «L» вне диапазона от «A» до «H».
  • «DBA» - содержит только 3 символа вместо обязательных 4.

В настоящее время я это сделал:

import random
def chooseOneLetter (base1, base2):
  ratio = 10
  seed = int(random.uniform (0, ratio*len(base1)+len(base2)))
  if seed < ratio*len(base1):
    chosenLetter = base1[int(seed/ratio)]
    base1.remove(chosenLetter)
  else:
    chosenLetter = base2[(seed - ratio*len(base1))]
    base2.remove(chosenLetter)
    return chosenLetter
def getSecretCode(base1, base2):
  secretCode = ""
  for i in range(4):
    chosenLetter = chooseOneLetter (base1, base2)
    secretCode += chosenLetter
    return secretCode
# base1 = ["A", "B", "C", "D"]
# base2 = ["E", "F", "G", "H"]

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

Например, если секретный код BAFD ,

Первые ссылки на переменные ['B', Нет, Нет, Нет]. Игрок правильно угадал, что буква B находится в первой позиции, но все остальные буквы в других позициях неверны.

Вторая переменная ссылается на {'A': 2, 'B': 1, 'D' : 2}. Игрок до сих пор угадал 3 правильные буквы: A дважды угадывается в неправильных позициях, B - один раз в неправильном положении, D дважды - в неправильных.

Я также ищу движок игры, чтобы предложить пользователю сыграть в другую игру и повторно ввести строку, если она не соответствует критериям. Это должно выглядеть примерно так.

Enter a guess to continue or RETURN to quit: abda
Please enter 4 unique letters, A to H
Enter a guess to continue or RETURN to quit: ade
Please enter 4 unique letters, A to H
Enter a guess to continue or RETURN to quit: asbc
Please enter 4 unique letters, A to H
Enter a guess to continue or RETURN to quit: abcd
The guess is not correct, attempt no. 1
The correct letters in correct positions: [None, None, None,
None]
The correct letters and the number of times found in incorrect
positions: {'B': 1, 'C': 1, 'D': 1}
Enter a guess to continue or RETURN to quit: dhcb
The guess is not correct, attempt no. 2
The correct letters in correct positions: [None, None, None,
'B']
The correct letters and the number of times found in incorrect
positions: {'B': 1, 'C': 2, 'D': 2, 'H': 1}
Enter a guess to continue or RETURN to quit: cdhb
You guessed it correctly in 3 attempts, the secret word is CDHB
Do you want to play again? Y to play again: y

Большое вам спасибо за помощь!

1 Ответ

1 голос
/ 04 марта 2020

Вот способ, которым вы можете сделать это. random.sample () формирует секретный код. Список отзывов составляется после каждого предположения. Для каждой буквы в предположении будет отображаться либо (1) буква, если она была в правильном положении (2) истина, если буква находится в коде, но в неправильной позиции, либо (3) ложь, если она не в код вообще. Словарь подсчета будет хранить количество угаданных букв в неправильной позиции.

import random

def mastermind():
    key = random.sample('ABCDEFGH', 4)
    count = {}
    feedback = []
    guess = ''
    while guess != key:
        feedback.clear()
        guess = list(input('Enter your guess: '))
        for i, v in enumerate(guess):
            if v == key[i]:
                feedback.append(v)
            elif v in key:
                feedback.append(True)
                count[v] = 1 if v not in count else count[v] + 1
            else:
                feedback.append(False)
        print(feedback, count)
    print('Correct!')

while True:
    mastermind()
    if input('Play again? (Y/N): ').lower() == 'n':
        break

Геймплей:

Enter your guess: ABCD
[False, True, True, False] {'B': 1, 'C': 1}
Enter your guess: BCEF
[True, True, True, False] {'B': 2, 'C': 2, 'E': 1}
Enter your guess: CEBG
['C', 'E', True, False] {'B': 3, 'C': 2, 'E': 1}
Enter your guess: CEHB
['C', 'E', 'H', 'B'] {'B': 3, 'C': 2, 'E': 1}
Correct!
Play again? (Y/N): y
Enter your guess: ABCD
[True, False, False, True] {'A': 1, 'D': 1}
Enter your guess: DAEF
['D', True, False, 'F'] {'A': 2, 'D': 1}
Enter your guess: DGAF
['D', 'G', 'A', 'F'] {'A': 2, 'D': 1}
Correct!
Play again? (Y/N): n
>>> 
...