簡體   English   中英

井字陣列錯誤

[英]Tic-Tac-Toe Array Error

該程序是播放器和計算機之間的一個簡單的Tic Tac Toe游戲。 如果所述空間尚未被占用,則計算機僅生成一個隨機空間。 另外,我在垂直軸上有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是Dev-C ++(5.4.2)

您的數組是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。

因此,您可以使用3x3的數組,或更改代碼(以及直到2的checkIfWinner函數)。


邊注:

您在這里錯過了相等運算符:

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

如果保持原樣會怎樣? 賦值將發生並導致邏輯為真,因此第一個條件將始終為真(第二個條件為零,但代碼不會走得那么遠)。

因此,用==更改=

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM