【问题标题】:Why does my Tic Tac Toe logic have errors sometimes?为什么我的井字游戏逻辑有时会出错?
【发布时间】:2020-11-18 01:42:16
【问题描述】:

我刚开始在这里发布问题,所以如果我做错了什么,请告诉我。所以这个程序在 90% 的情况下都能正常工作,就像这里看到的那样。

但有时逻辑会关闭,如此处所示。 我已经浏览了我的代码一段时间,所以我终于屈服并寻求帮助!我的 logic() 函数似乎是准确的。我匹配了所有可能的获胜路线;行、列和对角线。出于某种原因,如果顶行是 -> 'X' | '哦' | 'X' -> 它宣布玩家一 (x) 为获胜者。有什么想法吗?

 #include <iostream>
    #include <iomanip>

using namespace std;

void drawBoard();
char board[3][3] = {'1','2','3','4','5','6','7','8','9'};   // 3x3 board
char player = 'X';
void game();
void toggle();
char logic();
void winner();
int main()
{
    drawBoard();
    while(1){
        game();
        drawBoard();
        toggle();
        if(logic() == 'X')
            cout << "Player 1 (X) Wins!" << endl;
        else if(logic() == 'O')
            cout << "Player 2 (O) Wins!" << endl;

    }

    return 0;
}

void drawBoard(){

    system("cls");
    cout << setw(35) << "Tic Tac Toe V 2.0! " << endl << endl;
    cout << setw(21) << board[0][0] << " | " << board[0][1] << " | " << board[0][2] << endl;
    cout << setw(30) << " --------- " << endl;
    cout << setw(21) << board[1][0] << " | " << board[1][1] << " | " << board[1][2] << endl;
    cout << setw(30) << " --------- " << endl;
    cout << setw(21) << board[2][0] << " | " << board[2][1] << " | " << board[2][2] << endl;

}

void game(){

    int input;

    cout << "Make your move..." << endl;
    cin >> input;

    if(input == 1)
        board[0][0] = player;
    else if(input == 2)
        board[0][1] = player;
    else if(input == 3)
        board[0][2] = player;
    else if(input == 4)
        board[1][0] = player;
    else if(input == 5)
        board[1][1] = player;
    else if(input == 6)
        board[1][2] = player;
    else if(input == 7)
        board[2][0] = player;
    else if(input == 8)
        board[2][1] = player;
    else if(input == 9)
        board[2][2] = player;


}

void toggle(){

    if(player == 'X')
        player = 'O';
    else
        player = 'X';

}


char logic(){
// Player 1
    /// Across
    if(board[0][0] == 'X' && board[0][1] == 'X' && board[0][2] == 'X')
        return 'X';
    else if(board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X')
        return 'X';
    else if(board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X')
        return 'X';
    /// Columns
    else if(board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X')
        return 'X';
    else if(board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X')
        return 'X';
    else if(board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X')
        return 'X';
    /// Diagonals
    else if(board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X')
        return 'X';
    else if(board[0][2] == 'X' && board[1][1] == 'X' && board[2][0] == 'X')
        return 'X';

// Player 2
    /// Across
    if(board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O')
        return 'O';
    else if(board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O')
        return 'O';
    else if(board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O')
        return 'O';
    /// Columns
    else if(board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O')
        return 'O';
    else if(board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O')
        return 'O';
    else if(board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O')
        return 'O';
    /// Diagonals
    else if(board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O')
        return 'O';
    else if(board[0][2] == 'O' && board[1][1] == 'O' && board[2][0] == 'O')
        return 'O';
}

【问题讨论】:

  • 当您使用调试器运行程序时,您看到了什么?这正是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用调试器一次运行一行的好机会,监控所有变量及其值的变化,并分析程序的逻辑执行流程。知道如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有问题,而无需向任何人寻求帮助。
  • 由于问题似乎出在获胜检测中,因此这是一个开始寻找的好地方。在编译时提高警告级别也会有所帮助。
  • 如果没有人获胜,逻辑将无法返回值。这绝对是一个错误。

标签: c++ tic-tac-toe


【解决方案1】:

在函数logic() 中,您缺少一个return 语句,这意味着如果不满足任何条件,该函数将只返回该寄存器中可能存在的任何内容。我发现如果在函数末尾添加return 0;,则不会出现这种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多