2016-11-25 45 views
0
std::string monsterNames[2] {"Weezer", "Leppin"}; 

for (int vecID = 1; vecID < 5; ++vecID) 
{ 
    if(newmonster.monsterData[vecID-1].posX != newmonster.monsterData[vecID].posX && newmonster.monsterData[vecID-1].posY != newmonster.monsterData[vecID].posY) 
    { 
     int randIndex = rand()% 2; 
     int randPosX = rand()% 3; 
     int randPosY = rand()% 3; 

     newmonster.CreateMonster(monsterNames[randIndex], randPosX, randPosY); 
     newmonster.monsterData.push_back(newmonster); 
    } 
    else 
    { 
     continue; 
    } 
} 

是的,由於if語句,此代碼不運行。直到聲明之後纔會創建怪物,因此數組索引超出範圍。 基本上,該程序隨機的怪物名稱和座標,並沒有if語句的所有作品。但我需要檢查一個怪物是否已經存在於該位置,如果不存在,請重新運行循環..如何以更明智的方式做到這一點? xD 如果我沒有for循環,隨機數將始終相同。產生隨機位置的怪物

+0

你應該真正地分開創建「怪物」來檢查另一個是否存在於同一位置(例如:有一個函數檢查vector中的每個元素,如果它包含一個具有相同'posX'和'posY'的元素值) – UnholySheep

+0

也是多餘的。 – Banex

回答

0

我會提出下一個解決方案,你可以將if語句代碼提取到一個新的函數「generateRandomMonster」中,這樣​​你可以在for循環之前調用它一次,並減少迭代次數,這樣就可以確保newmonster數組已經有一個怪物,if語句不會破壞你的代碼。

我希望這個解決方案可以幫助你。

Br。

+0

即使使用一個do-while循環,我也嘗試了不同的方法..沒有辦法。 –

0

您的支票是錯誤的。如果它發生在最後兩個怪物在同一個位置,那就停止製造怪物。當然,那不是你想要的。

在你的地方,我會運行一個while循環,直到newmonster.monsterData.size() == 5。在循環中,我會製作隨機座標並且只有在已經創建的怪物共享位置的時才添加怪物。爲了檢查你需要一個內部循環。