Как правильно проверить элемент списка и войти, если он был проверен? - PullRequest
2 голосов
/ 09 мая 2019

Попытка взломать код консольной игры, похожей на игру под названием «Mastermind» для школьного проекта.Пример: http://www.webgamesonline.com/mastermind/ whitecheck должен быть: правильный номер, но неправильная позиция.redcheck должен быть: правильное число и позиция.

однако, если я выполню код, он выдаст ошибку и скажет, что есть 1 whitecheck и 1 redcheck в зависимости от позиции предполагаемого числа, независимо от того, был ли ответдано в конце.

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

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

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

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


   import random


code = []
attempts = 3

while len(code) != 4:
    for x in range(4):
        n = random.randint(1, 4)
        if n not in code:
            code.append(n)
print(code)

pos1 = str(code[0])
pos2 = str(code[1])
pos3 = str(code[2])
pos4 = str(code[3])

answer = str(pos1) + str(pos2) + str(pos3) + str(pos4)

guess = None

while guess != answer:

    positionguess1 = str(input("position 1: "))
    positionguess2 = str(input("position 2: "))
    positionguess3 = str(input("position 3: "))
    positionguess4 = str(input("position 4: "))
    checklist = []
    whitecheck = 0
    redcheck = 0

    """ Row 1 code check """
    if positionguess1 == pos1:
        redcheck += 1
        checklist.append(positionguess1)
    elif positionguess1 != pos1 and positionguess1 in answer and positionguess1 not in checklist:
        checklist.append(positionguess1)
        whitecheck += 1

    """ Row 2 code check """
    if positionguess2 == pos2:
        redcheck += 1
        checklist.append(positionguess2)
    elif positionguess2 != pos2 and positionguess2 in answer and positionguess2 not in checklist:
        checklist.append(positionguess2)
        whitecheck += 1

    """ Row 3 code check """
    if positionguess3 == pos3:
        redcheck += 1
        checklist.append(positionguess3)
    elif positionguess3 != pos3 and positionguess3 in answer and positionguess3 not in checklist:
        checklist.append(positionguess3)
        whitecheck += 1

    """ Row 4 code check """
    if positionguess4 == pos4:
        checklist.append(positionguess4)
        redcheck += 1
    elif positionguess4 != pos4 and positionguess4 in answer and positionguess4 not in checklist:
        checklist.append(positionguess4)
        whitecheck += 1

    crackattempt = str(positionguess1) + str(positionguess2) + str(positionguess3) + str(positionguess4)

    print ("You've entered:", crackattempt)

    if crackattempt == answer:
        print ("Amount in wrong position with right value:", whitecheck)
        print("Amount in the right position and the right value:", redcheck)
        print ("cracked the code, you win")
    elif attempts == 0:
        print ("you lose.")
        break
    elif crackattempt != answer:
        print ("Wrong! Try again.")
        print("Amount in wrong position with right value:", whitecheck)
        print("Amount in the right position and the right value:", redcheck)

        attempts -= 1

Если случайно сгенерированный код, например, '1234' и предполагаемый код '4234, он должен дать мне 3 красных проверки вместо 3 красных проверок + 1 белая проверка

Я думаю, что я решил это путемотделяя красную проверку от заявлений белой проверки.


    """ correct number and correct position check """
    if positionguess1 == pos1:
        redcheck += 1
        checklist.append(positionguess1)


    if positionguess2 == pos2:
        redcheck += 1
        checklist.append(positionguess2)


    if positionguess3 == pos3:
        redcheck += 1
        checklist.append(positionguess3)


    if positionguess4 == pos4:
        checklist.append(positionguess4)
        redcheck += 1

    """ correct number but wrong position checks """

    if positionguess1 != pos1 and positionguess1 in answer and positionguess1 not in checklist:
        checklist.append(positionguess1)
        whitecheck += 1

    if positionguess2 != pos2 and positionguess2 in answer and positionguess2 not in checklist:
        checklist.append(positionguess2)
        whitecheck += 1

    if positionguess3 != pos3 and positionguess3 in answer and positionguess3 not in checklist:
        checklist.append(positionguess3)
        whitecheck += 1

    if positionguess4 != pos4 and positionguess4 in answer and positionguess4 not in checklist:
        checklist.append(positionguess4)
        whitecheck += 1

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Ваша ошибка в логике. Давайте посмотрим на этот фрагмент

""" Row 1 code check """
elif positionguess1 != pos1 and positionguess1 in answer and positionguess1 not in checklist:
    checklist.append(positionguess1)
    whitecheck += 1

Здесь код проверяет, находится ли число, введенное пользователем в первой строке, в другой строке. В случае повторяющихся чисел, как в вашем примере (пользовательский ввод 4234, правильный ответ 1234), он обнаруживает, что 4 не в первой строке, но присутствует, поэтому добавляет белую проверку. checklist используется для исключения уже проверенных чисел, но, будучи проверенной первой строкой, контрольный список пуст, поэтому всегда добавляется проверка белого.

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

0 голосов
/ 09 мая 2019

РЕДАКТИРОВАТЬ - за правки, не являющиеся той же самой игрой, но не удаленные, поскольку в коде для OP

есть полезные идеи

Код ниже является реализацией того, что я считаю игрой.

import random

code = random.randint(1000, 9999)

def checks(code, guess):
    """Return tuple with redchecks and whitechecks"""
    code = str(code)
    guess = str(guess)
    redcheck = sum([code[i]==guess[i] for i in range(0, 4)])
    whitecheck = sum([
      code[i]!=guess[i] and (code[i] in guess)
      for i in range(0, 4)
    ])
    return (redcheck, whitecheck)

while True:
    try:
        guess = int(input('Guess:'))
    except:
        print('Exit game')
        break
    if code == guess:
        print('You win!!')
        break
    print(checks(code, guess))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...