0

I am trying to use a dynamically allocate an array using a pointer in my tic tac toe game. I am a little confused on how exactly pointers work. We are using the cplusplus.com website as our textbook, and I think the section on pointers is a little confusing for me. Would it be possible to get a explanation of it and possibly help do that to my tic tac toe game? Here is my code:

//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"
         << "\n\n -> ";
    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;
}
user2085224
  • 49
  • 1
  • 6
  • 14
  • 4
    The cplusplus.com website is not a textbook. It's as simple as that. – chris Apr 15 '13 at 14:53
  • 1
    Which parts of the code are confusing? Maybe [this](http://cslibrary.stanford.edu/106/) will help. Better still ,read [this](http://pw1.netcom.com/~tjensen/ptr/pointers.htm) – Suvarna Pattayil Apr 15 '13 at 14:55
  • 9
    Just an off-topic tip: you comment too much. For example `/* Increment turnNum by 1. */` followed by `turnNum++;`. Just the `turnNum++;` by itself is perfectly clear and unambiguous. It also reduces the risk of changing the code and forgetting to change the comment. – robbie_c Apr 15 '13 at 14:56
  • 1
    While no reference site is perfect, you may want to demand some extra credit for suggesting the far less error-prone http://www.cppreference.com – Drew Dormann Apr 15 '13 at 15:04
  • 3
    Maybe you should use a textbook as your textbook. Using a reference and discussion group like cplusplus.com (or cppreference.com for that matter) is like using a dictionary to learn a foreign language - you'll understand single words but never understand the language as a whole. – Arne Mertz Apr 15 '13 at 15:06
  • `const int boardSize = 10;` is not a good start for a program about tic-tac-toe. I would fix that before you try anything to do with dynamic memory allocation. – john Apr 15 '13 at 15:40
  • Have you been told you have to use dynamic memory allocation? Because there is no reason to use it for this program. You might understand better if you are asked to write a program that needs dynamic allocation, instead of trying to add it to one that doesn't. – john Apr 15 '13 at 15:41
  • @chris The site does have a fairly extensive tutorial. Not a very good one (it introduces `new[]` before `vector`, whereas most C++ programmers will _never_ use `new[]`). – James Kanze Apr 15 '13 at 15:45
  • @chris- I understand cplusplus.com is not a textbook, however my professor is using it in place of a textbook. – user2085224 Apr 15 '13 at 15:46
  • @john He's learning from a site which doesn't know that C++ has `std::vector`, and uses `new []` for arrays. – James Kanze Apr 15 '13 at 15:46
  • 1
    @user2085224 Then you have a serious problem, because it is a very poor site. – James Kanze Apr 15 '13 at 15:47
  • @john - we were told to dynamically allocate the TicTacToe 'board' array. – user2085224 Apr 15 '13 at 15:47
  • @user2085224 Just looked some more. Do _not_ use this site. The authors don't know C++, and teach things that are simply wrong. – James Kanze Apr 15 '13 at 15:48
  • this is the second time you've posted this : although I see that you didn't get a C++ answer http://stackoverflow.com/questions/16007055/using-pointer-to-dynamically-allocate-tictactoe-board-array?rq=1 – Caribou Apr 15 '13 at 15:49
  • correction third: http://stackoverflow.com/questions/15697321/c-tic-tac-toe-program?rq=1 (although a different aspect of the assignment) – Caribou Apr 15 '13 at 15:51
  • 1
    @user2085224 If you were told to dynamically allocate the TicTacToe board, I think it's time you found a different course. In almost thirty years of C++, i've never used `new[]`. Ever. – James Kanze Apr 15 '13 at 15:51
  • As-written, the board size is accurate, (`"123456789" is 10-chars wide including the terminator), but how that size is later used isn't exactly what I think you're looking for. Thats a general problem with your algorithm; the dynamic-board issue is unrelated. – WhozCraig Apr 15 '13 at 15:56

1 Answers1

1

This is a statically allocated array, the compiler knows the size from the "123456789" initializer. The size of the array is 10 because the compiler will add an extra space for the '\0' terminator that C strings have.

char board[] = "123456789";

This does the same thing with dynamic allocation

char* board = new char[10];
strcpy(board, "123456789");

With dynamic allocation you get to decide how big the array should be when the program runs (that's why it's dynamic). But in this program the size is always ten. The next line (strcpy) copies the same string into the dynamically allocated array that you had in the old code.

What's the advantage of doing this? Absolutely nothing. In fact the version with dynamic allocation is worse and would get a lower mark from me if I were marking your work. But you've been told to do it so I suppose you must.

john
  • 7,897
  • 29
  • 27