求助: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
相关产品推荐
相关产品推荐

