リンクされたリストでランダム性を得ることができますか?. 敵がランダムに弾丸を発射するスペース シューティング ゲームを実装しています。リンクされたリストに敵を保存しています。いくつかの敵をランダムに選択して撃ちたいと思います。リンクされたリストでこれを行うにはどうすればよいですか?
4 に答える
私の謙虚な意見では、数字Nをランダム化してから船Nを撃つことは正しい方法ではありません. まず、1 つの船がすべてのフレームまたはすべてのターンで発砲することを意味しますが、これは必ずしも目的とは限りません。
その問題は、画面に敵が何人いても、発射されるショットの量が同じになることです. 敵が 1 人であろうと 100 人であろうと、すべての敵を合わせた場合の発砲率は、ターン/フレームごとに正確に 1 ショットになり、ゲーム デザインの観点からは意味がありません。また、船が時々 2xN ターンの間発砲しない可能性があることも意味します (これは、悪者が「ヒーロー」と戦うために列に並んで待機し、同時に攻撃することは決してない古い武道映画のようなものです)。
私の意見では、船を反復処理し、できれば最後に発砲した時間に基づいて、特定の確率で各船を発砲させることをお勧めします。
long now = getCurrentTime... /*replace with real function*/
double epsilon = 0.0001; /*adjust as needed*/
while(current = enemyList.next()){
if(Math.random() < epsilon * (now - current.lastFired))
{
current.fire();
current.lastFired = now;
}
}
その機会を利用しなければ、N 個の要素を反復する意味はほとんどありません。リストを使用する場合は、すべての敵を反復処理してそれぞれを更新することを計画していることを意味します。発射するものを 1 つ選択するためだけに、それらの N 個を再度反復しても意味がありません。
最初のノードから始めて、n 個の " next " を呼び出すことができます。
擬似コード:
int num = Math.random() * myLinkedList.Count;
for( num ){
myLinkedList.next();
}
return myLinkedList.currentNode;
おそらく、配列/配列リスト/ベクトルのような 2 番目のコンテナーを追加して、そこから管理することができます...いつでも教授に、それで問題ないかどうか尋ねることができます。
リストにあるアイテムの数が正確にわかっていて、フレームごとに撮影したいアイテムの数が正確にわかっている場合、実際にはこれを行う比較的簡単な方法があります。アイテムごとに、 Nのリストからk 個のものが残っている場合、合計Qからp個のアイテムが発射されると、現在のアイテムは確率p/kで発射され、その後kとpの値が更新されます。この擬似コードは次のようになります。
myThing curThing = myList->head;
int objectsLeft = myListCount;
int shootersLeft = numShootersPerTick;
while ( curThing )
{
if ( random(objectsLeft) < shootersLeft )
{
curThing->Shoot();
shootersLeft--;
}
objectsLeft--;
curThing = curThing->next;
}
random(N) が 0 から N-1 までの数値を返すと仮定していることに注意してください。つまり、N 個のうちの 1 つです。このアルゴリズムは、さまざまな確率でさまざまなアイテムを選択する必要があるように見えますが (結局のところ、乱数のチェックはアイテムごとに変化しています!)、これが個々のシューターを適切な確率で選択するだけでなく、シューターのセットは、実際には同じように可能性があります。
リストからk 個のランダムな要素を選択するとします( Nは総数です)。選択されたこれらのk 個の要素は、完全にランダムである必要があります。方法は次のとおりです。
- 最初のk要素を取得することから始めます。
リストを進めます。m 番目の要素が提示されると、ランダムな整数が生成され
0<=r<m
ます。- の場合、以前に選択されたランダムな要素を捨てて、 m 番目
r<k
の要素に置き換えます。
- の場合、以前に選択されたランダムな要素を捨てて、 m 番目
確率を使ったちょっとした算術と帰納的な議論は、これがすべての要素に等しい機会を与えることを示しています。