Bagaimana saya bisa mengukur jumlah dan tantangan musuh dalam gelombang serangan saat permainan berlangsung?

9

Saat ini saya sedang membuat permainan pertahanan di mana musuh akan menelurkan dan menyerang pasukan pemain. Ini mirip dengan game Tower Defense, kecuali hanya ada satu level. Musuh akan terus memijah sampai akhirnya pengguna mati atau dia mengumpulkan pasukan yang cukup besar sehingga mereka memusnahkan musuh yang muncul secara instan (mudah-mudahan itu akan cukup menantang sehingga ini tidak akan terjadi).

Apa yang saya perjuangkan saat ini adalah bagaimana membuat game ini semakin sulit dan kemungkinan pemijahan musuh pada dasarnya mencapai 100%.

Sejauh ini saya punya sesuatu yang mirip dengan yang berikut ini

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

Tapi sepertinya terlalu seragam untuk memulai. Saat ini saya hanya memunculkan satu jenis musuh, gagasan bahwa musuh yang lebih tangguh juga muncul seiring berjalannya waktu.

Saya juga berpikir saya perlu mengacak saya spawnTimersedikit lebih banyak dan membuatnya menjadi lebih cepat seiring berjalannya waktu, tetapi saya tidak bisa melihat bagaimana pikiran saya sebenarnya terlihat seperti untuk seluruh bagian ini. Adakah yang bisa membantu dengan gagasan kasar tentang formula seperti ini?

Saat ini saya menggunakan javascript untuk menulis permainan, tetapi jelas ini lebih tentang konsep.

TommyBs
sumber
Apa waktu yang berlalu? Apakah itu yang berlalu sampai sekarang? Seberapa sering Anda menyebut kondisi ini?
AturSams
Hai, ya maaf waktu yang telah berlalu adalah waktu yang berlalu sejak permainan dimulai dan ini disebut dalam siklus pembaruan permainan saya () yang didasarkan pada window.requestAnimationFrame
TommyBs

Jawaban:

3

Fungsi yang Anda pilih sepertinya tidak cocok untuk tujuan Anda. Pertama, jika Anda menggunakan rute ini, kondisi acak yang gagal akan menghasilkan penundaan sebelum kali berikutnya Anda melempar dadu. Juga, tidak mungkin bahwa menjaga spawn timer dalam kisaran konstan baik untuk tujuan Anda.

Biarkan threshmenjadi ambang kesulitan yang menurut Anda tinggi. Kami menggunakannya nanti untuk memutuskan kapan harus memperlambat laju permainan yang semakin sulit.

Biarkan ratemenjadi jumlah monster yang Anda inginkan datang setiap menit (atau putaran).

Membiarkan GROWTH_RATEmenjadi tingkat di mana kesulitan meningkat (untuk saat ini akan terjadi 0.2).

Katakanlah Anda mulai dengan rate = 10. Sekarang pemain membunuh 5monster sehingga Anda dapat meningkatkan rate oleh GROWTH_RATE * 5 = 1.0dan yang baru rate = 11.

Cara menerapkan kondisi yang akan menghasilkan ratemonster setiap menit:

Setel spawn timer ke angka antara 0.5untuk 1.0 multiplied by 60 seconds orround-time and divided byrate . Also leave a0,25` peluang bahwa tidak ada monster yang muncul ketika timer mencapai 0 dan waktu diacak lagi.

Jika ratepernah mencapai threshAnda perlu memperlambat. Sekarang bukannya meningkatkan rateoleh GROWTH_RATE, Anda dapat meningkatkan dengan 1 / math.sqrt(rate). Dengan cara itu pemain tidak akan dihancurkan secara instan dalam pengaturan yang lebih sulit.

Anda dapat mengatur ulang threshmenjadi sekitar 80% dari ratesaat pemain kalah.

Jika Anda ingin mengacak kekuatan monster, berhati-hatilah dengan timer. Misalnya, jika Anda memutuskan bahwa player-score(ditentukan oleh monster tewas sejauh ini) akan digunakan untuk menentukan kekuatan max dari rakasa yang bisa bertelur, Anda dapat melakukan sesuatu seperti ini: max-monster-strength = player-score / 1000. Kemudian secara acak a floatatau doubleantara 0.0ke 1.0dan gandakan hasilnya dengan sendirinya.

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;

Sekarang ketika Anda mengacak timer, Anda mungkin harus mempertimbangkan level daya. Misalnya, Anda bisa mengalikan hasil penghitung waktu dengan akar kuadrat dari kekuatan monster berikutnya.

spawn_timer *= math.sqrt(monster_power);
AturSams
sumber
6

Ada banyak opsi, dua dengan pengaturan Anda saat ini:

  • Buat musuh lebih sulit
  • Munculkan lebih banyak musuh (baik yang lebih sering atau banyak sekaligus)

Kemudian lebih banyak dengan fitur tambahan:

  • Musuh mulai menangani berbagai jenis kerusakan, dan pemain harus bertahan secara berbeda terhadap masing-masing. Misalnya, serangan jarak jauh, sihir, dll.
  • Musuh mulai membela diri terhadap berbagai jenis kerusakan. Pemain harus membuat beberapa jenis alat penghancur kerusakan untuk melawan. Misalnya, pemain mulai dengan serangan panah dan serangan meriam. Musuh yang memiliki daya tahan sangat tinggi terhadap panah menumbuhkan, jadi pemain harus memastikan mereka telah menyeimbangkan serangan mereka.

Sedangkan untuk membuat kurva kesulitan, benar-benar tidak ada jawaban yang benar. Butuh banyak playtesting dan tweaker untuk memperbaikinya. Ini akan tergantung pada berapa lama permainan seharusnya berlangsung dan seberapa sulit yang Anda inginkan. Saya sarankan Anda menggunakan Excel atau situs seperti WolframAlpha dan melihat kurva apa yang dibuat berbagai fungsi. Coba kenaikan eksponensial, peningkatan linear, dll. Temukan yang sesuai untuk Anda.

MichaelHouse
sumber
Terima kasih atas gagasannya tetapi saya pikir jawaban yang dipilih lebih dari yang saya butuhkan. Tetapi Anda pasti memberi saya lebih banyak makanan untuk dipikirkan dan saya telah meningkatkan jawaban Anda
TommyBs
2

Alih-alih memiliki jumlah musuh tetap (satu) bertelur dengan probabilitas variabel, Anda bisa memutarnya dan memiliki sejumlah variabel musuh bertelur dengan probabilitas tetap.

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()
   }
}

Pada tingkat kesulitan 1, ini akan memiliki peluang 1% untuk menelurkan satu musuh per centang.

Pada tingkat kesulitan 1000, itu akan menelurkan hingga 1000 musuh, masing-masing dengan peluang terpisah 1%. Ini berarti bahwa rata-rata 10 akan muncul per kutu, tetapi bisa juga lebih atau kurang. Ada kemungkinan bahwa angka yang sangat berbeda dari 10 akan muncul sekaligus, mungkin bahkan semua 1000. tapi itu kejadian yang sangat tidak mungkin karena cara kerja probabilitas (bandingkan: Hukum Angka Besar ).

Ketika Anda menambahkan lebih banyak musuh yang berbeda dengan perilaku dan statistik yang berbeda, Anda mungkin ingin beberapa musuh yang lebih tangguh hanya mulai melahirkan pada kesulitan yang lebih tinggi dan bahkan kemudian dengan kepadatan rendah pada awalnya. Untuk melakukan ini, Anda bisa menambahkan pengubah kesulitan yang dikurangi dari kesulitan saat ini. Dengan cara itu musuh tidak akan muncul sebelum tingkat kesulitan tercapai dan itupun hanya dengan peluang yang lebih rendah pada awalnya:

for (EnemyType enemyType: allEnemyTypes) {
    for (int i = 0; i < currentDifficulty - enemyType.getDifficulty(); i++) {
        if(Math.random() < enemyType.spawnChance() ){
            spawnEnemy(enemyType);
        }
    }
}
Philipp
sumber
1
Ini merangsang tetapi harus dioptimalkan sebelum digunakan. Misalnya, Anda bisa menggunakan Math.random () satu kali untuk memutuskan berapa banyak musuh yang akan muncul. Jika Anda ingin meninggalkan peluang yang lebih kecil untuk sejumlah besar musuh, Anda dapat menerapkan "Distribusi Normal" dengan lebih efisien. stackoverflow.com/questions/2325472/…
AturSams