C++井字棋程序问题:整数输入转字符后无法匹配棋盘元素
解决你的井字棋MakePlay函数返回false问题
嘿,我一眼就瞅出问题啦!你遇到的这个MakePlay始终返回false的情况,根本不是字符匹配的锅,而是循环逻辑写错了——咱们来一步步捋清楚:
核心错误:循环提前返回false
你看现在的MakePlay函数:
bool TicTacToe::MakePlay(char cell, char player) { for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { if (board[row][col] == cell) { board[row][col] = player; return true; } else return false; // 这里错了! } } }
这段代码的逻辑是:检查第一个单元格(board[0][0])如果不匹配,直接就返回false了,完全没机会遍历剩下的8个单元格!比如用户输入'5',第一个检查的是'1',不匹配就直接return false,程序根本不会去看中间的'5'。
修正后的MakePlay函数
把return false移到两个循环的外面,只有当整个棋盘都遍历完,确实没找到匹配的单元格时,才返回false:
bool TicTacToe::MakePlay(char cell, char player) { for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { if (board[row][col] == cell) { board[row][col] = player; return true; } } } // 遍历完所有单元格都没找到匹配,才返回false return false; }
额外验证:字符匹配其实没问题
你之前担心的输入字符和棋盘字符不匹配的情况是不存在的——当你用cin >> cell读取用户输入的数字时,得到的char类型值(比如输入5得到'5'),和你棋盘里初始化的{'1','2','3'...}是完全能匹配的,这个逻辑不需要改。
补充:别忘了实现DrawBoard
另外,你的代码里声明了DrawBoard()但没实现,记得补上这个函数,不然棋盘没法显示给用户看哦,比如可以写个简单的版本:
void TicTacToe::DrawBoard() { cout << " " << board[0][0] << " | " << board[0][1] << " | " << board[0][2] << endl; cout << "---+---+---" << endl; cout << " " << board[1][0] << " | " << board[1][1] << " | " << board[1][2] << endl; cout << "---+---+---" << endl; cout << " " << board[2][0] << " | " << board[2][1] << " | " << board[2][2] << endl; }
这样修改后,你的程序就能正常检查单元格是否可用,并且正确落子啦!
内容的提问来源于stack exchange,提问作者micronoob
相关产品推荐
相关产品推荐

