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

C++编写井字棋程序输入后无响应故障求助

问题根因

卡输入死循环是几个逻辑错误叠加导致的:

  1. 接收输入的变量x定义成了char类型:输入数字1时实际存储的是字符'1',对应ASCII值为49,根本不符合你写的x>0 && x<10的判断条件。
  2. 非法输入判断逻辑完全失效:写的x < 0 && x > 10是永假条件——不存在数既小于0又大于10,所以所有不合法输入都不会触发提示,filled一直为false,程序卡在输入循环空转,看起来就是没反应。
  3. filled_f()函数分支缺花括号:C++中if/else if不加大括号时,仅第一行语句属于分支,你写的filled = false;无论位置是否被占都会执行,就算选到空位也会被标记为未填充,直接死循环。
  4. 胜负判断没接入游戏循环:main里重复定义了局部变量loose遮蔽了全局变量,调用end()得到的胜负结果没赋值给循环判断变量,外层循环永远不会终止。
  5. 轮次状态没重置:第一次落子把filled设为true后,下一轮输入循环的条件filled == false永远不成立,直接跳过输入环节。
修复方案

按以下点修改即可:

  • 把x的类型从char改成int,正确接收整数值输入
  • 把非法输入的判断条件改成x < 1 || x > 9,覆盖所有1-9范围外的输入
  • 给filled_f()里的else分支补上花括号,把filled = false包进分支逻辑,避免无条件执行
  • 删除main函数里重复定义的局部loose变量,每次落子后把end()的返回值赋值给循环判断的loose变量
  • 每轮刷新完棋盘后,把filled重置为false,保证下一轮能正常进入输入流程
修复后可运行代码
//tictactoe 
#include <iostream>
#include <vector>
using namespace std;

// 全局变量定义
vector<char> board = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int current_player = 2;
char player_mark;
bool game_over = false;
int input_pos;
bool pos_filled = false;


bool check_win() {
    // 横向连线判断
    if (board[1] == board[2] && board[3] == board[2]) return true;
    if (board[4] == board[5] && board[6] == board[5]) return true;
    if (board[7] == board[8] && board[9] == board[8]) return true;
    // 纵向连线判断
    if (board[1] == board[4] && board[7] == board[1]) return true;
    if (board[2] == board[5] && board[8] == board[2]) return true;
    if (board[3] == board[6] && board[9] == board[3]) return true;
    // 对角线连线判断
    if (board[1] == board[5] && board[9] == board[5]) return true;
    if (board[3] == board[5] && board[7] == board[5]) return true;
    return false;
}

void draw_board() {
    cout << "TIC TAC TOE\n";
    cout << "      |      |      \n";
    cout << "  " << board[1] << "   |  " << board[2] << "   |  " << board[3] << "    \n";
    cout << "______|______|______\n";
    cout << "      |      |      \n";
    cout << "  " << board[4] << "   |  " << board[5] << "   |  " << board[6] << "    \n";
    cout << "______|______|______\n";
    cout << "      |      |      \n";
    cout << "  " << board[7] << "   |  " << board[8] << "   |  " << board[9] << "    \n";
    cout << "      |      |      \n\n";
}

void switch_player() {
    current_player = (current_player == 1) ? 2 : 1;
}

bool check_pos_valid() {
    if (board[input_pos] != 'X' && board[input_pos] != 'O'){
        pos_filled = true;
        board[input_pos] = player_mark;
    }
    else {
        cout << "The square has already been used!\n";
        pos_filled = false;
    }
    return pos_filled;
}

void set_player_mark() {
    player_mark = (current_player == 1) ? 'X' : 'O';
}

void print_input_tip() {
    cout << "Player " << current_player << "'s turn, please enter a number:\n";
}

int main(){
    draw_board();
    while(!game_over){
        switch_player();
        set_player_mark();
        print_input_tip();
    
        while(!pos_filled){
            cin >> input_pos;
            if (input_pos >= 1 && input_pos <= 9){
                check_pos_valid();
            }
            else {
                cout << "Invalid! Enter again!\n"; 
                pos_filled = false;
            }
        }
    
        draw_board();
        game_over = check_win();
        pos_filled = false;
    }
    cout << "Player " << current_player << " won! GG";
}   

内容的提问来源于stack exchange,提问作者Sydney Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:06:32