デバッグ:
実行時チェックの失敗 #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];
}
}