C++如何统计井字棋游戏中用户按下回车键确认的输入次数
统计用户回车确认的输入次数
你原来的逻辑行不通是因为cin >> int类型变量时会自动跳过换行、空格等空白字符,int类型变量也不可能接收到换行符。可以用两种方案实现需求:
- 方案1(最简单):每次用户输入有效落子、按下回车完成本次输入后直接给计数变量
counter加1即可,每一次成功的落子输入天然对应一次回车确认操作。 - 方案2(可兼容非法输入校验):先读取整行输入再转换为数字,每成功处理一行就代表用户按了一次回车,还能额外处理用户输入非数字、输入超出范围的异常场景,参考代码如下:
int counter = 0; int choice; string input_line; cout << "Player " << mark << ", enter a number >"; while (getline(cin, input_line)) { // 跳过用户直接按回车的空输入 if (input_line.empty()) { cout << "请输入有效数字 >"; continue; } try { choice = stoi(input_line); // 额外校验输入的数字是否是1-9、对应棋盘位置是否未被占用 if (choice < 1 || choice >9 || board[choice-1] != ' ') { cout << "该位置不可用,请重新输入 >"; continue; } // 有效输入,计数+1 counter++; // 此处添加玩家落子的处理逻辑 break; } catch (...) { cout << "请输入合法数字 >"; } }
随机数去重方案
井字棋总共只有9个落子位置,数据量极小,你提到的排序去重重试方案效率完全达标,没有性能问题。这里还有两种更易实现的方案:
- 方案1(生成时判重):生成随机数后先检查是否已经存入vector,不存在才加入,直到vector长度达到目标值即可:
while (AI.size() < counter) { int rand_num = rand() % 9 + 1; bool existed = false; for (auto num : AI) { if (num == rand_num) { existed = true; break; } } if (!existed) { AI.push_back(rand_num); } }
- 方案2(洗牌法,无重复):先初始化包含1-9所有落子位置的数组,用洗牌算法打乱后取前counter个即可,完全不会产生重复值:
vector<int> all_pos = {1,2,3,4,5,6,7,8,9}; // 打乱数组顺序 random_shuffle(all_pos.begin(), all_pos.end()); // 取前counter个作为AI落子 for (int i=0; i<counter; i++) { AI.push_back(all_pos[i]); }
额外注意
你当前代码最后遍历AI的for循环中,变量k没有初始化,会读取到内存野值导致运行异常,记得将循环定义改为for(int k=0; k < counter; k++)。
内容的提问来源于stack exchange,提问作者Jheremy
相关产品推荐
相关产品推荐

