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

求助:C语言简易填字游戏重复单词bug排查方法

排查并修复填字游戏重复单词的问题

问题根源

你的getFourRandomWords函数逻辑是直接循环4次,每次从allWords里随机选取一个单词复制到fourWords中,但完全没有检查当前选中的单词是否已经被选过。这种随机选取方式天然存在重复概率,运行次数越多,出现重复的可能性就越高。

排查技巧

  • 添加调试输出:在getFourRandomWords的循环里,每次选完单词后打印出来,比如printf("选中单词: %s\n", fourWords[i]);,运行程序时就能直观看到是否出现重复,快速定位问题出在单词选取环节。
  • 单步调试:用IDE的调试功能,逐行执行getFourRandomWords的循环步骤,观察每次生成的随机索引和对应的单词,对比之前已选的内容,就能明确重复产生的原因。
  • 统计选中频次:新增一个数组记录allWords中每个单词被选中的次数,运行多次程序后查看统计结果,验证重复问题确实源于随机选取逻辑。

修复方法

方法1:标记已选索引,避免重复

通过一个数组记录allWords中已被选中的索引,每次生成随机索引后检查是否已被使用,若已使用则重新生成,直到找到未被选中的索引:

void getFourRandomWords()
{
    int i;
    int usedIndices[20] = {0}; // 0表示未使用,1表示已使用
    int randomIndex;

    for (i = 0; i < 4; i++) {
        do {
            randomIndex = rand() % 20;
        } while (usedIndices[randomIndex] == 1); // 重复则重新生成索引

        usedIndices[randomIndex] = 1; // 标记该索引已使用
        strcpy(fourWords[i], allWords[randomIndex]);
    }
}

方法2:Fisher-Yates洗牌算法,打乱后取前4个

先打乱allWords的索引列表,再取前4个索引对应的单词,天然保证无重复:

void getFourRandomWords()
{
    int indices[20];
    int i, j, temp;

    // 初始化索引数组
    for (i = 0; i < 20; i++) {
        indices[i] = i;
    }

    // Fisher-Yates洗牌
    for (i = 19; i > 0; i--) {
        j = rand() % (i + 1);
        temp = indices[i];
        indices[i] = indices[j];
        indices[j] = temp;
    }

    // 取前4个打乱后的索引对应的单词
    for (i = 0; i < 4; i++) {
        strcpy(fourWords[i], allWords[indices[i]]);
    }
}

额外优化建议

  • putHorizzontalWord函数中,循环条件使用strlen(word)会导致每次循环都重新计算字符串长度,建议提前把长度存到变量中:int wordLen = strlen(word);,再用i < wordLen作为循环条件,提升性能。
  • 函数名displayPuzzel存在拼写错误,建议修正为displayPuzzle,保持代码命名规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:20:31