如何修改猜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; // 标记这个密码位置已被匹配,不再参与后续计算 } }
第二步:统计数字正确但位置错误的匹配(避免重复计数)
这一步要注意两个关键点:
- 跳过已经精确匹配的猜测位置(这些已经算在
exactMatch里了) - 只在密码中**未被标记(
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来测试:
- 精确匹配阶段:前两位的
4完全匹配,exactMatch变成2,arr[0]和arr[1]被设为true。 - 模糊匹配阶段:
- 第三位猜测的
4:遍历密码位置,arr[0]和arr[1]已经被标记,剩下的0和5都不匹配,所以不计数。 - 第四位猜测的
4:同样,所有未标记的密码位置都没有4了,也不计数。
- 第三位猜测的
- 最终输出就是
2, 0,完全符合预期。
内容的提问来源于stack exchange,提问作者Aura
相关产品推荐
相关产品推荐

