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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:10