2017-08-12 11 views
1

なぜブール変数(gameEnded)をtrueに割り当てるとwhileループがループを止めないのか分かりません。whileループがboolでブレークしないC#

Board board = new Board(); 
bool gameEnded = false; 
while (!gameEnded) 
{ 
    gameEnded = board.DrawCheck(board); //one of these three methods returns true 
    gameEnded = board.WinCheckO(board); 
    gameEnded = board.WinCheckX(board); 

    Render(board); 
    bool turnO = false; 
    Console.WriteLine("Player X's turn."); 
    //... here some code that gets executed right 
} 

したがって、gameEndedブール変数にはtrueの値を割り当てる必要があります。したがって、ループは中断します。 Check 何かのメソッドがtrueを返すことを確認しました。 修正されたバージョンはうまく動作します。つまり、ループが中断されます。

Board board = new Board(); 
bool gameEnded = false; 
while (!gameEnded) 
{ 

    if (board.WinCheckX(board)) 
    { 
     Console.WriteLine("X player won!"); 
     break; 
    } 
    else if (board.WinCheckO(board)) 
    { 
     Console.WriteLine("O player won!"); 
     break; 
    } 
    else if (board.DrawCheck(board)) 
    { 
     Console.WriteLine("It's a tie!"); 
     break; 
    } 

    Render(board); 
    bool turnO = false; 
    Console.WriteLine("Player X's turn."); 
     //... here some code that gets executed right 
} 

ありがとうございます。

+0

最初のフラグメント:最後の割り当てだけが重要で、最初と2番目の結果はありません –

+2

これは簡単に発見できましたが、デバッグでコードをステップ実行する方法です。あなたは旗が真に、そして再び偽に設定されているのを見たでしょう。 F10とF11はお友達です! – oerkelens

答えて

7
//one of these three methods returns true 

3つの割り当てがあるので、それはtrueを返すために、これらの方法のいずれかのために十分ではありません。唯一の最後の割り当ては任意の効果を持っているので、board.WinCheckX(board)戻りtrueない限り、ループが続きます。

修正は簡単です:||オペレータと一つに3つの割り当てを組み合わせる:

gameEnded = board.DrawCheck(board) 
     || board.WinCheckO(board) 
     || board.WinCheckX(board); 

このアプローチの追加の利点は、これらのいずれかの方法がtrueを返すとすぐに、起因する追加の呼び出しはないだろうということですオペレータ||の短絡

+0

チェックはループの最後で実行する必要があります...ゲームが終了してもループを続行する必要はありません! –

関連する問題