宾果游戏开发:如何检测数组中的重复元素并修改值以避免二次重复
解决宾果卡片每行数字重复的问题
嘿,我看了你的代码,问题出在重复检查的逻辑上:当你发现当前数字和bingocard[row][x]重复时,重新生成了新值,但这个新值并没有和当前行所有已生成的数字再次比对——比如你替换后可能和x=1的数字重复,但此时x已经走到2了,不会回头检查,所以还是会留下重复项。
另外你的代码重复太多了,每个行的逻辑几乎一模一样,我们可以简化一下,用一个数组来管理B/I/N/G/O对应的数字范围,这样代码更简洁也好维护。
修正后的思路
- 把B/I/N/G/O的数字范围存到一个二维数组里,方便按行索引调用。
- 对每一行,生成每个列的数字时,循环检查当前行所有已填充的列,确保新数字不重复。
- 简化重复的行判断逻辑,用索引直接对应到数字范围数组。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 把B/I/N/G/O的数字范围整合到二维数组,每行对应一个字母的范围 int numberRanges[5][15] = { {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, // B行 {16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}, // I行 {31,32,33,34,35,36,37,38,39,40,41,42,43,44,45}, // N行 {46,47,48,49,50,51,52,53,54,55,56,57,58,59,60}, // G行 {61,62,63,64,65,66,67,68,69,70,71,72,73,74,75} // O行 }; // 生成对应行的随机数(简化原randomize函数的逻辑) int getRandomNumber(int rowIndex) { // 取0-14的随机索引,对应numberRanges里的元素 int randomIndex = rand() % 15; return numberRanges[rowIndex][randomIndex]; } int main() { int bingocard[6][6]; // 用1-5索引行和列,和原习惯保持一致 int row, column; int isDuplicate; int currentNum; // 初始化随机数种子 srand((unsigned int)time(NULL)); // 填充每一行 for (row = 1; row <= 5; row++) { for (column = 1; column <= 5; column++) { do { isDuplicate = 0; currentNum = getRandomNumber(row - 1); // row-1对应numberRanges的0-4索引 // 检查当前行已经填充的所有列,判断是否重复 for (int checkCol = 1; checkCol < column; checkCol++) { if (bingocard[row][checkCol] == currentNum) { isDuplicate = 1; break; // 找到重复,跳出检查循环,重新生成数字 } } } while (isDuplicate); // 只要重复就一直生成新数字 bingocard[row][column] = currentNum; } } // 打印宾果卡片 printf("\nB\t| I\t | N\t | G\t | O\n"); printf("-----------------------------------------\n"); for (int i = 1; i <= 5; i++) { printf("%d\t| %d\t | %d\t | %d\t | %d\n", bingocard[1][i], bingocard[2][i], bingocard[3][i], bingocard[4][i], bingocard[5][i]); } // 你的获胜图案可以在这里后续处理,注意原代码里提前初始化bingoPattern是无效的,因为此时bingocard还没填充 int bingoPattern[] = { bingocard[1][1], bingocard[1][5], bingocard[2][2], bingocard[2][4], bingocard[3][3], bingocard[4][2], bingocard[4][4], bingocard[5][1], bingocard[5][5] }; return 0; }
关键改进点
- 重复检查逻辑:用
do-while循环包裹数字生成和检查,每次生成新数字后,遍历当前行所有已填充的列,确保没有重复才会赋值。 - 代码简化:把5个单独的数字数组整合成一个二维数组,用
getRandomNumber函数统一生成随机数,避免了大量重复的if-else判断。 - 修复无效初始化:原代码里提前初始化
bingoPattern是错误的,因为此时bingocard还没有填充数值,现在把它放到填充完卡片之后。
这样生成的宾果卡片每行就不会有重复数字啦!
内容的提问来源于stack exchange,提问作者node247
相关产品推荐
相关产品推荐

