2015-11-14 68 views
0

我一直在寫這個遊戲來輸入具有隨機攻擊機率的人類和骷髏的數量。如果您反覆運行程序時輸入的金額相同,則會生成相同的金額。爲什麼每次while循環重新啓動時hitChance/Random攻擊量都不會改變?當我在while循環中打印attackChance(randGen)時,它會改變。爲什麼randGen不會改變戰鬥贏家的輸出?爲什麼mt19937發生器每次在while循環中使用時都會產生相同的結果

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

using namespace std; 

int getNumSkeletons(); 
int getNumHumans(); 
void finishedBattleStats(int numHumans, int startHumans, int numSkeletons, int startSkeletons); 
void simulatedBattle(int &numSkeletons, int &numHumans, int &startHumans, int &startSkeletons); 

int main() { 

    int startHumans; 
    int startSkeletons; 

    int numHumans; 
    int numSkeletons; 


    cout << "------------------------------------\nSkeletons V Humans\n\n"; 

    //Gets Number of Humans 
    numHumans = getNumHumans(); 
    startHumans = numHumans; 
    //Gets Number of Skeletons 
    numSkeletons = getNumHumans(); 
    startSkeletons = numSkeletons; 

    //Simulates Battle 
    simulatedBattle(numSkeletons, numHumans, startHumans, startSkeletons); 

    //End Battle Stats 
    finishedBattleStats(numHumans, startHumans, numSkeletons, startSkeletons); 
    cin.get(); 

    return 0; 
} 

int getNumHumans() { 
    int numHumans; 

    cout << "Enter number of Humans: \n"; 
    cin >> numHumans; 
    return numHumans; 
} 

int getNumSkeletons() { 
    int numSkeletons; 

    cout << "Enter number of Skeletons: \n"; 
    cin >> numSkeletons; 
    return numSkeletons; 
} 

void simulatedBattle(int &numSkeletons, int &numHumans, int &startHumans, int &startSkeletons) { 

    static mt19937 randGen(time(NULL)); 
    uniform_real_distribution<float> attackChance(0.0f, 1.0f); 

    //HumanProperties 
    float humanDamage = 30.0f; 
    float humanHitChance = 0.6f; 
    float humanCritChance = 0.2f; 
    float humanHealth = 50.0f; 
    float startHumanHealth = humanHealth; 
    float currentHuman = startHumanHealth; 

    //Skeleton Properties 
    float skeletonDamage = 20.0f; 
    float skeletonHitChance = 0.7f; 
    float skeletonCritChance = 0.2f; 
    float skeletonHealth = 40.0f; 
    float startSkeletonHealth = skeletonHealth; 
    float currentSkeleton = startSkeletonHealth; 

    char turn = 'H'; 

    float hitChance; 

    while (numSkeletons > 0 && numHumans > 0) { 
     hitChance = attackChance(randGen); 
     if (turn == 'H') { 
      if (hitChance > humanHitChance) { 
       currentSkeleton -= humanDamage; 
       turn = 'S'; 
       if (currentSkeleton < 0) { 
        numHumans--; 
        currentSkeleton = startSkeletonHealth; 
        turn = 'S'; 
       } 
      } 
     } 
     else { 
      if (hitChance > skeletonHitChance) { 
       currentHuman -= skeletonDamage; 
       turn = 'H'; 
      } 
      if (currentHuman < 0) { 
       numSkeletons--; 
       currentHuman = startHumanHealth; 
       turn = 'H'; 
      } 
     } 
    } 

} 

void finishedBattleStats(int numHumans, int startHumans, int numSkeletons, int startSkeletons) { 
     if (numHumans == 0) { 
      cout << "Skeletons won! \n\n"; 
      cout << "Skeletons left: " << numSkeletons << endl; 
      cout << "Skeleton Casualties: " << startSkeletons - numSkeletons << endl; 
      cout << "All " << startHumans << " humans are dead! \n\n"; 
      cout << "Game Over!"; 
      cin.get(); 
     } 
     else { 
      cout << "Humans Won! \n\n"; 
      cout << "Humans left: " << numHumans << endl; 
      cout << "Human Casualties: " << startHumans - numHumans << endl; 
      cout << "All " << startSkeletons << " skeletons are dead! \n\n"; 
      cout << "Game Over!"; 
      cin.get(); 
     } 
    } 
+0

無法獲得'靜態mt19937 randGen(時間(NULL));'編譯。沒有超載需要time_t。我可以推薦給它一個[std :: random_device](http://en.cppreference.com/w/cpp/numeric/random/random_device)來代替它嗎? – user4581301

+0

你是什麼意思?這是否意味着添加** rand_device randDevice(); **或只是random_device本身。 –

+0

你正在使用哪個編譯器工具鏈?如果GCC,閱讀此:http://stackoverflow.com/questions/18880654/why-do-i-get-same-sequence-for-everyrun-with-stdrandom-device-with-mingw-gcc4 – user4581301

回答

2

恕我直言意見。也就是說,當一個人的健康狀況變爲< 0時,你減去一個骨架而不是人類,反之亦然。以下是更正。隨着演示。我嘗試了演示的次數,並給出不同的結果(ENJOY):

void simulatedBattle(int &numSkeletons, int &numHumans, int &startHumans, int &startSkeletons) { 
    uniform_real_distribution<float> attackChance(0.0f, 1.0f); 
    static mt19937 randGen(time(NULL)); 

    //HumanProperties 
    float humanDamage = 25.0f; 
    float humanHitChance = 0.2f; 
    float humanCritChance = 0.2f; 
    float humanHealth = 50.0f; 
    float startHumanHealth = humanHealth; 
    float currentHuman = startHumanHealth; 

    //Skeleton Properties 
    float skeletonDamage = 20.0f; 
    float skeletonHitChance = 0.8f; 
    float skeletonCritChance = 0.2f; 
    float skeletonHealth = 40.0f; 
    float startSkeletonHealth = skeletonHealth; 
    float currentSkeleton = startSkeletonHealth; 

    char turn = 'H'; 

    float hitChance; 

    while (numSkeletons > 0 && numHumans > 0) { 
     hitChance = attackChance(randGen); 
     if (turn == 'H') { 
      if (hitChance > humanHitChance) { 
       currentSkeleton -= humanDamage; 
       if (currentSkeleton < 0) { 
        --numSkeletons; 
        currentSkeleton = startSkeletonHealth; 
       } 
       turn = 'S'; 
      } 
     } 
     else { 
      if (hitChance > skeletonHitChance) currentHuman -= skeletonDamage; 
      if (currentHuman < 0) { 
       --numHumans; 
       currentHuman = startHumanHealth; 
      } 
      turn = 'H'; 
     } 
    } 
} 

LIVE DEMO

+0

這對我來說很糟糕。我無法相信我沒有注意到這一點。爲什麼你把** - numHumans **而不是** numHumans - **並且做**如果(hitChance> skeletonHitChance)currentHuman - = skeletonDamage; **意味着與**相同的事物if(hitChance> skeletonHitChance) {currentHuman - = skeletonDamage} ** –

+0

另外btw謝謝你爲我清理這個,我感到非常沮喪,只是反覆運行代碼並試圖改變任何東西。 –

+1

@EthanShapiro:大多數C++開發人員都習慣使用前綴遞增/遞減作爲習慣,除非他們專門依賴於後綴行爲;對於原語,差異並不重要,但對於用戶定義的類,後綴增量/減量要昂貴得多(_postfix_必須複製類的當前狀態,然後遞增現有實例,然後返回副本; _prefix_ increment只是修改了位置並返回對現有類的引用)。養成使用前綴inc/dec的習慣可以避免意外地浪費工作。 – ShadowRanger

0

您在使用前必須seed梅森捻線機,否則你將永遠有相同的輸出。 這是常見的做法是與內部時鐘種子吧:

// obtain a seed from the timer 
myclock::duration d = myclock::now() - beginning; 
unsigned seed2 = d.count(); 
generator.seed (seed2); 

裁判:你必須在戰鬥中計算的一個缺陷std::mersenne_twister_engine::seed

相關問題