2015-11-07 154 views
0

所以我是一個新的程序員,我決定嘗試做這個遊戲。這是一個基本的,讓我們說人與人的比賽。你輸入每個隊伍的數量,在我的例子中爲Ninjas和Samurai,然後隨機化每個隊伍的攻擊機會並輸出贏家。每次我運行程序時,我都會輸入每種類型的數字,而且我總是會得到忍者生命值爲0的輸出,而武士的生命值爲負值。如果一個團隊的健康狀況達到0,我將如何能夠讓while循環結束?我試過使用totalNinjaHealth!= 0 || totalSamuraiHealth!= 0但程序無限運行。||運營商在條件不能按預期工作

#include <iostream> 
#include <random> 
#include <string> 
#include <ctime> 

using namespace std; 


int main() { 

    int ninjas; 
    int NINJA_HEALTH = 2; 
    int NINJA_ATTACK = 2; 

    int samurai; 
    int SAMURAI_HEALTH = 3; 
    int SAMURAI_ATTACK = 1; 

    default_random_engine randomGen(time(NULL)); 
    uniform_real_distribution<float> attackChance(0.0f, 1.0f); 

    cout << " *** Ninjas V Samurai *** " << endl; 
    cout << "Input amount of Ninjas" << endl; 
    cin >> ninjas; 
    cout << "Input amount of Samurai" << endl; 
    cin >> samurai; 

    int totalNinjaHealth = NINJA_HEALTH * ninjas; 
    int totalSamuraiHealth = SAMURAI_HEALTH * samurai; 

    cout << totalNinjaHealth << endl; 

    while (totalNinjaHealth > 0 == true || totalSamuraiHealth > 0 == true) 
    { 
     if (attackChance(randomGen) > 0.5f) { 
      totalSamuraiHealth -= NINJA_ATTACK; 
      cout << totalSamuraiHealth << endl; 
     } 
     else if(attackChance(randomGen) < 0.5f) { 
      totalNinjaHealth -= SAMURAI_ATTACK; 
      cout << totalNinjaHealth << endl; 
     } 
    } 
    if (totalNinjaHealth == 0) { 
     cout << "Ninjas lost all " << ninjas << " Ninjas. Samurai remaining " << totalSamuraiHealth << endl; 
    } 
    else if (totalSamuraiHealth == 0) 
    { 
     cout << "Samurai lost all " << ninjas << " Samurai. Ninjas that remain " << totalNinjaHealth/2 << endl; 
    } 

    cin.get(); 
    cin.get(); 
    return 0; 
} 

截圖跑時會發生什麼:ConsoleWhenRan 我使用了||運營商不正確?我以爲||運算符等待,直到一個條件爲真,然後停止,但是當我運行代碼時它似乎等待,直到兩者都通過,或者等於0,給出負輸出。

回答

1

您需要使用運算符& &。 ||是「或」運算符,當其中一個或兩個條件都爲真時,將評估爲真。在你的情況下,只要你的一個團隊的健康度大於0,while循環就會繼續評估。「和」運算符(& &)要求兩個條件都爲真,以便將語句評估爲真。

+0

謝謝,它工作!我只有一個問題,(&&)操作符爲什麼會起作用?如果&&運算符要求兩個條件都是真的,那麼這是否意味着它將運行到兩隊都死掉爲止,因爲兩隊的條件> 0。 –

+0

條件「> 0」分別評估每個團隊。在你的while語句中,它將從左到右進行評估,首先檢查totalNinjaHealth> 0,如果這是錯誤的,那麼整個語句是錯誤的並停止。如果totalNinjaHealth> 0爲true,那麼&&操作符將檢查第二個條件是否也爲true,即totalSamuraiHealth> 0.如果第二個條件爲假,則整個語句再次計算爲false,循環將停止。 &&操作符要求操作員的左側評估爲真,右側評估爲真以全面返回真實值 – dmills

0

會發生什麼事是:

您運行循環,直到球隊有積極的整體健康。所以總的健康狀況是兩隊都小於/等於零。

然後你檢查健康狀況,你會得到你的答案。恰巧,在你的情況下,其中一支隊伍的生命值爲0。但在某些情況下,輸出應該不顯示消息。

+0

爲什麼團隊的總體健康狀況會低於零?我知道他們開始時是負面的,直到一個爲零。所以在技術上,當它輸出忍者失落時,它實際上是武士輸球,但爲什麼它會從零開始? –

+0

因爲while()一直工作到兩個團隊都有積極的健康狀態(我認爲你希望它們都是他們)。 –