2014-11-04 89 views
0

這個程序是一個簡單的井字遊戲玩家和電腦之間。如果所述空間尚未被佔用,則計算機僅生成隨機空間以移動到該空間。此外,我有垂直軸上的x座標,而y座標是水平軸上的。我這樣做是因爲我使用了二維數組,這就是它們的結構。井字遊戲陣列錯誤

運行該程序時,一些空格有問題,我找不到原因。當用戶輸入點(0,2)時,程序也填入點(1,0),反之亦然。這也發生在點(1,2)和(2,0)。

#include<iostream> 
#include<string> 
#include<stdlib.h> 
#include<ctime> 

using namespace std; 

int board[2][2]; 

int chooseFirstPlayer(); 
void userMove(int boardArray[2][2]); 
void compMove(int boardArray[2][2]); 
int checkIfWinner(int boardArray[2][2]); 
void displayBoard(int boardArray[2][2]); 

int main(){ 
    srand(time(NULL)); 
    int x,y,winner; 

    for(x = 0; x <= 2; x++){ //sets the enitre board array to 0 
     for(y = 0; y <= 2; y++){ 
      board[x][y] = 0; 
     } 
    } 

    if (chooseFirstPlayer() == 1){ //the user gets to movve first 

     do{//it will loop this until there is a winner 
      displayBoard(board); 
      userMove(board); 
      displayBoard(board); 
      winner = checkIfWinner(board); 

      if (winner == 0){//after the player moves, it will see if he won. If not, then the computer willbe able to move. 
       compMove(board); 
       displayBoard(board); 
       winner = checkIfWinner(board); 
      } 
     }while (winner == 0);//it will loop until a winner is found 


    } 
    else{//same structure as above just slightly altered to allow the computer to move first 

     do{ 
      compMove(board); 
      displayBoard(board); 
      winner = checkIfWinner(board); 

      if (winner == 0){ 
       userMove(board); 
       displayBoard(board); 
       winner = checkIfWinner(board); 
      } 
     }while(winner == 0); 
    } 

    if (winner = 1){ 
     cout << "Congratulations, you won!"; 
    } 
    else if (winner = 2){ 
     cout << "Sorry, you lost!"; 
    } 

} 

int chooseFirstPlayer(){//randomly genereate a number 1 or 2 to choose who moves first 

    return rand() % 2 + 1; 
} 

void userMove(int boardArray[2][2]){ 
    int userX, userY; 

    do{ 
     cout << "Enter an x coordinate: "<<endl; 
     cin >> userX; 

     cout << "Enter a y coordinate: "<<endl; 
     cin >> userY; 

     if (boardArray[userX][userY] != 0){ 
      cout << "That loaction is already occupied"<<endl; 
     } 
    }while(boardArray[userX][userX] != 0); 

    boardArray[userX][userY] = 1; 

} 

void compMove(int boardArray[2][2]){ 
    int compX,compY; 

    do{ 
     compX = rand() % 3; 
     compY = rand() % 3; 
    }while(boardArray[compX][compY] != 0); 

    boardArray[compX][compY] = 2; 
} 

int checkIfWinner(int boardArray[2][2]){ 


    if(boardArray[0][0] == boardArray[0][1] && boardArray[0][1] == boardArray[0][2]){ //across 
     return boardArray[0][0];} 
    else if (boardArray[1][0] == boardArray[1][1] && boardArray[1][1] == boardArray[1][2]){ 
     return boardArray[1][0];} 
    else if (boardArray[2][0] == boardArray[2][1] && boardArray[2][1] == boardArray[2][2]){ 
     return boardArray[2][0];} 
    else if (boardArray[0][0] == boardArray[1][0] && boardArray[1][0] == boardArray[2][0]){//down 
     return boardArray[0][0];} 
    else if (boardArray[0][1] == boardArray[1][1] && boardArray[1][1] == boardArray[2][1]){ 
     return boardArray[0][1];} 
    else if (boardArray[0][2] == boardArray[1][2] && boardArray[1][2] == boardArray[2][2]){ 
     return boardArray[0][2];} 
    else if (boardArray[0][0] == boardArray[1][1] && boardArray[1][1] == boardArray[2][2]){//diagonal 
     return boardArray[0][0];} 
    else if (boardArray[2][0] == boardArray[1][1] && boardArray[1][1] == boardArray[0][2]){ 
     return boardArray[2][0];} 
    else{ 
     return 0; 
     } 

} 

void displayBoard(int boardArray[2][2]){ 

    system("CLS"); 

    cout <<" "<<" Y1 "<<" Y2 "<<" Y3 "<<endl; 
    cout <<" X1 "<< "__"<<boardArray[0][0]<<"__|__"<<boardArray[0][1]<<"__|__"<<boardArray[0][2]<<"__"<<endl; 
    cout <<" X2 "<< "__"<<boardArray[1][0]<<"__|__"<<boardArray[1][1]<<"__|__"<<boardArray[1][2]<<"__"<<endl; 
    cout <<" X3 "<< " "<<boardArray[2][0]<<" | "<<boardArray[2][1]<<" | "<<boardArray[2][2]<<" "<<endl; 
} 

我的IDE是開發-C++(5.4.2)

+1

使用'int board [3] [3]'。當你聲明一個數組時,聲明它的大小,而不是最後一個索引。基於0的下標可能會造成混淆。 :) – 2014-11-04 17:43:09

+0

**評論:** IDE不是問題,只要您對「C++」有疑問即可通知編譯器。在你的情況下,我相信是MingW,但你沒有報告該版本。 – 2014-11-04 17:44:02

+0

哦,我不是在暗示IDE是問題,只是爲了以防萬一。 – 2014-11-04 17:46:27

回答

1

你的數組是2x2的,你做的事:

for(x = 0; x <= 2; x++){ //sets the enitre board array to 0 
     for(y = 0; y <= 2; y++){ 
      board[x][y] = 0; 
     } 
    } 

並訪問內存,你不應該。這意味着你正在走出界限!

這裏xy最終取值等於2。

索引數組從0開始,直到它的大小 - 1

所以,你可以使用3×3的陣列,或者改變您的代碼(和去,直到2功能checkIfWinner)。


旁註:

你已經錯過了平等的運營商在這裏:如果你把它當作是

if (winner = 1){ 
    cout << "Congratulations, you won!"; 
} 
else if (winner = 2){ 
    cout << "Sorry, you lost!"; 
} 

會發生什麼?這個任務將會發生,並且會導致邏輯真實,因此第一個條件將始終爲真(第二個,但代碼不會那麼遠)。

因此,將=更改爲==

+0

謝謝,我會upvote你,但我是新來這個網站 – 2014-11-04 17:48:01