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(在计算机上玩游戏)中才会发生这种情况,我有相同的配置并且工作正常..
这是越界的,因此是未定义的(实际上会破坏堆栈)。
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