You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改点

  1. 终止逻辑修复:当猜测完全正确时,使用return直接终止main函数,避免循环继续执行导致重复输出提示。
  2. 代码复用优化:将获取合法猜测的逻辑封装成get_valid_guess函数,避免重复编写输入和重复检查代码。
  3. 判断逻辑修正:
    • 原代码中code[0] and code[1] and code[2] not in right_code的写法错误,改为通过统计total_correct是否为0来判断无正确数字。
    • 正确计算「数字正确但位置错误」的数量:先统计所有正确数字的总数,减去位置正确的数量即可,避免重复遍历出错。
  4. 循环结构优化:使用for循环直接控制5次猜测,比while循环更直观,避免手动维护guess变量。
  5. 中文界面适配:将所有提示文本改为中文,符合预期输出的语言要求。

内容的提问来源于stack exchange,提问作者khuetran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:20:55