2015-11-14 59 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

相关问题