使用指针动态分配数组

Using a pointer to dynamically allocate array

本文关键字:数组 动态分配 指针      更新时间:2023-10-16

我试图在我的井字游戏中使用指针动态分配数组。我对指针到底是如何工作的有点困惑。我们使用cplusplus.com网站作为我们的教科书,我认为关于指针的部分对我来说有点困惑。是否有可能得到一个解释,并可能帮助我的井字游戏?下面是我的代码:

//Sophia Ali
// TicTacToe (CS-509 Assignment 5)
#include<iostream>
#include<cstdlib>
using namespace std;
enum Status { WIN, DRAW, CONTINUE, QUIT };
void showBoard( const char board[], int boardSize );
// show current state of board
Status checkGameState( const char board[] );
// returns WIN or CONTINUE
int getHumanSquare( const char board[] );
int getComputerSquare( const char board[] );
bool checkBadSquare( const char board[], int squareNum );
// checks to see if a chosen square is already taken; returns true if
// already taken; used by get*Square functions above.
int getrandint( int min, int max );

int main()
{
    char board[] = "123456789";   // 10 element char board
    const int boardSize = 10;
    Status gameState = CONTINUE;
    int gametype, squareChoice, turnNum = 0;
    char currentSymbol;           // 'o' or 'x'

    cout << "n This is a Tic Tac Toe program. Choose the type of game: "
         << "n (1) human o vs. human x    (2) human o vs. dumb computer x"
         << "nn -> ";
    cin  >> gametype;
    /* Show the current state of Tic Tac Toe board. */
    showBoard( board, boardSize );
    /*
       Main game loop
     */
    while ( gameState == CONTINUE )
    {
        /* Increment turnNum by 1. */
        turnNum++;

        /* If turnNum equal to 10
              Set gameState to DRAW.
              Break out of while loop. */
        if ( turnNum == 10 )
        {
            gameState = DRAW;
            break;
        }

        /* If we are on an odd-numbered turn
              Print "It's o's turn."
              Set currentSymbol to 'o'.
              Call getHumanSquare function to get squareChoice.
           Else (we are on an even-numbered turn)
              Print "It's x's turn."
              Set currentSymbol to 'x'.
              If the gametype is 1 (human vs. human)
                 Call getHumanSquare function to get squareChoice.
              Else (gametype is 2 (human vs. computer))
                 Call getComputerSquare function to get squareChoice.*/
        // Get current player's square choice and insert into board
        if ( turnNum%2 != 0)
        {
            cout << "n It's o's turn.";
            currentSymbol = 'o';
            squareChoice = getHumanSquare( board );
        }
        else
        {
            cout << "n It's x's turn.";
            currentSymbol = 'x';
            if ( gametype == 1 )
                squareChoice = getHumanSquare( board );
            else
                squareChoice = getComputerSquare( board );
        }
        /* If squareChoice is -1 (human player quit)
              Set gameState to QUIT.
           Else
              Insert currentSymbol into board at (squareChoice - 1).
              Show the current state of the Tic Tac Toe board.
              Call checkGameState function to determine the gameState. */
        if ( squareChoice == -1 )
            gameState = QUIT;
        else
        {
            board[ squareChoice - 1 ] = currentSymbol;
            showBoard( board, boardSize );
            gameState = checkGameState( board );
        }
    }     // end while

    /* If gameState is WIN
              print "Player " currentSymbol " is the winner." */
    /* If gameState is DRAW
              print "It's a draw." */
    if ( gameState == WIN )
        cout << "Player " <<currentSymbol << " is the winner.";
    if ( gameState == DRAW )
        cout << "It's a draw.";
    return 0;
} // end main


/////////////////////////////////////////////////////////////////////
void showBoard( const char board [], int size )
{
    cout << endl;
    for ( int i = 0; i < size ; i++ )
    {
        cout << board[ i ] << " ";
        if ( ( i + 1 ) % 3 == 0 )
            cout << endl;
    }
    cout << endl;
}
/////////////////////////////////////////////////////////////////////
Status checkGameState( const char board[] )
{
    // Board       Array
    //
    // 1 2 3       0 1 2
    // 4 5 6  -->  3 4 5
    // 7 8 9       6 7 8
    //
    // Diagonal winners
    if ( board[ 0 ] == board[ 4 ] && board[ 0 ] == board[ 8 ] )
        return WIN;
    else if ( board[ 2 ] == board[ 4 ] && board[ 4 ] == board[ 6 ] )
        return WIN;
    // Horizontal winners
    else if ( board[ 0 ] == board[ 1 ] && board[ 1 ] == board[ 2 ] )
        return WIN;
    else if ( board[ 3 ] == board[ 4 ] && board[ 4 ] == board[ 5 ] )
        return WIN;
    else if ( board[ 6 ] == board[ 7 ] && board[ 7 ] == board[ 8 ] )
        return WIN;
    // Vertical winners
    else if ( board[ 0 ] == board[ 3 ] && board[ 3 ] == board[ 6 ] )
        return WIN;
    else if ( board[ 1 ] == board[ 4 ] && board[ 4 ] == board[ 7 ] )
        return WIN;
    else if ( board[ 2 ] == board[ 5 ] && board[ 5 ] == board[ 8 ] )
        return WIN;
    else
        return CONTINUE;
}
/////////////////////////////////////////////////////////////////////
int getHumanSquare( const char board[] )
{
    int squareNum;
    cout << "n Input the number of an empty square: (-1 to quit) ";
    cin  >> squareNum;
    while ( checkBadSquare( board, squareNum ) == true )
    {
        cout << "n Bad input. Choose another square: ";
        cin >> squareNum;
    }
    return squareNum;
}
/////////////////////////////////////////////////////////////////////
int getComputerSquare( const char board[] )
{
    int squareNum;
    squareNum = getrandint( 1, 9 );
    while ( checkBadSquare( board, squareNum ) == true )
    {
        squareNum = getrandint( 1, 9 );
    }
    return squareNum;
}
/////////////////////////////////////////////////////////////////////
bool checkBadSquare( const char board[], int squareNum )
{
    int realSquareNum = squareNum - 1; // count from 0
    if ( squareNum == -1 )
        return false;  // Let quit code pass as a valid square
    else if ( squareNum > 9 )
        return true;   // Square numbers out of range are invalid
    else if ( board[ realSquareNum ] == 'o' || board[ realSquareNum ] == 'x' )
        return true;   // Occupied squares are invalid
    else
        return false;  // Valid square number
}
/////////////////////////////////////////////////////////////////////
int getrandint( int min, int max )
{
    int scale, shift;
    scale = max - min + 1;
    shift = min;
    return rand() % scale + shift;
}

这是一个静态分配的数组,编译器从"123456789"初始化项中知道它的大小。数组的大小是10,因为编译器会为C字符串的''结束符添加额外的空间。

char board[] = "123456789";

这与动态分配

做同样的事情
char* board = new char[10];
strcpy(board, "123456789");
通过动态分配,您可以在程序运行时决定数组的大小(这就是为什么它是动态)。但在这个程序中,大小总是10。下一行(strcpy)将相同的字符串复制到旧代码中动态分配的数组中。

这样做的好处是什么?没有绝对。事实上,动态分配的版本更糟糕,如果我给你的作业打分,我会给你打更低的分。但是你已经被告知要这样做了,所以我想你必须这样做。