Python三位密码破解程序问题:猜对时重复输出提示,求修正
三位锁密码破解程序BUG修复:重复输出正确提示问题
需求说明
- 程序先生成一个三位不重复的随机密码;
- 用户逐位输入猜测数字,输入时检查是否重复,仅合法数字加入猜测列表;
- 猜测完全正确时,输出
正确!你破解了密码!并终止程序; - 无任何数字正确时,输出
没有数字正确。; - 部分正确时,输出「正确且位置匹配的数字数量」和「正确但位置不匹配的数字数量」;
- 最多允许5次猜测,用完次数后输出
次数用完!正确密码是:[xxx]并终止。
遇到的问题:猜对密码时,程序会重复输出正确!你破解了密码!。
预期输出示例
你能破解这个三位锁的密码吗?
输入种子值:
2
输入你的第1个猜测数字。
0
输入你的第2个猜测数字。
1
输入你的第3个猜测数字。
2
2个数字正确且位置正确。
0个数字正确但位置错误。
输入你的第1个猜测数字。
0
输入你的第2个猜测数字。
1
输入你的第3个猜测数字。
4
2个数字正确且位置正确。
0个数字正确但位置错误。
输入你的第1个猜测数字。
0
输入你的第2个猜测数字。
1
输入你的第3个猜测数字。
8
正确!你破解了密码!
原始问题代码
import random CODE_NUMBERS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] def main(): print("Can you crack the code of a three-digit lock?") # 生成随机三位密码 seed_number = int(input("Enter a seed:\n")) random.seed(seed_number) right_code = random.sample(CODE_NUMBERS, 3) # 锁的正确密码 # 自定义代码部分 guess = 1 code = [] number1 = int(input('Enter 1. number of your guess.\n')) number2 = int(input('Enter 2. number of your guess.\n')) while number1 == number2: print('The key cannot have two same numbers.') number2 = int(input('Enter 2. number of your guess.\n')) number3 = int(input('Enter 3. number of your guess.\n')) while number3 == number1 or number3 == number2: print('The key cannot have two same numbers.') number3 = int(input('Enter 3. number of your guess.\n')) code.append(number1) code.append(number2) code.append(number3) while guess <= 5: count1 = 0 count2 = 0 if code[0] != right_code[0] and code[1] != right_code[1] and code[2] != right_code[2]: if code[0] and code[1] and code[2] not in right_code: print('Nothing is correct.') else: for i in range(len(code)): if code[i] == right_code[i]: count1 += 1 elif code[i] in right_code and code[i] != right_code[i]: count2 += 1 print(f"{count1:d} numbers were correct and correctly placed.") print(f"{count2:d} numbers were correct, but incorrectly placed") code.clear() guess += 1 number1 = int(input('Enter 1. number of your guess.\n')) number2 = int(input('Enter 2. number of your guess.\n')) while number1 == number2: print('The key cannot have two same numbers.') number2 = int(input('Enter 2. number of your guess.\n')) number3 = int(input('Enter 3. number of your guess.\n')) while number3 == number1 or number3 == number2: print('The key cannot have two same numbers.') number3 = int(input('Enter 3. number of your guess.\n')) code.append(number1) code.append(number2) code.append(number3) elif code[0] == right_code[0] and code[1] == right_code[1] and code[2] == right_code[2]: print('Correct! You cracked the code!') print('Time is over! The correct code is ', right_code) main()
修正后的代码
import random CODE_NUMBERS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] def get_valid_guess(): """获取合法的三位不重复猜测数字""" code = [] # 输入第一个数字 num = int(input('输入你的第1个猜测数字。\n')) code.append(num) # 输入第二个数字,检查重复 while True: num = int(input('输入你的第2个猜测数字。\n')) if num not in code: code.append(num) break print('密码不能有重复数字,请重新输入。') # 输入第三个数字,检查重复 while True: num = int(input('输入你的第3个猜测数字。\n')) if num not in code: code.append(num) break print('密码不能有重复数字,请重新输入。') return code def main(): print("你能破解这个三位锁的密码吗?") # 生成随机三位不重复密码 seed_number = int(input("输入种子值:\n")) random.seed(seed_number) right_code = random.sample(CODE_NUMBERS, 3) max_guesses = 5 for guess_count in range(1, max_guesses + 1): # 获取当前猜测 code = get_valid_guess() # 判断是否完全正确 if code == right_code: print('正确!你破解了密码!') return # 计算位置正确和数字正确位置错误的数量 count_correct_pos = 0 count_correct_num = 0 # 先统计位置正确的 for i in range(3): if code[i] == right_code[i]: count_correct_pos += 1 # 统计数字正确的总数,再减去位置正确的就是位置错误的 total_correct = sum(1 for num in code if num in right_code) count_wrong_pos = total_correct - count_correct_pos # 输出结果 if total_correct == 0: print('没有数字正确。') else: print(f"{count_correct_pos}个数字正确且位置正确。") print(f"{count_wrong_pos}个数字正确但位置错误。") # 次数用完 print(f'次数用完!正确密码是:{right_code}') main()
关键修改点
- 终止逻辑修复:当猜测完全正确时,使用
return直接终止main函数,避免循环继续执行导致重复输出提示。 - 代码复用优化:将获取合法猜测的逻辑封装成
get_valid_guess函数,避免重复编写输入和重复检查代码。 - 判断逻辑修正:
- 原代码中
code[0] and code[1] and code[2] not in right_code的写法错误,改为通过统计total_correct是否为0来判断无正确数字。 - 正确计算「数字正确但位置错误」的数量:先统计所有正确数字的总数,减去位置正确的数量即可,避免重复遍历出错。
- 原代码中
- 循环结构优化:使用
for循环直接控制5次猜测,比while循环更直观,避免手动维护guess变量。 - 中文界面适配:将所有提示文本改为中文,符合预期输出的语言要求。
内容的提问来源于stack exchange,提问作者khuetran
相关产品推荐
相关产品推荐

