实现Mastermind游戏时的错位棋子计数问题
解决方案
原checkCode函数的核心问题是没有标记已匹配的位置,导致同一个数字会被重复计数(比如秘密代码中的数字被多个猜测数字匹配,或者猜测数字重复匹配秘密代码中的同一数字)。
按照Mastermind规则,正确的统计逻辑需要分两步执行:
- 先统计位置完全匹配的数量,同时标记这些已匹配的位置,避免后续重复计算。
- 遍历剩余未匹配的猜测数字,在秘密代码的未匹配位置中寻找相同数字,每找到一个就标记对应秘密位置并增加错位计数。
修正后的checkCode函数如下:
void checkCode(int *numbers, int *code){ int misplacedPieces = 0; int correct = 0; // 标记已匹配的位置,初始化为0(未使用) int used_guess[4] = {0}; int used_code[4] = {0}; // 第一步:统计完全匹配的数量 for (int i = 0; i < 4; i++) { if (numbers[i] == code[i]) { correct++; used_guess[i] = 1; used_code[i] = 1; } } // 第二步:统计错位匹配的数量 for (int i = 0; i < 4; i++) { // 跳过已匹配的猜测位置 if (used_guess[i]) continue; for (int j = 0; j < 4; j++) { // 跳过已匹配的秘密代码位置,且数字匹配 if (!used_code[j] && numbers[i] == code[j]) { misplacedPieces++; used_code[j] = 1; // 标记该秘密位置已被匹配 break; // 每个猜测数字只匹配一次 } } } printf("Well placed pieces: %d\nMisplaced pieces: %d\n", correct, misplacedPieces); }
修正说明
- 新增
used_guess和used_code两个数组,用来记录哪些位置已经被匹配过,防止重复计数。 - 第一步优先统计完全匹配的情况,同时标记对应位置为已使用,确保这些位置不会参与后续的错位统计。
- 第二步只处理未匹配的猜测数字,在未被使用的秘密代码位置中寻找匹配,找到后立即标记秘密位置,避免同一秘密数字被多次匹配。
内容的提问来源于stack exchange,提问作者Y.S
相关产品推荐
相关产品推荐

