したがって、4番目の動きまですべてが正常に機能します。次に、ボードをリセットし、Xを最初のボックスに入れます。どうしたの?また、私は答えを与えられるだけでなく、それが学習のためであるという答えに導かれることを望みます。また、一部を切り取って効果を確認することで、助けを借りずに答えを見つけようとしました。(デバッガーの使用方法がわからないため、常に提供されます。ファイル名にはデバッグ情報がありません)。
#include <stdio.h>
#include <stdlib.h>
int clear(void);
int displayboard(void);
int initialize(void);
int startgame(void);
int checkwin(char);
int canwin(void);
int getmove(void);
int makemove(void);
int canblock(void);
char board[3][3];
int main()
{
int menuchoice;
while(1)
{
printf(" |\\ /| | | /\\ |\\ |\n");
printf(" | \\/ | | | /--\\ | \\ |\n");
printf(" | | | |_ / \\ | \\|\n");
printf(" Tic-tac-toe Version 1 \n\n");
printf(" [Main Menu]\n");
printf(" 1 - Start game\n");
printf(" 2 - Exit game\n");
scanf("%d",&menuchoice);
if(menuchoice==1)
{
clear();
startgame();
}
else if(menuchoice==2)
{
exit(EXIT_SUCCESS);
}
}
}
/* Prints newlines to refresh the page */
int clear(void)
{
int i;
for(i=0;i<25;i++)
{
printf("\n");
}
return 0;
}
/* Makes the board blank */
int initialize(void)
{
int numrow,numcol;
numrow=0;
numcol=0;
while(numrow<3)
{
while(numcol<3)
{
board[numrow][numcol]=' ';
numcol++;
}
numcol=0;
numrow++;
}
return 0;
}
/* Prints the board */
int displayboard(void)
{
printf(" 1 2 3\n\n\n");
printf(" 1 %c | %c | %c \n",board[0][0],board[0][1],board[0][2]);
printf(" ------------- \n");
printf(" 2 %c | %c | %c \n",board[1][0],board[1][1],board[1][2]);
printf(" ------------- \n");
printf(" 3 %c | %c | %c \n",board[2][0],board[2][1],board[2][2]);
return 0;
}
/* Function that controls the game*/
int startgame(void)
{
int movecount;
while(1)
{
movecount=0;
initialize();
displayboard();
board[1][1]='X';
clear();
displayboard();
getmove();
makemove();
movecount=3;
while(1)
{
clear();
displayboard();
getmove();
/* I believe the problem starts here */
if(checkwin('O')==1)
{
printf("\n\t\t\tYou WIN!!!!");
/*just to test*/
exit(EXIT_SUCCESS);
}
movecount++;
canwin(); /* Checks if it can make winning move */
if(canblock()==0) /*if a move to block has not been made*/
{
makemove();
movecount++;
}
else if(canblock()==1) /*if a move to block has been made*/
{
movecount++;
}
if(checkwin('X')==1)
{
printf("\n\t\t\tYou LOSE!!!");
/* just to test */
exit(EXIT_SUCCESS);
}
if(movecount==9)
{
printf(" Its a DRAW!!!");
/*Just to test */
exit(EXIT_SUCCESS);
}
}
}
}
/* Function to check win */
int checkwin(char ltr)
{
int rownumber,colnumber;
for(rownumber=0;rownumber<3;rownumber++)
{
if(board[rownumber][0]==ltr && board[rownumber][1]==ltr && board[rownumber][2]==ltr)
{
return 1;
}
}
for(colnumber=0;colnumber<3;colnumber++)
{
if(board[0][colnumber]==ltr && board[1][colnumber]==ltr && board[2][colnumber]==1)
{
return 1;
}
}
if(board[0][0]==ltr && board[1][1]==ltr && board[2][2]==ltr)
{
return 1;
}
else if(board[0][2]==ltr && board[1][1]==ltr && board[2][0]==ltr)
{
return 1;
}
else
return 0;
}
/* Function to get move */
int getmove(void)
{
int colnumber,rownumber;
printf("\n\t\t\tWhat row do you want to put your move?\n");
scanf("%d",&rownumber);
printf("\n\t\t\tWhat column do you want to put your move?\n");
scanf("%d",&colnumber);
board[rownumber-1][colnumber-1]='O';
return 0;
}
/* Function to makemove */
int makemove(void)
{
if(board[0][0]==' ')
{
board[0][0]='X';
return 0;
}
else if(board[0][2]==' ')
{
board[0][2]='X';
return 0;
}
else if(board[2][0]==' ')
{
board[2][0]='X';
return 0;
}
else if(board[2][2]==' ')
{
board[2][2]='X';
return 0;
}
else if(board[0][1]==' ')
{
board[0][1]=='X';
return 0;
}
else if(board[1][0]==' ')
{
board[1][0]='X';
return 0;
}
else if(board[1][2]==' ')
{
board[1][2]='X';
return 0;
}
else if(board[2][1]==' ')
{
board[2][1]='X';
return 0;
}
}
/* Function to make winning move */
int canwin(void)
{
int rownumber,colnumber;
for(rownumber=0;rownumber<3;rownumber++)
{
for(colnumber=0;colnumber<3;colnumber++)
{
board[rownumber][colnumber]='X';
if(checkwin('X')==1)
{
return 1;
}
board[rownumber][colnumber]=' ';
}
}
return 0;
}
/* Function to block winning move */
int canblock(void)
{
int rownumber,colnumber;
for(rownumber=0;rownumber<3;rownumber++)
{
for(colnumber=0;colnumber<3;colnumber++)
{
board[rownumber][colnumber]='O';
if(checkwin('O')==1)
{
board[rownumber][colnumber]='X';
return 1;
}
else if(checkwin('O')==0)
{
board[rownumber][colnumber]=' ';
}
}
}
return 0;
}