C语言Hangman游戏通关第10关后程序冻结问题排查
Hangman游戏第10关通关后冻结的原因分析
核心问题:共享索引标记数组引发无限死循环
你的程序中,usedIndices数组被同时用于标记guessWords和guessWords2两个词库的索引是否已使用。每一轮关卡(即外层for循环的一次迭代)会从两个词库各选取一个随机索引,并将这两个索引在usedIndices中标记为1(已使用)。
由于每个词库仅有20个元素(索引范围0-19),每关会消耗2个不同的索引。当运行到第10关时,0-19范围内的所有索引都已被标记为已使用。此时进入下一轮关卡的do-while循环:
do { randomIndex=rand() % 20; } while (usedIndices[randomIndex]);
rand()%20只能生成0-19的数字,但这些位置的usedIndices值全为1,循环条件永远成立,程序陷入无限死循环,最终表现为冻结。
修复方案
将共享的usedIndices拆分为两个独立的数组,分别对应两个词库的索引标记:
// 替换原有的usedIndices数组 int usedIndices1[20] = {0}; // 专门标记guessWords的已用索引 int usedIndices2[20] = {0}; // 专门标记guessWords2的已用索引
随后在生成随机索引时,分别使用对应的标记数组:
// 生成guessWords的随机索引 do { randomIndex=rand() % 20; } while (usedIndices1[randomIndex]); usedIndices1[randomIndex]=1; // 生成guessWords2的随机索引 do { randomIndex2=rand() % 20; } while (usedIndices2[randomIndex2]); usedIndices2[randomIndex2]=1;
这样两个词库的索引标记互不干扰,每关仅消耗各自词库的一个索引,20关都能正常生成新的随机词汇,避免死循环。
内容的提问来源于stack exchange,提问作者skay
相关产品推荐
相关产品推荐

