It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center




8年前关闭。




调试:

运行时检查失败 #2 - 变量“board”周围的堆栈已损坏。
程序“[5516] a12aa.exe: Native”已退出,代码为 0 (0x0)。

编辑:
哦,我没有提到仅在游戏模式 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];
    }
}

最佳答案

有几个地方可以分配给 board[len][len] ,例如:

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

这是越界的,因此是未定义的(实际上会破坏堆栈)。

关于c++ "Run-Time Check Failure #2 - Stack around the variable ' 板'已损坏”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14173764/

10-12 02:12