C++编写井字棋程序输入后无响应故障求助
问题根因
卡输入死循环是几个逻辑错误叠加导致的:
- 接收输入的变量
x定义成了char类型:输入数字1时实际存储的是字符'1',对应ASCII值为49,根本不符合你写的x>0 && x<10的判断条件。 - 非法输入判断逻辑完全失效:写的
x < 0 && x > 10是永假条件——不存在数既小于0又大于10,所以所有不合法输入都不会触发提示,filled一直为false,程序卡在输入循环空转,看起来就是没反应。 filled_f()函数分支缺花括号:C++中if/else if不加大括号时,仅第一行语句属于分支,你写的filled = false;无论位置是否被占都会执行,就算选到空位也会被标记为未填充,直接死循环。- 胜负判断没接入游戏循环:main里重复定义了局部变量
loose遮蔽了全局变量,调用end()得到的胜负结果没赋值给循环判断变量,外层循环永远不会终止。 - 轮次状态没重置:第一次落子把
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
相关产品推荐
相关产品推荐

