2016-05-14 2 views
1

私はこのサイトを初めて使っていますので、私と一緒に裸にしてください、私はこの本の練習問題を解決しようとしています。読んで、自分自身に私の自己を教えるC++。条件が真でないときに私のプログラムがif文を実行している理由を理解できません

問題(章では、列挙子の話)ボード上の値を表すためにenumを使用して、2人がプレイできることをチックタックつま先ゲームを作成するように求められます。

これは私が今までに書いたコードであり、すべてがうまくいくように見えますが、1行3列に入ると、Xプレイヤーの順番になるとゲームが終了し、ゲームが終わっていないにもかかわらず、再びかどうかはわかりません。

私は理由が分かりません。なぜなら、この座標は唯一のため、Xプレイヤーのターンの間だけです。

プログラムを使用するには、最初に行番号と列番号を入力します。

私はあなたがボード上の場所を上書きできることも知っています、私はただあなたが現時点ではないと仮定しています。

誰かがこのバグをよく指摘するのを助けてくれたら、私のコードは読みづらいかもしれません。申し訳ありませんが、私はまだ練習しており、プログラミングはかなり新しいです。

コードの行が何をしているのかを説明するのは嬉しいです。ここで

はコードです:winCondition

#include<iostream> 
#include<array> 

enum TicTacToeSquare 
{ 
    blankSquare=0, 
    X=1, 
    O=2 
}; 

int turn=0; 

using namespace std; 

int winCondition(int a[3][3]); 
void printBoard(int a[3][3]); 
void resetBoard(int a[3][3]); 
int testBoard(int a[3][3]); 

int main() 
{ 
    int choice; 

    int board[3][3]= 
    { 
     {0,0,0}, 
     {0,0,0}, 
     {0,0,0} 
    }; 

    int i,j; 

    while (true) 
    { 
     for (turn=0;turn<9;++turn) 
     { 
      if (turn%2==0) 
      { 
       std::cout<<"Player X: \n"<<"Enter board position: \n"; 
       std::cin>>i>>j; 
       std::cout<<std::endl; 
       board[i-1][j-1]=X; 
       printBoard(board); 

       if (winCondition(board)==1) 
       { 
        int choice; 
        cout<<"\nDo you want to play again?"<<endl; 
        cout<<"1. Yes\n"<<"2. No"<<endl; 
        cin>>choice; 

        if (choice==1) 
        { 
         resetBoard(board); 
         std::cout<<std::endl; 
         printBoard(board); 
         turn=0; 
        } 
        else if (choice==2) 
        { 
         cout<<"\nThanks for playing!"<<endl; 
         return 0; 
        } 
        else 
        { 
         cout<<"\nInvalid option, game will terminate."<<endl; 
         return 0; 
        } 
       } 
      } 

      if (turn%2!=0) 
      { 
       std::cout<<"Player O: \n"<<"Enter board position: \n"; 
       std::cin>>i>>j; 
       std::cout<<std::endl; 
       board[i-1][j-1]=O; 
       printBoard(board); 

       if (winCondition(board)==2) 
       { 
        int choice; 
        cout<<"\nDo you want to play again?"<<endl; 
        cout<<"1. Yes\n"<<"2. No"<<endl; 
        cin>>choice; 

        if (choice==1) 
        { 
         resetBoard(board); 
         std::cout<<std::endl; 
         printBoard(board); 
         turn=0; 
        } 
        else if (choice==2) 
        { 
         cout<<"\nThanks for playing!"<<endl; 
         return 0; 
        } 
        else 
        { 
         cout<<"\nInvalid option, game will now terminate."<<endl; 
         return 0; 
        } 
       } 
      } 
     } 
     std::cout<<"Game is a draw!"<<std::endl; 
     std::cout<<"Do you want to play again?"<<std::endl; 
     std::cin>>choice; 

     if (choice==1) 
     { 
      resetBoard(board); 
      std::cout<<std::endl; 
      printBoard(board); 
     } 
     else if (choice==2) 
     { 
      cout<<"\nThanks for playing!"<<std::endl; 
      return 0; 
     } 
     else 
     { 
      cout<<"Invalid option, game will now terminate."<<endl; 
      return 0; 
     } 
    } 
} 

void printBoard(int board[3][3]) 
{ 
    for (int i=1;i<4;++i) 
    { 
     for (int j=1;j<4;++j) 
     { 
      cout<<board[i-1][j-1]<<" "; 

      if (j%3==0) 
      { 
       cout<<"\n"; 
      } 
     } 
    } 
} 

int winCondition(int board[3][3]) 
{ 


    if (board[0][0]==X&&board[0][1]==X&&board[0][2]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[0][0]==O&&board[0][1]==O&&board[0][2]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[0][0]==X&&board[1][0]==X&&board[2][0]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[0][0]==O&&board[1][0]==O&&board[2][0]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[0][1]==X&&board[1][1]==X&&board[2][1]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[0][1]==O&&board[1][1]==O&&board[2][1]==O) 
    { 
     cout<<"\Player O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[0][2]==X&&board[1][2]==X&&board[2][2]==X) 
    { 
     cout<<"Player X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[0][2]==O&&board[1][2]==O&&board[2][2]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[1][0]==X&&board[1][1]==X&&board[1][2]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[1][0]==O&&board[1][1]==O&&board[1][2]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[2][0]==X&&board[2][1]==X&&board[2][2]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[2][0]==O&&board[2][1]==O&&board[2][2]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[0][0]==X&&board[1][1]==X&&board[2][2]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[0][0]==O&&board[1][2]==O&&board[2][2]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 

    else if (board[0][2]==X&&board[1][1]==X&&board[2][0]==X) 
    { 
     cout<<"\nPlayer X wins!"<<std::endl; 
     return 1; 
    } 

    else if (board[0][2]==O&&board[1][1]==O&&board[2][0]==O) 
    { 
     cout<<"\nPlayer O wins!"<<std::endl; 
     return 2; 
    } 



} 

void resetBoard(int board[3][3]) 
{ 
    for (int i=0;i<3;++i) 
    { 
     for (int j=0;j<3;++j) 
     { 
      board[i][j]=blankSquare; 
     } 
    } 
} 
+1

あなたの問題を助けたい場合は、コードを適切にインデントすることによって、コードを他の人が読むことができるように努力してください。 –

+0

これは前に私がこの[リンク](http://stackoverflow.com/questions/35110576/tic-tac-toe-c-check-print-winner)を参照して回答した別の質問に似ています。 –

答えて

3

誰も勝てない場合は、明示的なリターンを持っていません。この結果、未定義の動作になります。つまり、任意の値が返される可能性があります。機能の最後にreturn 0;を追加する必要があります。

すべての警告を有効にしてコンパイルすると、コンパイラはそのような問題について教えてくれます。

+0

うわーありがとうございました。私はそれが1または2を返さないので必要ではないと思いました。 –

関連する問題