2017-01-19 132 views
-1

我有一個while循環在我的C++程序中的第二個線程中獨立運行,但循環結束時不符合我設置的條件。C++雖然循環意外結束

我已經嘗試設置一個計數器來跟蹤循環運行的次數,它每次都是不同的,範圍從8到數百次。

有誰知道這可能是爲什麼發生?

while (ghostPosition.X != playerPosition.X && ghostPosition.Y != playerPosition.Y) 
{ 
    randomDirection = getRandomNumber(1, 5); 

    x = ghostPosition.X; 
    y = ghostPosition.Y; 

    if (randomDirection == 1) 
    { 
     if (ghostPosition.X > 1) 
     { 
      COORD oldPosition = { x, y }; 
      COORD moveTo = { --x, y }; 
      updateGraphics(oldPosition, moveTo, ghost); 
      ghostPosition.X = ghostPosition.X--; 
     } 
    } 
    else if (randomDirection == 2) 
    { 
     if (ghostPosition.Y < 84) 
     { 
      COORD oldPosition = { x, y }; 
      COORD moveTo = { x, ++y }; 
      updateGraphics(oldPosition, moveTo, ghost); 
      ghostPosition.Y = ghostPosition.Y++; 
     } 
    } 
    else if (randomDirection == 3) 
    { 
     if (ghostPosition.X < 24) 
     { 
      COORD oldPosition = { x, y }; 
      COORD moveTo = { ++x, y }; 
      updateGraphics(oldPosition, moveTo, ghost); 
      ghostPosition.X = ghostPosition.X++; 
     } 
    } 
    else if (randomDirection == 4) 
    { 
     if (ghostPosition.Y > 1) 
     { 
      COORD oldPosition = { x, y }; 
      COORD moveTo = { x, --y }; 
      updateGraphics(oldPosition, moveTo, ghost); 
      ghostPosition.Y = ghostPosition.Y--; 
     } 
    } 
} 

函數調用內循環:

int Maze::getRandomNumber(int minimum, int maximum) 
{ 
    int output; 
    std::random_device randomDevice; 
    std::mt19937 mersenneTwister(randomDevice()); 
    std::uniform_real_distribution<double> distribution(minimum, maximum); 

    return distribution(mersenneTwister); 
} 

稱爲(updateGraphics)唯一的其他功能簡單的修改基於傳遞的參數控制檯輸出。 (我不認爲這個功能是問題)

+1

使用調試器。 –

+1

你怎麼知道條件不符合? 「我不認爲這個功能是問題......」有名的遺言。 – Matt

+0

因爲我已經遍歷代碼並且ghostPosition永遠不會匹配playerPosition,但while循環仍然會結束。 – Darkstorm51

回答

2

我想你想要這個循環執行,而玩家和幽靈職位是不同的。但那不是你定義的條件。當玩家和幽靈X的位置不同時,你的循環執行,玩家和幽靈Y的位置不同。如果兩者相同,則循環將停止。我想你想要或。

+0

這是正確的答案,謝謝。我誤解了我的邏輯。 – Darkstorm51

+0

不用擔心,我自己編寫了相同的錯誤百次! –

0

很難說,沒有一些調試信息。爲什麼不在while循環結束之前打印出ghostPosition和playerPosition的內容並將其發回。另外,運行聽起來迂腐的風險,您可以通過使用swtich語句而不是大量的if/else語句來簡化您的循環邏輯。

+0

哈哈,我在程序的不同部分對一段非常類似的代碼使用了switch語句,我沒有意識到這樣做更好。 – Darkstorm51

+0

更好總是一個品味的問題。我個人認爲它使代碼更易於閱讀。 – user7438808