ゲームが進行するにつれて、攻撃ウェーブの敵の数とチャレンジをどのようにスケーリングできますか?


9

私は現在、敵がスポーンしてプレイヤーの軍隊を攻撃する防御ゲームを作っています。レベルが1つしかないことを除けば、タワーディフェンスゲームに似ています。敵は、最終的にユーザーが死ぬか、すぐに発生する敵を一掃するのに十分なほど大きな軍隊を集めるまで、発生し続けます(できれば、これが起こらないように十分に挑戦します)。

私が現在苦労しているのは、このゲームをどんどん難しくして、敵が出現する確率が基本的に100%に達するようにする方法です。

これまでのところ、私は次のようなものを持っています

if(Math.random() < 1 - (1/elapsed_time) && spawnTimer <= 0 ){
    spawnEnemy()
    spawnTimer = rand(); // random number between 1 and 3
}

しかし、そもそも均一すぎるようです。現時点では、1種類の敵のみをスポーンしています。時間の経過とともに、よりタフな敵もスポーンするという考えです。

またspawnTimer、少しランダム化して、時間が経過するにつれて速くなるようにする必要があると思いますが、このセクション全体でロジックが実際にどのように見えるべきかを理解するのが難しいです。この種の式の大まかなアイデアを手伝ってくれる人はいますか?

私は現在、JavaScriptを使用してゲームを作成していますが、それは明らかにコンセプトに関するものです。


経過時間とは何ですか?今まで通り過ぎたものですか?どのくらいの頻度でこの状態を呼び出しますか?
AturSams 2014年

こんにちは、ええ申し訳ありませんが、ゲームが開始してから経過した時間です。これは、window.requestAnimationFrameに基づくゲームのupdate()サイクルで呼び出されます
TommyBs 2014年

回答:


3

選択した機能が目的に適さない可能性があります。まず、このルートに行くと、失敗したランダム条件により、次にサイコロを振る前に遅延が発生するはずです。また、スポーンタイマーを一定の範囲内に保つことが目標に適していることはほとんどありません。

threshあなたが高いと思う難易度のしきい値にしましょう。後でそれを使用して、ゲームが難しくなるペースを遅くする時期を決定します。

あなたrateが毎分(またはラウンド)に来たいモンスターの量をしましょう。

ましょうGROWTH_RATEでの難易度が上昇(今のところ、それはなります率も0.2)。

で始まるとしましょうrate = 10。プレイヤーが5モンスターを殺したのでGROWTH_RATE * 5 = 1.0、新しいとでレートを上げることができますrate = 11

rate毎分モンスターを生成する条件を実装する方法:

間の数に設定スポーンタイマー0.51.0 multiplied by 60 seconds orラウンド時間and divided by. Also leave aタイマーが0に達したときに何のモンスターが生み出されていないと時間が再びランダム化されていること0.25`チャンス。

場合はrate、これまで達するthreshあなたはスローダウンする必要があります。今、代わりに増やすのrateGROWTH_RATE、あなたはでそれを増加させることができます1 / math.sqrt(rate)。そうすれば、プレーヤーはより難しい設定で即座に破壊されることはありません。

プレイヤーがゲームに負けた時点のthresh約80%になるようにリセットできrateます。

モンスターの強さをランダム化したい場合は、タイマーに注意してください。たとえば、player-score(これまでに殺されたモンスターによって決定された)が、スポーンできるモンスターの最大強度を決定するために使用されると決定した場合、次のようなことができますmax-monster-strength = player-score / 1000。次にa floatまたはのdouble0.0をランダム化し1.0、結果をそれ自体で乗算します。

float monster_power = Math.random();
monster_power *= monster_power; // Multiply result by itself
    // Makes hard monsters less frequent than weak ones
monster_power *= max_monster_strength;

タイマーをランダム化するときは、おそらく電力レベルを考慮する必要があります。たとえば、タイマーの結果に次のモンスターのパワーの平方根を掛けることができます。

spawn_timer *= math.sqrt(monster_power);

6

多くのオプションがあり、現在の設定には2つあります。

  • 敵をより難しくする
  • より多くの敵をスポーンする(一度により多く、または一度に複数)

次に、追加機能でさらに多くのことを行います。

  • 敵はさまざまな種類のダメージを与え始め、プレイヤーはそれぞれに対して異なる防御をしなければなりません。たとえば、遠隔攻撃、魔法など。
  • 敵はさまざまな種類のダメージから身​​を守り始めます。プレイヤーは、対抗するために複数の種類のダメージを与えるデバイスを構築しなければなりません。たとえば、プレイヤーは矢攻撃と砲弾攻撃から始めます。矢の出現に対して非常に高い耐性を持つ敵なので、プレイヤーは攻撃のバランスをとる必要があります。

難易度曲線を作ることに関しては、正解は本当にありません。それを正しく行うには、多くのプレイテストと微調整が必​​要になります。それは、ゲームの持続時間と、ゲームの難易度によって異なります。ExcelまたはWolframAlphaなどのサイトを使用して、さまざまな関数がどのような曲線を作成するかを確認することをお勧めします。指数関数的増加、線形的増加などを試してください。あなたに合ったものを見つけてください。


アイデアをありがとう、しかし私は選択された答えが私が必要としているものであると思います。しかし、あなたは間違いなく私により多くの思考の糧を与え、私はあなたの答えに賛成しました
TommyBs 2014年

2

一定の数の敵(1つ)が一定の確率で出現する代わりに、それを逆にして一定の確率で一定数の敵を出現させることができます。

static const double SPAWN_CHANCE_ON_DIFFICULTY_1 = 0.01;

for (int i = 0; i < currentDifficulty; i++) {
   if(Math.random() < SPAWN_CHANCE_ON_DIFFICULTY_1 ){
       spawnEnemy()
   }
}

難易度1では、ティックごとに1%の確率で1人の敵をスポーンします。

難易度1000では、最大1000人の敵が出現し、それぞれ1%の確率で出現します。これは、ティックごとに平均10がスポーンすることを意味しますが、多かれ少なかれであることもあります。10と非常に異なる数が一度に生成される可能性があります。おそらく1000もすべて生成されます。しかし、確率がどのように機能するかにより、それは非常に起こりにくいイベントです(比較:多数の法則)。)。

動作やステータスが異なるさまざまな敵をさらに追加する場合、より難しい敵の一部に、より高い難易度で、最初は低い密度でのみスポーンを開始させたい場合があります。これを行うには、現在の難易度から差し引かれる難易度修飾子を追加できます。そうすれば、その難易度に達する前に敵がスポーンすることはなく、最初は低い確率でしか出現しません。

for (EnemyType enemyType: allEnemyTypes) {
    for (int i = 0; i < currentDifficulty - enemyType.getDifficulty(); i++) {
        if(Math.random() < enemyType.spawnChance() ){
            spawnEnemy(enemyType);
        }
    }
}

1
これは刺激的ですが、使用する前に最適化する必要があります。たとえば、Math.random()を一度使用して、スポーンする敵の数を決定できます。大量の敵に小さなチャンスを残したい場合は、「通常分布」をより効率的に実装できます。stackoverflow.com/questions/2325472/...
AturSams
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.