Игра Mastermind с использованием алфавитов и проверки на питоне

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

Секретный код в моем 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', None, None, None]. Игрок правильно угадал, что буква 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

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


person potatoooooooooo    schedule 04.03.2020    source источник


Ответы (1)


Вот как вы можете это сделать. 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
>>> 
person alec    schedule 04.03.2020