我的井字游戏几乎完成了。目前,它被设置为两人对人,但我知道我必须实现一个简单的AI才能获得批准。现在,我需要您的帮助。我知道我必须在一些小步骤中考虑一下,例如三种“举动”方法,例如

  • 如果AI在第一列中移动了&&,则打开了右侧的两个框,在其中一个框中进行移动并返回true
  • 如果AI在中间移动了&&,则打开了左右框,请在其中一个框内移动,并返回true
  • 如果AI在第3列中移动了&&,则打开了左侧的两个框,请在其中一个框中进行移动并返回true

  • 我无法完全理解如何在下面的代码中实现它:
    #include <iostream>
    using namespace std;
    char matrix[3][3] = { '7', '8', '9', '4', '5', '6', '1', '2', '3' };
    char player = 'X';
    int n;
    void Draw()
    {
        system("cls");
        cout << "Tic Tac Toe !\n" << endl;
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                cout << matrix[i][j] << " ";
            }
            cout << endl;
        }
    }
    void Input()
    {
        int a;
        cout << "\nIt's " << player << " turn. " << "Press the number of the field: ";
        cin >> a;
    
        if (a == 7)
        {
            if (matrix[0][0] == '7')
                matrix[0][0] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 8)
        {
            if (matrix[0][1] == '8')
                matrix[0][1] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 9)
        {
            if (matrix[0][2] == '9')
                matrix[0][2] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 4)
        {
            if (matrix[1][0] == '4')
                matrix[1][0] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 5)
        {
            if (matrix[1][1] == '5')
                matrix[1][1] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 6)
        {
            if (matrix[1][2] == '6')
                matrix[1][2] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 1)
        {
            if (matrix[2][0] == '1')
                matrix[2][0] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 2)
        {
            if (matrix[2][1] == '2')
                matrix[2][1] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
        else if (a == 3)
        {
            if (matrix[2][2] == '3')
                matrix[2][2] = player;
            else
            {
                cout << "Field is already in use try again!" << endl;
                Input();
            }
        }
    
    }
    void TogglePlayer()
    {
        if (player == 'X')
            player = 'O';
        else
            player = 'X';
    }
    char Win()
    {
        //first player
        if (matrix[0][0] == 'X' && matrix[0][1] == 'X' && matrix[0][2] == 'X')
            return 'X';
        if (matrix[1][0] == 'X' && matrix[1][1] == 'X' && matrix[1][2] == 'X')
            return 'X';
        if (matrix[2][0] == 'X' && matrix[2][1] == 'X' && matrix[2][2] == 'X')
            return 'X';
    
        if (matrix[0][0] == 'X' && matrix[1][0] == 'X' && matrix[2][0] == 'X')
            return 'X';
        if (matrix[0][1] == 'X' && matrix[1][1] == 'X' && matrix[2][1] == 'X')
            return 'X';
        if (matrix[0][2] == 'X' && matrix[1][2] == 'X' && matrix[2][2] == 'X')
            return 'X';
    
        if (matrix[0][0] == 'X' && matrix[1][1] == 'X' && matrix[2][2] == 'X')
            return 'X';
        if (matrix[2][0] == 'X' && matrix[1][1] == 'X' && matrix[0][2] == 'X')
            return 'X';
    
        //second player
        if (matrix[0][0] == 'O' && matrix[0][1] == 'O' && matrix[0][2] == 'O')
            return 'O';
        if (matrix[1][0] == 'O' && matrix[1][1] == 'O' && matrix[1][2] == 'O')
            return 'O';
        if (matrix[2][0] == 'O' && matrix[2][1] == 'O' && matrix[2][2] == 'O')
            return 'O';
    
        if (matrix[0][0] == 'O' && matrix[1][0] == 'O' && matrix[2][0] == 'O')
            return 'O';
        if (matrix[0][1] == 'O' && matrix[1][1] == 'O' && matrix[2][1] == 'O')
            return 'O';
        if (matrix[0][2] == 'O' && matrix[1][2] == 'O' && matrix[2][2] == 'O')
            return 'O';
    
        if (matrix[0][0] == 'O' && matrix[1][1] == 'O' && matrix[2][2] == 'O')
            return 'O';
        if (matrix[2][0] == 'O' && matrix[1][1] == 'O' && matrix[0][2] == 'O')
            return 'O';
    
        return '/';
    }
    
    int main()
    {
        n = 0;
        Draw();
        while (1)
        {
            n++;
            Input();
            Draw();
            if (Win() == 'X')
            {
                cout << "X wins!" << endl;
                break;
            }
            else if (Win() == 'O')
            {
                cout << "O wins!" << endl;
                break;
            }
            else if (Win() == '/' && n == 9)
            {
                cout << "It's a draw!" << endl;
                break;
            }
            TogglePlayer();
        }
        system("pause");
        return 0;
    }
    

    最佳答案

    可以使用Minimax算法来实现诸如Tic-Tac-Toe之类的简单棋盘游戏的计算机玩家,该算法可以使用α-β-pruning进行改进。尽管最终的实现会很小,但是可能需要一些时间来理解。

    关于c++ - C++井字游戏AI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27925608/

    10-16 01:02