在Tic Tac Toe程序中使用数组

fda*_*ama 0 c++ arrays

我写了(有点帮助)一个tic tac toe程序.但是程序不使用数组来保存移动但使用char变量.这意味着有很多重复的代码.我想使用数组但是虽然我理解它的概念,但我很难弄清楚如何实现它.我使用什么类型的数组?而且我还假设大部分代码(检查有效移动,检查胜利等等)都会改变.

#include <iostream>

using namespace std;


int main()
{
    char cell1 = '1';
    char cell2 = '2';
    char cell3 = '3';
    char cell4 = '4';
    char cell5 = '5';
    char cell6 = '6';
    char cell7 = '7';
    char cell8 = '8';
    char cell9 = '9';
    char player = '1';
    char mark;
    bool gameover = false;

    do
    {
        cout << cell1 <<"|"<< cell2 << "|" << cell3 << endl;
        cout <<"-+-+-"<< endl;
        cout << cell4 <<"|"<< cell5 << "|" << cell6 << endl;
        cout <<"-+-+-"<< endl;
        cout << cell7 <<"|"<< cell8 << "|" << cell9 << endl;
        cout <<"-+-+-"<< endl;

        //printBoard();

        //Handle player marker
        if (player == '1')
        {
            mark = 'X';
        }
        else
        {
            mark = 'O';
        }

        bool invalid; 
        do
        {
            cout << "Player "<<player<< ": \n";
            char move;
            cin >> move;
            invalid = false;


            //Validate move

            if (move == '1' && cell1 == '1')
            {
                cell1 = mark;
            }

            else if (move == '2' && cell2 == '2')
            {
                cell2 = mark;
            }

            else if (move == '3' && cell3 == '3')
            {
                cell3 = mark;
            }

            else if (move == '4' && cell4 == '4')
            {
                cell4 = mark;
            }

            else if (move == '5' && cell5 == '5')
            {
                cell5 = mark;
            }

            else if (move == '6' && cell6 == '6')
            {
                cell6 = mark;
            }

            else if (move == '7' && cell7 == '7')
            {
                cell7 = mark;
            }

            else if (move == '8' && cell8 == '8')
            {
                cell8 = mark;
            }

            else if (move == '9' && cell9 == '9')
            {
                cell9 = mark;
            }

            else
            {
                cout <<" Invalid Move"<<endl;;
                invalid = true;
            }
        }
        while (invalid);                             

        //Check for winning & draw conditions

        bool draw = false;
        if (cell1 != '1')
        {
            if (cell1 == cell2 && cell1 == cell3)
            {
                gameover = true;
            }

            else if (cell1 == cell4 && cell1 == cell7)
            {
                gameover = true;
            }
        }

        if (cell9 != '9')
        {
            if (cell9 == cell3 && cell9 == cell6)
            {
                gameover = true;
            }

            else if (cell9 == cell8 && cell9 == cell7)
            {
                gameover = true;
            }
        }

        if (cell5 != '5')
        {
            if (cell5 == cell2 && cell5 == cell8)
            {
                gameover = true;
            }

            else if (cell5 == cell4 && cell5 == cell6)
            {
                gameover = true;
            }

            else if (cell5 == cell1 && cell5 == cell9)
            {
                gameover = true;
            }

            else if (cell5 == cell3 && cell5 == cell7)
            {
                gameover = true;
            }

        }

        // Check for draw conditions
        if ( cell1 != '1' && cell2 != '2' && cell3 != '3' && 
            cell4 != '4' && cell5 != '5' && cell6 != '6' &&
            cell7 != '7' && cell8 != '8' && cell9 != '9')
        {
            cout <<" Its a draw"<<endl;
            gameover = true;
            draw = true; 
        }

        if (gameover)
        {
            if (draw == false)
            {
                cout << "Player "<< player << " wins!"<<endl;
                cout <<endl;
            }

            //printBoard();
            cout << cell1 <<"|"<< cell2 << "|" << cell3 << endl;
            cout <<"-+-+-"<< endl;
            cout << cell4 <<"|"<< cell5 << "|" << cell6 << endl;
            cout <<"-+-+-"<< endl;
            cout << cell7 <<"|"<< cell8 << "|" << cell9 << endl;
            cout <<"-+-+-"<< endl;
            cout <<endl;

            cout<< "Play again? (y/n)"<< endl;
            char playAgain;
            cin >> playAgain;

            //Reset board if user wants to play again
            if (playAgain == 'y')
            {
                gameover = false;
                cell1 = '1';
                cell2 = '2';
                cell3 = '3';
                cell4 = '4';
                cell5 = '5';
                cell6 = '6';
                cell7 = '7';
                cell8 = '8';
                cell9 = '9';

                player = '1';
            }
        }

        else
        {

            //Alternate players
            if (player == '1')
            {
                player = '2';
            }
            else
            {
                player = '1';
            }
        }


    }
    while (gameover == false);                          
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Log*_*ker 6

我使用什么类型的数组?

你会想要使用二维数组(3 x 3).因此,不是拥有cell1,cell2,... cell9,而是拥有单个(二维)数组,如下所示:

cell[3][3];
Run Code Online (Sandbox Code Playgroud)

第一组括号表示行(水平),第二组括号表示列(垂直).

以下是2d数组将如何替换您的9个变量:

cell1 --> cell[0][0] 
cell2 --> cell[0][1] 
cell3 --> cell[0][2] 
cell4 --> cell[1][0] 
cell5 --> cell[1][1] 
cell6 --> cell[1][2] 
cell7 --> cell[2][0] 
cell8 --> cell[2][1] 
cell9 --> cell[2][2]
Run Code Online (Sandbox Code Playgroud)

而且我还假设大部分代码(检查有效移动,检查胜利等等)都会改变.

然后,只要您将所有单元格#变量更改为相应的2d数组插槽,您的程序就可以正常工作.