2012-04-14 19 views
-1

すべてが4回目まで動きます。その後ボードをリセットし、最初のボックスにXを入れます。どうしたの?また、私が答えに導かれるならば、私はそれが与えられただけでなく、それが学習のためであることを好むだろう。私はまた、1つの部分を切り取り、どのような効果があるかを調べることによって、何の助けもなく答えを見つけることを試みました。 (デバッガを使用する方法が分からないので、filenameにはデバッグ情報はありません)。Tic Tac Toe 3回目の移動後にボードをリセットする

#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; 
} 
+0

をあなたのデバッガを使用するには、例えば 'ため-g'で適切なコンパイラオプション(とあなたのプログラムをコンパイルする必要がありますgcc)。 – Anthales

+0

また、gccを使用している場合、 '-Wall'でコンパイルしてください。ほとんどの場合、何らかのエラーであることを警告します。 gccはあなたの 'makemove'関数が' if'のどれかがトリガーされなければ何の値も返しません。また、あなたのステートメント 'board [0] [1] == 'X';は効果がありません、あなたはおそらく' board [0] [1] = 'X'; – Anthales

+0

Pelles C ideについてのアイデアは、makemoveでも、すべてのブロックが取られるとifまたはelse if文がトリガーされないため不可能です。movecountは9になるので、ゲームが終了するでしょう。その代わりに=の代わりに==。一定。しかし、同じ問題が続き、それは主要な問題を引き起こすものと思われます。 – latenightcode

答えて

0

は、私はそれを理解して、あなたがA.I.をしたい、あなたはcanwin()機能に問題を抱えて考えますそれが勝利の動きをすることができるかどうかをテストする。しかし、すでにそこに前のシンボルがあったかどうかをチェックせずに、あなたが実際に'X'を使用してボードの現在位置を上書きする機能

int canwin(void) 
{ 
    int rownumber,colnumber; 
    for(rownumber=0;rownumber<3;rownumber++) 
    { 
     for(colnumber=0;colnumber<3;colnumber++) 
     { 
      board[rownumber][colnumber]='X'; // <--- Problem here 
      if(checkwin('X')==1) 
      { 
       return 1; 
      } 
      board[rownumber][colnumber]=' '; 
     } 
    } 
    return 0; 
} 

を見て!したがって、ボードを'X'で上書きして、Xプレーヤーが勝ったかどうかをチェックし、空のスペースに「リセット」していない場合は' '

あなたはこのようなあなたの書き込みの前にチェックを挿入することによって、この問題を解決することができます

if (board[rownumber][colnumber] == ' ') 
{ 
    board[rownumber][colnumber]='X'; 
    ... 
+0

ああ!!!!その空白部分は私の擬似コードの一部でした!ありがとう!!それは私のcanwinとcanblock関数の問題だったようです。ありがとう! – latenightcode

+0

Hm ..コードを自分で実行しましたが、これで問題は解決しませんでした。あなたはどうですか? – Anthales

+0

ああ、あなたは 'canblock()'関数でまったく同じ問題を抱えていると思います。これは少なくとも私のコードを修正するように思えました。それでなければならない。 – Anthales