C语言Bingo游戏实现中如何避免数组查重时出现输出空白行
解决方案
问题根源
你的代码将用户输入读取逻辑放在了随机数去重的内层循环中,每生成一次重复值就会触发一次输入读取要求,随着已抽取数字增多,重复概率升高,需要按下回车的次数就会同步增加,进而出现空白行过多的问题。
修正思路
将用户输入检测和随机数生成逻辑拆分:
- 单次读取用户输入,判断为
q直接退出,判断为回车则启动随机数生成流程 - 随机数去重的内层循环不做输入读取,直到生成合法未使用的数值后再输出
完整可运行代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> int main() { srand(time(0)); int rollcount = 0, rollc, rollr, basec=5, base=20; const char BINGO[5] = {'B','I','N','G','O'}; bool check[101]; int used_count = 1; // 初始空闲位已标记为使用,初始计数为1 // 修正原代码for循环条件的大写I错误 for(int i = 0; i < 100; i++) check[i]=false; // 标记空闲位为已使用,对应数值100 check[100]=true; // 最多抽99个有效数字 while(used_count < 100) { // 单次读取用户输入 char input = getchar(); if(input == 'q') { // 可在此处补充统计输出逻辑 printf("游戏退出\n"); return 0; } if(input != '\n') { // 非回车非q的输入直接跳过 continue; } bool reroll = true; rollcount++; // 内层循环仅做随机数生成和去重,无需读取输入 do { rollc = rand() % basec; // 随机选列 rollr = rand() % base + 1; // 生成列内随机数 rollr += (rollc * 20); // 限制O列最大值为99 if(rollr == 100) rollr = 99; if (check[rollr] == false) { printf("%d: %c-%d\n", rollcount, BINGO[rollc], rollr); check[rollr] = true; used_count++; reroll = false; } } while(reroll); } printf("所有数字已抽取完毕\n"); return 0; }
修改说明
- 修正了原代码中for循环条件将小写
i误写为大写I的编译错误 - 移除了内层循环中的输入读取逻辑,单次回车触发后自动完成重复重试直到生成合法值
- 新增抽取计数判断,抽满99个有效数字后自动终止程序
- 输出内容新增换行符,符合预期的逐行显示格式
- 优化了输入判断逻辑,非回车、非
q的输入会直接忽略,避免误操作影响流程
内容的提问来源于stack exchange,提问作者Matthew Sechrist
相关产品推荐
相关产品推荐

