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

宾果游戏开发:如何检测数组中的重复元素并修改值以避免二次重复

解决宾果卡片每行数字重复的问题

嘿,我看了你的代码,问题出在重复检查的逻辑上:当你发现当前数字和bingocard[row][x]重复时,重新生成了新值,但这个新值并没有和当前行所有已生成的数字再次比对——比如你替换后可能和x=1的数字重复,但此时x已经走到2了,不会回头检查,所以还是会留下重复项。

另外你的代码重复太多了,每个行的逻辑几乎一模一样,我们可以简化一下,用一个数组来管理B/I/N/G/O对应的数字范围,这样代码更简洁也好维护。

修正后的思路

  1. 把B/I/N/G/O的数字范围存到一个二维数组里,方便按行索引调用。
  2. 对每一行,生成每个列的数字时,循环检查当前行所有已填充的列,确保新数字不重复。
  3. 简化重复的行判断逻辑,用索引直接对应到数字范围数组。

修正后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:42:44