我正在制作一款您在其中破解密码的游戏。我想要它,所以它可以是0000到9999之间的任何代码。我编写了此脚本。
from random import *
from time import sleep
pin = [randint(0,9),randint(0,9),randint(0,9),randint(0,9)]
print(pin)
usrinp = int(input(''))
if int(usrinp) == pin:
print('cracked')
问题是当我输入该代码时,它不起作用,因为没有任何输出。有没有一种方法可以将这4个数字组合在一起以构成哈希或它的任何名称?
答案 0 :(得分:5)
您有一个整数列表,并将其与单个整数进行比较。这不起作用有两个原因:
int()
不保留前导0
字符; int('0999')
返回999
,int('0000')
返回0
。将您的输入内容和秘密保留为 strings ,这样您就可以保留前导0
。将它们设为相同的类型,因此生成单个字符串,而不是整数列表。
您的秘密密码可以通过选择字符串数字来生成:
digits = '0123456789' # or use from string import digits
pin = ''.join([random.choice(digits) for _ in range(4)]) # 4 random digits, one string
然后针对该引脚测试input()
的值:
usrinp = input('')
if usrinp == pin:
# ...
注意:您也可以random.randint(0, 9999)
挑选一个随机整数,但这会使您更难告诉玩家他们是否得到了 some < / em>正确的数字。例如,通过生成一个字符串,您可以简单地计算出他们正确的位数:
if usrinp == pin:
print('Cracked!')
else:
correct_count = 0
for pindigit, userdigit in zip(pin, usrinp):
if pindigit == userdigit:
correct_count += 1
print('Sorry, not the right pin, but you guessed",
correct_count, 'digits correctly!')
您可以使用两个整数来实现相同的目标,但是随后您必须使用数学或字符串转换来提取每个数字并正确处理前导零的值。一切都变得更加复杂了。
另一种选择是将用户输入转换为单独的整数(因此保留原始生成的整数列表):
userinp = [int(digit) for digit in input('')]
,但是除非您还打算在算术中使用数字(将它们求和,相乘等等),否则使用这种方法没有真正的优势。列表和字符串都是序列,但是生成字符串使您不必处理每次玩游戏并中断'Your mamma is a <censored>'
转换时都会顽固输入int()
的用户。 :-)
所有这些都不需要hashing;哈希在这里没有用,因为您要测试是否相等,而不是尝试将大量潜在值减少为一组有限的选项(例如尝试将任意值放入有限大小的表中,或将较大的潜在值定向到可以处理这些连接的有限数量的服务器的传入连接数。
答案 1 :(得分:1)
这是因为您正在将整数值与列表进行比较。
import random
from time import sleep
pin = 1000*randint(0, 9) + 100*randint(0, 9) + 10*randint(0, 9) + randint(0, 9)
print(pin)
usrinp = int(input(''))
if usrinp == pin:
print('cracked')
如果您的密码始终为4位数字,而不是前导零的数字,这应该有效。
答案 2 :(得分:0)
要获取四位数的整数,请使用此:
pin = randint(0, 9999)
因此,结果代码将是:
from random import *
from time import sleep
pin = randint(0, 9999)
print('%04d'%pin) # print with leading zeros
usrinp = int(input(''))
if usrinp == pin:
print('cracked')