2015-12-26 57 views
-1

我一直在試圖用C++打印創建一個「1D射擊遊戲」。我的問題是我試圖在隨機時刻從列表中產生敵人,並且我也想隨機在敵人產生的地方(屏幕的左側或右側)隨機生成敵人。rand%以可預測的模式產生我所有的實體

這似乎沒有完全奏效,因爲我似乎從一側獲得了連續的敵人流,只有在所有來自左側的敵人都被殺死之後,右側的敵人才會出現。

我似乎從來沒有從左邊來的情侶和來自右邊的情侶在相似的時間。它總是一個或另一個。除了這個,一旦敵人產生了,其餘的似乎幾乎全部產生,突然之間沒有任何產卵。該模式似乎是可預測的和錯誤的。

這裏是我的方法是所謂的遊戲循環每次(遊戲循環負責,呼籲每個迭代函數srand(時間(NULL)),並調用此函數後。

void Enemy::spawnEnemy() 
{ 
    if (enemList.size() < 5) 
    { 
     if (!(rand() % 3)) 
     { 
      if (!(rand() % 2)) 
      { 
       Enemy * newEnemy = new Enemy(worldWidth, 'l'); 
       enemList.push_front(newEnemy); 
      } 
      else 
      { 
       Enemy * newEnemy = new Enemy(0, 'r'); 
       enemList.push_front(newEnemy); 
      } 
     } 
    } 
} 

非常感謝你提前。我真的希望有人能解決這個問題,因爲我一直在努力爲它找到一個答案!

+2

的可能的複製[?srand()函數 - 只有一次,爲什麼叫它](http://stackoverflow.com/questions/7343833/srand-why-call-it-only-once) – LogicStuff

+1

「遊戲循環負責在每次迭代中調用srand(time(NULL))」不這樣做 – MikeCAT

回答

4

不要叫srand每一個循環。您應該只一次種子,然後調用rand()得到一個隨機數字

既然你標記的C++ 11,你應該使用新<random>標題來產生隨機數:

#include <random> 

std::random_device rd; 
std::mt19937 gen(rd()); // seed the random_device, only do this _once_ 

... 
//generating a random integer: 
std::uniform_real_distribution<> distribution(1, 3); // create a distribution to pick from (1 - 3) 
int random = distribution(gen); 
相關問題