2013-03-29 75 views
-1

我遇到了與實際程序有關的問題。在用戶選擇1或2與電腦或人對戰後,顯示的下一行是「這是一個平局」,它會跳過整個遊戲。我不確定爲什麼,因爲我將turnNum設置爲0,並在while循環的開始處增加1,並且如果turnNum等於10,它應該只是一個抽獎遊戲。我的代碼是否不正確?函數不起作用,當我叫它

/* 
    Template for TicTacToe.cpp (CS-509 Assignment 5) 

    Fill in the rest of this comment block. 
*/ 


#include<iostream> 
using namespace std; 

/* 
    Game status enumeration 
*/ 
enum Status { WIN, DRAW, CONTINUE, QUIT }; 


/* 
    Function prototypes 
*/ 
// showBoard: Show current state of board 
void showBoard(const char board[], int boardSize); 
// checkGameState: Returns WIN or CONTINUE 
Status checkGameState(const char board[]); 
int getHumanSquare(const char board[]); 
int getComputerSquare(const char board[]); 
// checkBadSquare: Checks to see if a chosen square is already taken; returns 
//     true if already taken; used by getHumanSquare and 
//     getComputerSquare functions above. 
bool checkBadSquare(const char board[], int squareNum); 
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. */ 
    cout << gameState; 




    /* 
     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.*/ 
     if (turnNum%2 != 0) 
{ 
      cout << "It's o's turn."; 
      currentSymbol = 'o'; 

      int getHumanSquare(); 

      return boardSize; 
} 

     /* Else (we are on an even-numbered turn) 
      Print "It's x's turn." 
      Set currentSymbol to 'x'. */ 
     else 
     { 
      cout << "It's x's turn."; 
      currentSymbol = 'x'; 
     } 


     /* If the gametype is 1 (human vs. human) 
       Call getHumanSquare function to get squareChoice.*/ 
     if (gametype == 1) 
{ 
      int getHumanSquare(); 

       return boardSize; 
} 


     /* Else (gametype is 2 (human vs. computer)) 
      Call getComputerSquare function to get squareChoice. */ 
     else 

      int getComputerSquare(); 
      { 
       return boardSize; 
      } 


     /* If squareChoice is -1 (human player quit) 
       Set gameState to QUIT.*/ 
     if (squareChoice == -1) 
     { 
      gameState = 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. */ 
     else 
{ 
      bool checkBadSquare(); 
       return boardSize; 

      Status checkGameState(); 
} 
    } 

    // end while 


    /* If gameState is WIN 
      print "Player " currentSymbol " is the winner." */ 
    if (gameState == WIN) 
     cout << "Player " << currentSymbol << " is the winnter."; 

    /* If gameState is DRAW 
      print "It's a draw." */ 
    if (gameState == DRAW) 
     cout << "It's a draw."; 

    return 0; 
} 

///////////////////////////////////////////////////////////////////// 

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 
     // No one has won yet 
     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; // Already taken 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; 
} 
+0

謝謝!我包括cstdlib。我不知道rand是在該庫中定義的。但是現在我遇到了一個與實際計劃相關的問題。在用戶選擇1或2與電腦或人對戰後,顯示的下一行是「這是一個平局」,它會跳過整個遊戲。我不知道爲什麼,因爲我將turnNum設置爲0,並在代碼的開頭增加1。我的代碼不正確? – user2085224

回答

0

添加到您的代碼的頂部#include<cstdlib> 蘭特()在庫文件中定義。

http://www.cplusplus.com/reference/cstdlib/rand/

+0

非常感謝!我不知道它是在不同的庫文件中。但是現在我遇到了與代碼不同的問題。在用戶選擇1或2與電腦或人對戰後,顯示的下一行是「這是一個平局」,它會跳過整個遊戲。我的代碼不正確? – user2085224

1

您可以鍵入

#include <stdlib.h> 

#include <cstdlib> 
+3

甚至更​​好,'#包括' –

+0

我使用#include 它的工作非常感謝你!但現在當我運行它,它編譯和工作,但用戶選擇1或2(對人類或計算機玩)後,它只是去它的一條畫線。遊戲不顯示,但所有的代碼都在我的主要功能。我是否寫錯了編碼? – user2085224

0

通過評論回覆您的問題:

你的代碼有幾大問題:從0 1枚舉元素的索引開始,所以繼續實際上是2.如果你輸入遊戲類型= 1, while循環將永遠不會執行。所以你有It is a DRAW

  1. 幾個語法錯誤:下面

    int getHumanSquare(); //are you calling a function or declaring a function? 
    return boardSize; 
    
    
    if (gametype == 1) 
    { 
        int getHumanSquare(); //^^^^^^same issues 
    
         return boardSize; 
    } 
    else //missing { and } here 
    
        int getComputerSquare(); 
        { 
         return boardSize; 
        } 
    

幾個相同的錯誤類型:

 bool checkBadSquare(); //same here 
    return boardSize; 

    Status checkGameState();//same here 
+0

我試圖調用一個函數,該函數在主代碼下面定義。 我有點困惑,你的意思是繼續是2? – user2085224

+0

@ user2085224你使用枚舉和繼續是一個成員,如果你打印這些枚舉字段的值,它將是2,並且繪製將是1,(WIN = 0,DRAW = 1,CONTINUE = 2,QUIT = 3 )將它們映射爲整數。如果你調用一個函數,你只需要使用函數的名字和參數,你不需要返回類型了。例如:getHumanSquare(); – taocp

+0

我嘗試過使用這些函數,但我對於將用於函數的參數有些遺失。 – user2085224

相關問題