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

Например, если номер булавки был 8823, а я предположил 1788, это должно сказать мне, что я получил две правильные цифры, потому что 8 присутствует дважды в обоих. Тем не менее, это говорит только о том, что одна цифра верна, поскольку цифры - это одно и то же число. Если числа отличаются, то проблем нет, например, если пин был 1234, и я угадал 3456, то он сказал бы, что я получил два правильных, потому что 3 и 4 оба появляются один раз и являются разными числами.

Это весь код (я сделал область, которая, как мне кажется, содержит проблему полужирный ):

import random
pin=random.randint(1000,9999)
pin2=str(pin)
pin3=list(pin2)
tries=0
x=1
guess="1"
while x==1:
    pin3=list(pin2)
    guess2=int(guess)
    while guess2<1000 or guess2>9999:
        guess2=int(input("Please guess a 4 digit number: "))
        guess=str(guess2)
    tries+=1

    # BEGIN OF INDICTED CODE ============================
    correct=0
    for i, a in enumerate(pin3):
        guess3=list(guess)
        if a in guess:
            del(pin3[i])
            correct+=1
    print("You got", correct, "correct")
    # END OF INDICTED CODE ==============================

    if guess==pin2:
        x=0
    guess="1"
print("You guessed correctly")
print("You had", tries, "attempts")

Заранее спасибо.

0
CAMMAX008 30 Июн 2019 в 16:53

4 ответа

Лучший ответ

Вы можете попробовать использовать тип collections.Counter, который похож на набор, который позволяет дублировать элементы (также известный как bag или multiset).

Таким образом, вы можете сделать простое пересечение между двумя счетчиками, чтобы найти общие элементы. Например:

>>> from collections import Counter
>>> pin1 = Counter('8823')
>>> pin2 = Counter('1788')
>>> common = pin1 & pin2
>>> list(common.elements())
['8', '8']
>>> 

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

0
James Henstridge 30 Июн 2019 в 15:04

Проверь это:

def check_matching(
        guess,
        truth):
    remaining = list(truth)
    n = 0
    for x in guess:
        try:
            remaining.remove(x)
        except ValueError:
            pass
        else:
            n += 1
    return n

Использоваться как:

check_matching('8823', '1788')
# 2
check_matching('1234', '3456')
# 2
check_matching('8823', '5678')
# 1

В основном это зависит от поведения метода .remove() из встроенных Python list. Входные данные могут быть list, tuple или str. Следовательно, я бы рекомендовал придерживаться строк, чтобы избежать добавления ненужных операций.

0
norok2 30 Июн 2019 в 14:35

Это мой способ реализации вашей игры

from random import randint

Здесь мы генерируем пин-код со списком, мы повторяем 4 раза и каждый раз генерируем случайное число

pin = [randint(0,9) for i in range(4)]

print(pin)
continue_game = True
correct = 0
tries = 0
guessed = []

В приведенном ниже цикле while, используя «map», мы разбиваем предположение на список из 4 элементов, а затем сравниваем каждый элемент из списка предположения с каждым элементом из списка выводов. Если элемент совпадает, мы увеличиваем правильное с 1, если нет, мы увеличиваем попытки с 1.

while continue_game:
    guess = str(input("Guess pin: "))
    guess_pin = list(map(int, guess))
    print(guess_pin)
    for y in guess_pin:
        for x in pin:
            if y == x:
                correct += 1
                guessed.append(y)
            else:
                tries += 1
    if correct == 4:
        continue_game = False
    else:
        pass
    print(f"You had guessed {correct} elements, and tried {tries} times")

В конце мы проверяем, равно ли правильное 4, что означает, что мы угадали все числа

Надеюсь, это поможет вам

0
robertsci 30 Июн 2019 в 14:35

Вот

def get_num_of_common_digits(pin_number, guessed_pin_number):
    pin_number_str = str(pin_number)
    guessed_pin_number_str = str(guessed_pin_number)
    result = 0
    for x in pin_number_str:
        idx = guessed_pin_number_str.find(x)
        if idx != -1:
            guessed_pin_number_str = guessed_pin_number_str[:idx] + guessed_pin_number_str[idx+1:]
            result += 1
    return result


print(get_num_of_common_digits(8823, 1788))
print(get_num_of_common_digits(1234, 3456))
print(get_num_of_common_digits(8823, 5678))

Выход

2
2
1
0
balderman 30 Июн 2019 в 14:36