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

如何修改猜4位密码游戏代码,跳过已匹配正确的数字?

解决猜4位密码游戏的重复匹配问题

嘿,这个问题我之前也碰到过,核心就是程序重复计数了已经被精确匹配的密码数字——就像你说的例子,密码里前两个4已经和猜测的前两位精准对上了,剩下的猜测数字4不该再盯着这两个已经“名花有主”的4算匹配。结合你提到的arr标记数组,咱们可以分两步来修改代码:

第一步:先统计精确匹配,标记已使用的密码位置

首先得把位置和数字都正确的情况先算出来,同时用arr数组把密码中已经匹配成功的位置标记为true,这样后续就不会再用这些位置的数字来计算“数字对但位置错”的情况了。

示例代码(假设密码存在secret数组里,比如int[] secret = {4,4,0,5}):

int exactMatch = 0;
boolean[] arr = {false, false, false, false}; // 题目里的初始数组

// 遍历每一位,统计精确匹配并标记
for (int i = 0; i < 4; i++) {
    // 把guess1-guess4转成数组方便遍历
    int currentGuess = new int[]{guess1, guess2, guess3, guess4}[i];
    if (currentGuess == secret[i]) {
        exactMatch++;
        arr[i] = true; // 标记这个密码位置已被匹配,不再参与后续计算
    }
}

第二步:统计数字正确但位置错误的匹配(避免重复计数)

这一步要注意两个关键点:

  1. 跳过已经精确匹配的猜测位置(这些已经算在exactMatch里了)
  2. 只在密码中**未被标记(arr[j] == false)**的位置找匹配的数字,找到后立刻标记该密码位置为true,防止同一个密码数字被多个猜测数字重复匹配。

示例代码:

int partialMatch = 0;

// 遍历每个猜测数字
for (int i = 0; i < 4; i++) {
    int currentGuess = new int[]{guess1, guess2, guess3, guess4}[i];
    // 跳过已经精确匹配的位置,不用再处理
    if (currentGuess == secret[i]) {
        continue;
    }
    // 遍历密码的所有位置,找未被标记的匹配数字
    for (int j = 0; j < 4; j++) {
        if (!arr[j] && currentGuess == secret[j]) {
            partialMatch++;
            arr[j] = true; // 标记这个密码数字已被使用,不能再匹配其他猜测数字
            break; // 每个猜测数字只能匹配一个密码数字,找到就停
        }
    }
}

// 最后输出结果,比如:
// System.out.println(exactMatch + ", " + partialMatch);

为什么这样能解决你的例子?

拿密码4405、猜测4444来测试:

  1. 精确匹配阶段:前两位的4完全匹配,exactMatch变成2,arr[0]和arr[1]被设为true。
  2. 模糊匹配阶段:
    • 第三位猜测的4:遍历密码位置,arr[0]和arr[1]已经被标记,剩下的0和5都不匹配,所以不计数。
    • 第四位猜测的4:同样,所有未标记的密码位置都没有4了,也不计数。
  3. 最终输出就是2, 0,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:26:27