C++;Tictoe类问题 我正在努力学习C++,我已经做了一些简单的游戏,但有些事情不对。我试图犯一个错误。但有些地方出了问题。我已经试了两个小时了,但我不知道如何解决这个问题。怎么了?当我输入2 2,这应该是工作,错误消息弹出,它说无效的移动。但是X或O仍然会出现在黑板上 代码如下: #include <iostream> const int rows = 3; const int elements = 3; char SetPlayer; char SetEnemyPlayer; char chooseTurn = 0; char board[rows][elements]; void Clear() { for (int i = 0; i < rows; i++) { for (int j = 0; j < elements; j++) { board[i][j] = ' '; } } } void Show() { for (int i = 0; i < rows; i++) { for (int j = 0; j < elements; j++) { std::cout << " " << board[i][j] << " |"; } std::cout << std::endl; std::cout << "------------" << std::endl; } } void StartTurn() { std::cout << "Which character would you like to be? (X or O) "; std::cin >> chooseTurn; switch (chooseTurn){ case 'O': std::cout << "You have choosen O" << std::endl << std::endl; chooseTurn = 'O'; break; case 'X': std::cout << "You have choosen X" << std::endl << std::endl; chooseTurn = 'X'; break; default: std::cout << "Enter a valid character" << std::endl; StartTurn(); } } bool PlayerAttack(int x, int y, char PlayerAttackChar) { if (board[x][y] == ' ') { board[x][y] = PlayerAttackChar; return true; } return false; } bool EnemyAttack(int x, int y, char PlayerAttackChar) { if (board[x][y] == ' ') { board[x][y] = PlayerAttackChar; return true; } return false; } bool OWinner() { if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O' || board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O' || board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O' || board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O' || board[0][2] == 'O' && board[1][2] == 'O' && board[2][0] == 'O' || board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O' || board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O' || board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O') { std::cout << "You won!" << std::endl; return true; } return false; } bool XWinner() { if (board[0][0] == 'X' && board[0][1] == 'X' && board[0][2] == 'X' || board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X' || board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X' || board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X' || board[0][2] == 'X' && board[1][2] == 'X' && board[2][0] == 'X' || board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X' || board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X' || board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X') { std::cout << "You won!" << std::endl; return true; } return false; } bool error(int x, int y) { if (board[x][y] != ' ') { return true; } } int main() { Clear(); StartTurn(); Show(); if (chooseTurn == 'X') { SetPlayer = 'X'; SetEnemyPlayer = 'O'; } else { SetPlayer = 'O'; SetEnemyPlayer = 'X'; } int pos1 = 0; int pos2 = 0; bool Xwinner = false; bool Owinner = false; int PlayerTurn = 0; while (!Xwinner && !Owinner) { while (PlayerTurn == 0) { bool yourAttack = false; PlayerTurn++; std::cout << SetPlayer << " turn. Please input a coordinate: "; std::cin >> pos1 >> pos2; std::cout << std::endl; pos1 -= 1; pos2 -= 1; if (error(pos1, pos2)) { std::cout << "Please enter a valid position (1 to 3)" << std::endl; PlayerTurn = 0; } PlayerAttack(pos1, pos2, SetPlayer); Show(); } while (PlayerTurn != 0) { PlayerTurn = 0; std::cout<< SetEnemyPlayer << " turn. Please input a coordinate: "; std::cin >> pos1 >> pos2; std::cout << std::endl; pos1 -= 1; pos2 -= 1; if (error(pos1, pos2)) { std::cout << "Please enter a valid position (1 to 3)" << std::endl; PlayerTurn = 1; } EnemyAttack(pos1, pos2, SetEnemyPlayer); Show(); // AI } Xwinner = XWinner(); Owinner = OWinner(); } } #包括 const int rows=3; 常量int元素=3; 字符集播放器; charsetenemyplayer; char chooseTurn=0; 字符板[行][元素]; 无效清除() { 对于(int i=0;i

C++;Tictoe类问题 我正在努力学习C++,我已经做了一些简单的游戏,但有些事情不对。我试图犯一个错误。但有些地方出了问题。我已经试了两个小时了,但我不知道如何解决这个问题。怎么了?当我输入2 2,这应该是工作,错误消息弹出,它说无效的移动。但是X或O仍然会出现在黑板上 代码如下: #include <iostream> const int rows = 3; const int elements = 3; char SetPlayer; char SetEnemyPlayer; char chooseTurn = 0; char board[rows][elements]; void Clear() { for (int i = 0; i < rows; i++) { for (int j = 0; j < elements; j++) { board[i][j] = ' '; } } } void Show() { for (int i = 0; i < rows; i++) { for (int j = 0; j < elements; j++) { std::cout << " " << board[i][j] << " |"; } std::cout << std::endl; std::cout << "------------" << std::endl; } } void StartTurn() { std::cout << "Which character would you like to be? (X or O) "; std::cin >> chooseTurn; switch (chooseTurn){ case 'O': std::cout << "You have choosen O" << std::endl << std::endl; chooseTurn = 'O'; break; case 'X': std::cout << "You have choosen X" << std::endl << std::endl; chooseTurn = 'X'; break; default: std::cout << "Enter a valid character" << std::endl; StartTurn(); } } bool PlayerAttack(int x, int y, char PlayerAttackChar) { if (board[x][y] == ' ') { board[x][y] = PlayerAttackChar; return true; } return false; } bool EnemyAttack(int x, int y, char PlayerAttackChar) { if (board[x][y] == ' ') { board[x][y] = PlayerAttackChar; return true; } return false; } bool OWinner() { if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O' || board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O' || board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O' || board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O' || board[0][2] == 'O' && board[1][2] == 'O' && board[2][0] == 'O' || board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O' || board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O' || board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O') { std::cout << "You won!" << std::endl; return true; } return false; } bool XWinner() { if (board[0][0] == 'X' && board[0][1] == 'X' && board[0][2] == 'X' || board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X' || board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X' || board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X' || board[0][2] == 'X' && board[1][2] == 'X' && board[2][0] == 'X' || board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X' || board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X' || board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X') { std::cout << "You won!" << std::endl; return true; } return false; } bool error(int x, int y) { if (board[x][y] != ' ') { return true; } } int main() { Clear(); StartTurn(); Show(); if (chooseTurn == 'X') { SetPlayer = 'X'; SetEnemyPlayer = 'O'; } else { SetPlayer = 'O'; SetEnemyPlayer = 'X'; } int pos1 = 0; int pos2 = 0; bool Xwinner = false; bool Owinner = false; int PlayerTurn = 0; while (!Xwinner && !Owinner) { while (PlayerTurn == 0) { bool yourAttack = false; PlayerTurn++; std::cout << SetPlayer << " turn. Please input a coordinate: "; std::cin >> pos1 >> pos2; std::cout << std::endl; pos1 -= 1; pos2 -= 1; if (error(pos1, pos2)) { std::cout << "Please enter a valid position (1 to 3)" << std::endl; PlayerTurn = 0; } PlayerAttack(pos1, pos2, SetPlayer); Show(); } while (PlayerTurn != 0) { PlayerTurn = 0; std::cout<< SetEnemyPlayer << " turn. Please input a coordinate: "; std::cin >> pos1 >> pos2; std::cout << std::endl; pos1 -= 1; pos2 -= 1; if (error(pos1, pos2)) { std::cout << "Please enter a valid position (1 to 3)" << std::endl; PlayerTurn = 1; } EnemyAttack(pos1, pos2, SetEnemyPlayer); Show(); // AI } Xwinner = XWinner(); Owinner = OWinner(); } } #包括 const int rows=3; 常量int元素=3; 字符集播放器; charsetenemyplayer; char chooseTurn=0; 字符板[行][元素]; 无效清除() { 对于(int i=0;i,c++,boolean,C++,Boolean,如果移动有效,您的错误函数将不会返回任何内容,并导致未定义的行为。您希望在if语句之后添加一个return false;。此外,您还希望确保x和y位于数组的边界内 bool error(int x, int y) { if(x > 2 || y > 2 || board[x][y] != ' ') { return true; } return false; } 另外,你可能希望你的if(error)检查处于一个循环中。因此,

如果移动有效,您的错误函数将不会返回任何内容,并导致未定义的行为。您希望在if语句之后添加一个return false;。此外,您还希望确保x和y位于数组的边界内

bool error(int x, int y)
{
    if(x > 2 || y > 2 || board[x][y] != ' ') 
    {
         return true;
    }

    return false;

}
另外,你可能希望你的if(error)检查处于一个循环中。因此,在玩家输入有效的移动之前,游戏不会继续

while (error(pos1, pos2))
{
    std::cout << "Please enter a valid position (1 to 3)" << std::endl;
    PlayerTurn = 0;
}
while(错误(位置1,位置2))
{

std::cout“但它有问题”没有提供足够的信息。您应该提供示例输入和输出。您希望它做什么,以及它正在做什么。@user2589195您得到的答案是,不仅仅是修复本身,这对学习其他内容很有用:1)始终调试代码。如果您无法找出错误,请逐步进行。2)编译器警告是您的朋友,不要忽略他们。