2017-08-12 33 views
1

我不明白为什么我的while循环不会停止循环时,我分配一个布尔变量(gameEnded)true虽然循环不会打破布尔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,并且因此循环会中断。我检查了的东西方法返回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

顺便说一下,您可以很容易地找到这些东西,但是在调试中逐步执行代码。你会看到该标志被设置为真,然后再次为假。 F10和F11是你的朋友! – oerkelens

回答

7
//one of these three methods returns true 

因为有三个任务,这是不够的,这些方法之一返回true:只有最后一次分配有任何影响,所以除非board.WinCheckX(board)回报true,继续循环。

的修复很简单:将三个分配到一个与||操作:

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

另外一个这种方法的好处是,这些方法只要一返回true,就因为没有额外的呼叫以短路||运营商。

+0

检查也应该在循环结束时运行......如果游戏结束,则不需要继续循环! –