c++ "Run-Time Check Failure #2 - Stack around the variable ' board' 已损坏”

标签 c++ stack

<分区>

调试:

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

编辑: 哦,我没有提到这只发生在游戏模式 2 的游戏模式 1(玩 ginst 计算机)我有相同的 assgiment 并且它工作正常..

#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 ' board' 已损坏”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14173764/

相关文章:

javascript - 找不到预加载的图像 (emscripten)

C++ XOR 交换浮点值

c++ - 为什么这个质数每次都重复

java - 如何对栈中的元素求和

c - MIPS的堆栈让我脑洞大开

rust - 堆栈如何以与创建时不同的顺序处理弹出值?

c++ - PWSTR 到底是什么?为什么要使用此命名来与 C++ 中的 char*、std::string 或 CString 进行比较?

c++ - 在这种情况下从析构函数中抛出是否合适

c - 一堆纸牌和 war 游戏

c - C 段错误中的大型阵列,erathos 的 Sievs