2016-11-25 8 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

同じ位置に別のものが存在するかどうかをチェックすることから、 "モンスター"の作成をはっきりと分離する必要があります(例えば、同じposXとposYを持つ要素があればベクトルの各要素をチェックする機能があります。値) – UnholySheep

+0

また、elseは冗長です。 – Banex

答えて

0

私は次のソリューションを提案します。if文のコードを新しい関数 "generateRandomMonster"に抽出することができます。これにより、forブールの前に一度呼び出すことができ、1つの反復を減らすことができます。 newmonster配列には既に1つのモンスターがあり、if文はコードを破壊しません。

このソリューションがお役に立てば幸いです。

Br。

+0

私はdo-whileループを使っていても、いろいろな方法で試しました。 –

0

チェックが間違っています。最後の2つのモンスターが同じ場所にある場合は、モンスターの作成をやめてください。確かにそれはあなたが望むものではありません。

あなたの場所では、私はnewmonster.monsterData.size() == 5までwhileループを実行します。ループでは、ランダムに座標をつけ、モンスターを追加するのはで、既に作成されたモンスターのうちが存在しない場合にのみ追加します。そのチェックのために、内部ループが必要です。

関連する問題