2013-04-15 159 views
0

我想在我的tic tac toe遊戲中使用一個指針動態地分配一個數組。我對指針的工作方式有點困惑。我們使用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" 
     << "\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; 
} 
+4

cplusplus.com網站不是教科書。就這麼簡單。 – chris

+1

哪部分代碼令人困惑?也許[這](http://cslibrary.stanford.edu/106/)會有所幫助。更好的是,閱讀[this](http://pw1.netcom.com/~tjensen/ptr/pointers.htm) –

+9

只是一個離題的提示:你的評論太多了。例如'/ *將turnNum加1. * /'後跟'turnNum ++;'。只是'turnNum ++;'本身就非常清楚明確。它還降低了更改代碼並忘記更改註釋的風險。 –

回答

1

這是一個靜態分配的數組,編譯器知道「123456789」初始值設定項的大小。數組的大小爲10,因爲編譯器將爲C字符串所具有的'\ 0'終止符添加額外空間。

char board[] = "123456789"; 

這做同樣的事情與動態分配

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

用我們的決定有多大的程序運行時的陣列應該是動態分配的(這就是爲什麼它是動態)。但在這個程序中,大小總是十。下一行(strcpy)將相同的字符串複製到舊代碼中的動態分配數組中。

這樣做的好處是什麼?絕對沒有什麼。事實上,動態分配的版本更糟糕,如果我在標記自己的作品,會得到更低的分數。但是你被告知要這樣做,所以我想你必須這樣做。

+0

不要忘記刪除;) – Caribou