3

デバッグ:

実行時チェックの失敗 #2 - 変数「board」の周りのスタックが壊れていました。プログラム '[5516] a12aa.exe: Native' はコード 0 (0x0) で終了しました。

編集:ああ、ゲームモード2のゲームモード1(コンピューターに対してプレイ)でのみ発生することについては言及していませんでした。同じ割り当てがあり、正常に動作しています..

#include <iostream>
#include <cstring>

using namespace std;

const int len=3;
//functions:
void printBoard(char board[len][len]);// prints game board

char userTurn (char board[len][len],int player);
char compTurn(char board[len][len]);

bool checkWin(char board[len][len]);// 
bool checkTie(char board[len][len]);// check if board is full 

char compDef(char board[len][len],bool &move);// computer defend move
char compAtt(char board[len][len],bool &move);// computer attck move
char nextMove(char board[len][len],bool &move);// regular move



int main() {

    char board[len][len] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};
    int gamemode;
    int winner=0;

    cout<<"Please choose game mode <1 - 1 player, 2 - 2 players>: ";
    cin>>gamemode;


    switch (gamemode){
    case 1: {
        printBoard(board);
        int player=1;
        while (!checkWin(board)&&!checkTie(board)) {
            cout<<"User turn: ";
            board[len][len] = userTurn(board,player);
            printBoard(board);
            winner=1;
            if (!checkWin(board)&&!checkTie(board)) {
                cout<<"Computer turn..."<<endl;
                board[len][len] = compTurn(board);
                printBoard(board);
                winner=2;
            } // if
        } //while
        cout<<"Game Over!!!"<<endl;
        if (checkTie(board)&&!checkWin(board))// board is full and nobody won
            cout<<"Its a Tie!!!"<<endl;
        else if (winner==1) // winner 1 - user ,, winner 2 - computer
            cout<<"You Win!!!"<<endl;
        else 
            cout<<"Computer Wins!!!"<<endl;
            } //case
            break;
    case 2: {
        printBoard(board);
        int player;
        while (!checkWin(board)&&!checkTie(board)) {
            cout<<"User 1 turn: ";
            player=1;
            board[len][len] = userTurn(board,player);
            printBoard(board);
            winner=1;
            if (!checkWin(board)&&!checkTie(board)) {
                cout<<"User 2 turn: ";
                player=2;
                board[len][len] = userTurn(board,player);
                printBoard(board);
                winner=2;
            } // if
        } //while
        cout<<"Game Over!!!"<<endl;
        if (checkTie(board)&&!checkWin(board))// board is full and nobody won
            cout<<"Its a Tie!!!"<<endl;
        else if (winner==1) // winner 1 - user 1,, winner 2 - user 2
            cout<<"User 1 Win!!!"<<endl;
        else 
            cout<<"User 2 Wins!!!"<<endl;           
            } //case
            break;
    default: { // choice is not 1 or 2
        cout<<"Choice unvaild!"<<endl;
             }  //default
             break;
    }

    return 0;
}//main

void printBoard (char board[len][len]) {
    for (int i=0;i<3;i++) {
        cout<<"-------"<<endl;
        cout<<"|"<<board[i][0]<<"|"<<board[i][1]<<"|"<<board[i][2]<<"|"<<endl;
    }
    cout<<"-------"<<endl;
}

char userTurn (char board[len][len],int player) {
    int i,j;
    do {
        cout<<"Please enter valid coordinates for i and j: ";
        cin>>i>>j;
        if (!(i>=0)||!(i<=2)||!(j>=0)||!(j<=2))
            cout<<"Invaild corrdinates!!!"<<endl;
        else if (board[i][j]!=' ')
            cout<<"The cell already has value!!"<<endl;
        else {
            char symbol;
            if (player==1)
                symbol='X';
            else
                symbol='O';
            board[i][j]= symbol;
            return board[len][len];
        }
    } while (board[i][j]!=' '||!(i>=0)||!(i<=2)||!(j>=0)||!(j<=2));// while chosen coordinates is not empty and 0<i<2 and 0<j<2
}

bool checkWin(char board[len][len]){
    for (int i=0;i<3;i++) {
        if (board[i][0]==board[i][1]&&board[i][0]==board[i][2]&&board[i][0]!=' ')// check win rows
            return true;
    }
    for (int i=0;i<3;i++) {
        if (board[0][i]==board[1][i]&&board[0][i]==board[2][i]&&board[0][i]!=' ')// check win cloumns
            return true;
    }
    if (board[0][0]==board[1][1]&&board[0][0]==board[2][2]&&board[0][0]!=' ')// check win diagonals
        return true;
    if (board[0][2]==board[1][1]&&board[0][2]==board[2][0]&&board[0][2]!=' ')
        return true;

    return false;
}//checkWin

bool checkTie(char board[len][len]){// check ifboard is full 
    for (int i=0;i<3;i++) {
        if (board[i][0]==' '||board[i][1]==' '||board[i][2]==' ')
            return false;
    }
    return true;
}


char compTurn(char board[len][len]){// README.txt
    bool move=false;
    if (board[1][1]==' '){
        board[1][1]='O';
        return board[len][len];
    }
    board[len][len]=compAtt(board,move);
    if (!move)
        board[len][len]=compDef(board,move);
    if (!move)
        board[len][len]=nextMove(board,move);

    return board[len][len];
}

char compDef(char board[len][len], bool &move) {
    //rows
    for (int i=0;i<3;i++) {
        if (board[i][0]=='X'&&board[i][1]=='X'&&board[i][2]==' '){
            board[i][2]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[i][0]=='X'&&board[i][1]==' '&&board[i][2]=='X'){
            board[i][1]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[i][0]==' '&&board[i][1]=='X'&&board[i][2]=='X'){
            board[i][0]='O';
            move=true;
            return board[len][len];
        }
    }
    //col
    for (int i=0;i<3;i++) {
        if (board[0][i]=='X'&&board[1][i]=='X'&&board[2][i]==' '){
            board[2][i]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[0][i]=='X'&&board[1][i]==' '&&board[2][i]=='X'){
            board[1][i]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[0][i]==' '&&board[1][i]=='X'&&board[2][i]=='X'){
            board[0][i]='O';
            move=true;
            return board[len][len];
        }
    }
    // diagonals

    if (board[0][0]=='X'&&board[1][1]=='X'&&board[2][2]==' '){
        board[2][2]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][0]=='X'&&board[1][1]==' '&&board[2][2]=='X'){
        board[1][1]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][0]==' '&&board[1][1]=='X'&&board[2][2]=='X'){
        board[0][0]='O';
        move=true;
        return board[len][len];
    }
    // 2
    if (board[0][2]=='X'&&board[1][1]=='X'&&board[2][0]==' '){
        board[2][0]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][2]=='X'&&board[1][1]==' '&&board[2][0]=='X'){
        board[1][1]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][2]==' '&&board[1][1]=='X'&&board[2][0]=='X'){
        board[0][2]='O';
        move=true;
        return board[len][len];
    }
}

char compAtt(char board[len][len],bool &move) {
    for (int i=0;i<3;i++) {
        if (board[i][0]=='O'&&board[i][1]=='O'&&board[i][2]==' '){
            board[i][2]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[i][0]=='O'&&board[i][1]==' '&&board[i][2]=='O'){
            board[i][1]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[i][0]==' '&&board[i][1]=='O'&&board[i][2]=='O'){
            board[i][0]='O';
            move=true;
            return board[len][len];
        }
    }
    //col
    for (int i=0;i<3;i++) {
        if (board[0][i]=='O'&&board[1][i]=='O'&&board[2][i]==' '){
            board[2][i]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[0][i]=='O'&&board[1][i]==' '&&board[2][i]=='O'){
            board[1][i]='O';
            move=true;
            return board[len][len];
        }
    }
    for (int i=0;i<3;i++) {
        if (board[0][i]==' '&&board[1][i]=='O'&&board[2][i]=='O'){
            board[0][i]='O';
            move=true;
            return board[len][len];
        }
    }
    // diagonals

    if (board[0][0]=='O'&&board[1][1]=='O'&&board[2][2]==' '){
        board[2][2]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][0]=='O'&&board[1][1]==' '&&board[2][2]=='O'){
        board[1][1]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][0]==' '&&board[1][1]=='O'&&board[2][2]=='O'){
        board[0][0]='O';
        move=true;
        return board[len][len];
    }
    // 2
    if (board[0][2]=='O'&&board[1][1]=='O'&&board[2][0]==' '){
        board[2][0]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][2]=='O'&&board[1][1]==' '&&board[2][0]=='O'){
        board[1][1]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][2]==' '&&board[1][1]=='O'&&board[2][0]=='O'){
        board[0][2]='O';
        move=true;
        return board[len][len];
    }
}


char nextMove(char board[len][len],bool &move) {
    // coreners
    if (board[0][0]==' '){
        board[0][0]='O';
        move=true;
        return board[len][len];
    }
    if (board[2][0]==' '){
        board[2][0]='O';
        move=true;
        return board[len][len];
    }
    if (board[0][2]==' '){
        board[0][2]='O';
        move=true;
        return board[len][len];
    }
    if (board[2][2]==' '){
        board[2][2]='O';
        move=true;
        return board[len][len];
    }
    // centers
    if (board[0][1]==' '){
        board[0][1]='O';
        move=true;
        return board[len][len];
    }
    if (board[1][0]==' '){
        board[1][0]='O';
        move=true;
        return board[len][len];
    }
    if (board[2][1]==' '){
        board[2][1]='O';
        move=true;
        return board[len][len];
    }
    if (board[1][2]==' '){
        board[1][2]='O';
        move=true;
        return board[len][len];
    }
}
4

2 に答える 2

5

に割り当てる場所がいくつかありますboard[len][len]。たとえば、次のとおりです。

                board[len][len] = userTurn(board,player);

これは範囲外であるため、定義されていません (実際にはスタックが破損します)。

于 2013-01-05T16:29:33.317 に答える
1

あなたがやっている:

board[len][len] = userTurn(board,player);

配列の終わりを超えて書き込みを行っています。

于 2013-01-05T16:29:38.717 に答える