我正在尝试制作一个密码识别游戏。会生成一个随机的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 :(得分:0)
这里
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
答案 1 :(得分:0)
这是我实施游戏的方式
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”将猜测分为四个元素的列表,然后将guess_pin列表中的每个元素与引脚列表中的每个元素进行比较。如果元素匹配,则将正确性增加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,这意味着我们已经猜到了所有数字
希望它对您有帮助
答案 2 :(得分:0)
检查一下:
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
这基本上取决于内置Python .remove()
中list
方法的行为。输入可以是list
,tuple
或str
。因此,我建议坚持使用字符串,以避免添加不必要的操作。
答案 3 :(得分:0)
您可以尝试使用collections.Counter
类型,它类似于允许重复项的集合(也称为bag or multiset)。
这样,您可以在两个计数器之间做一个简单的交点以查找公共元素。例如:
>>> from collections import Counter
>>> pin1 = Counter('8823')
>>> pin2 = Counter('1788')
>>> common = pin1 & pin2
>>> list(common.elements())
['8', '8']
>>>
使用此列表的长度可以为您提供包含重复项时的常见元素数量。