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

Python猜码程序两大问题求助:重复提示与范围判断错误

问题解决与代码修正

1. 范围判断失效的原因与修复

原代码中if gok != (num_range):逻辑完全错误:gok是用户输入的字符串,num_range是range(0,8)对象,两者类型不同无法直接比较。正确做法是:

  • 先验证输入是4位纯数字(排除非数字字符和长度不符的情况)
  • 逐个检查每个数字是否在1-7范围内(规则明确数字从1到7)

修复逻辑步骤:

  • 判断输入长度是否为4且全为数字
  • 若不符合,直接提示非法
  • 若符合,遍历每个字符转成整数,检查是否在1到7之间,只要有一个不在就标记非法

2. 位置提示重复输出的原因与修复

原代码遍历输入的每个字符,只要字符等于目标码中的数字就打印对应位置,导致重复输入同一数字时多次输出提示。正确做法是按位置逐一对比输入和目标码:

  • 对第1到第4位分别检查,只有当输入的该位置字符与目标码对应位置一致时,才输出位置正确的提示
  • 每个位置只检查一次,不会重复输出

3. 重复数字检查的逻辑修复

原代码中for i in num_range: if i == i*2:逻辑无效(仅当i=0时成立),正确的重复检查需要逐个对比输入的四个字符是否重复(用嵌套判断,不使用列表):

  • 检查第1位与第2、3、4位是否重复
  • 检查第2位与第3、4位是否重复
  • 检查第3位与第4位是否重复

修正后的完整代码

code = "1436"     # 目标密码
beurt = 0         # 用户回合数
stop = "9999"     # 停止码
gok = ''          # 用户输入

print("""欢迎!你有10次机会猜一个4位数字密码。
数字不能重复。
数字范围是1到7。
输入9999可以随时停止游戏。""")
print()

while gok != code:
    gok = input("请输入4位数字密码:")
    
    # 处理停止码
    if gok == stop:
        print()
        print("你选择了停止游戏。")
        break
    
    # 处理猜对的情况
    if gok == code:
        print()
        print("太棒了!你破解了密码!")
        break
    
    # 验证输入合法性:4位纯数字 + 每个数字在1-7之间
    is_valid = True
    if len(gok) != 4 or not gok.isdigit():
        is_valid = False
    else:
        for i in range(4):
            num = int(gok[i])
            if num < 1 or num > 7:
                is_valid = False
                break
    
    if not is_valid:
        print()
        print("你的输入不合法:必须是4位1-7之间的数字!")
        continue  # 跳过后续反馈,重新输入
    
    # 检查是否有重复数字
    has_duplicate = False
    # 第1位和后面三位对比
    if gok[0] == gok[1] or gok[0] == gok[2] or gok[0] == gok[3]:
        has_duplicate = True
    # 第2位和后面两位对比
    elif gok[1] == gok[2] or gok[1] == gok[3]:
        has_duplicate = True
    # 第3位和第4位对比
    elif gok[2] == gok[3]:
        has_duplicate = True
    
    if has_duplicate:
        print()
        print("每个数字只能使用一次!")
    
    # 回合数增加(合法输入才计数)
    beurt += 1
    print()
    print("不正确。当前是第", beurt, "回合")
    
    # 检查是否用完10次机会
    if beurt == 10:
        print()
        print("你的回合已用完。")
        break
    
    # 输出位置提示:按位置逐一对比
    print()
    print("反馈提示:")
    # 第1位
    if gok[0] == code[0]:
        print("数字1在第一位。")
    # 第2位
    if gok[1] == code[1]:
        print("数字4在第二位。")
    # 第3位
    if gok[2] == code[2]:
        print("数字3在第三位。")
    # 第4位
    if gok[3] == code[3]:
        print("数字6在第四位。")
    
    # 补充:数字存在但位置不对的提示(可选,符合作业反馈要求)
    if gok[0] in code and gok[0] != code[0]:
        print("数字", gok[0], "存在但位置不对。")
    if gok[1] in code and gok[1] != code[1]:
        print("数字", gok[1], "存在但位置不对。")
    if gok[2] in code and gok[2] != code[2]:
        print("数字", gok[2], "存在但位置不对。")
    if gok[3] in code and gok[3] != code[3]:
        print("数字", gok[3], "存在但位置不对。")

关键修改说明

  • 合法性检查:先验证输入长度和数字格式,再逐个检查数字范围,确保只有合法输入才进入后续流程
  • 重复检查:用多条件判断对比每个位置的字符,避免使用列表
  • 位置提示:按固定位置逐一对比输入和目标码,每个位置只判断一次,彻底解决重复输出问题
  • 回合计数:仅在输入合法时才增加回合数,避免非法输入消耗次数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:20:36