Oyun ilerledikçe bir saldırı dalgasındaki düşmanların sayısını ve mücadelesini nasıl ölçekleyebilirim?


9

Şu anda düşmanların doğacağı ve oyuncunun ordusuna saldıracağı bir savunma oyunu yapıyorum. Kule Savunma oyununa benzer, tek bir seviye hariç. Düşmanlar, kullanıcı ölünceye kadar anında yumurtlamaya devam edecek veya anında ortaya çıkan herhangi bir düşmanı silecek kadar büyük bir ordu toplayacaktır (umarım bu olmayacak kadar zor olacaktır).

Şu anda mücadele ettiğim şey, bu oyunu nasıl daha da zorlaştıracağınız ve bir düşmanın yumurtlama olasılığının temelde% 100'e ulaşmasıdır.

Şimdiye kadar aşağıdakine benzer bir şeyim var

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

Ama başlamak için çok düzgün görünüyor. Şu anda sadece bir tür düşman üretiyorum, fikir, zaman geçtikçe daha sert düşmanların ortaya çıkmasıdır.

Ayrıca spawnTimerbiraz daha rasgele seçmem ve zaman ilerledikçe bunu daha hızlı hale getirmem gerektiğini düşünüyorum , ancak mantığımın tüm bölüm için gerçekten nasıl görünmesi gerektiği konusunda kafamı bulamıyorum. Herkes bu tür bir formül hakkında kabaca bir fikre yardımcı olabilir mi?

Şu anda oyunu yazmak için javascript kullanıyorum, ama açıkçası bu kavram hakkında.


Geçen süre nedir? Şimdiye kadar geçen mi? Ne sıklıkla bu rahatsızlığı çağırıyorsunuz?
AturSams

Merhaba, evet üzgünüm geçen süre başladı oyuna geçti zamandır ve bu benim oyun güncellemede window.requestAnimationFrame dayanmaktadır () döngüsü denir
TommyBs

Yanıtlar:


3

Seçtiğiniz işlevin amacınıza uygun olması muhtemel değildir. İlk olarak, bu rotaya giderseniz başarısız bir rastgele durum, bir sonraki zar atmanızdan önce bir gecikmeye neden olacaktır. Ayrıca, yumurtlama zamanlayıcısının sabit bir aralıkta tutulması hedefiniz için iyi değildir.

Izin threshvermek bir zorluk eşiği yüksek olduğunu düşünüyorum. Bunu daha sonra oyunun zorlaştığı hızı ne zaman yavaşlatacağına karar vermek için kullanıyoruz.

Izin vermek rateistediğiniz canavar miktarı her dakika (ya da turda) olmak.

Izin vermek GROWTH_RATEzorluğun artma oranı olsun (şimdilik olacak 0.2).

Diyelim ki başlıyorsunuz rate = 10. Şimdi oyuncu 5canavarları öldürdü, böylece oranını GROWTH_RATE * 5 = 1.0ve yenisini artırabilirsiniz rate = 11.

rateHer dakika canavar yaratacak bir durum nasıl uygulanır :

Arasında bir sayıya ayarlayın spawn zamanlayıcısı 0.5için 1.0 multiplied by 60 seconds oryuvarlak zamanlı and divided byoranı . Also leave azamanlayıcı 0 ulaşır ve zaman tekrar randomize edildiğinde hiçbir canavar kökenli olduğunu 0.25` şans.

Eğer rateulaşırsa threshyavaşlamanız gerekir. Şimdi yerine artan ratetarafından GROWTH_RATEbunu aşağıdaki şekilde artış olabilir 1 / math.sqrt(rate). Bu şekilde oyuncu daha sert ortamda anında yok edilmeyecektir.

Oyuncunun oyunu kaybettiği thresh% 80 civarında olacak şekilde sıfırlayabilirsiniz rate.

Canavarın gücünü rastgele seçmek istiyorsanız zamanlayıcı konusunda dikkatli olun. Buna sen karar Örneğin, eğer player-scorespawn bir canavar maksimum gücünü belirlemek için kullanılacaktır (şimdiye kadar öldürülen canavarlar tarafından belirlenir), böyle bir şey yapabilirsiniz: max-monster-strength = player-score / 1000. Sonra a floatveya doublearasında rasgele seçim 0.0yapın 1.0ve sonucu kendi kendine çoğaltın.

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;

Şimdi zamanlayıcıyı rastgele ayarladığınızda, muhtemelen güç seviyesini dikkate almalısınız. Örneğin, zamanlayıcı sonucunu bir sonraki canavar gücünün kare kökü ile çarpabilirsiniz.

spawn_timer *= math.sqrt(monster_power);

6

İkisi mevcut kurulumunuzla birlikte birçok seçenek var:

  • Düşmanları zorlaştır
  • Daha fazla düşman üret (aynı anda daha fazla veya daha fazla)

Sonra ek özelliklerle daha fazlası:

  • Düşmanlar farklı hasar türleri vermeye başlar ve oyuncu her birine karşı farklı savunma yapmalıdır. Örneğin, menzilli saldırılar, büyü vb.
  • Düşmanlar kendilerini farklı hasar türlerine karşı savunmaya başlar. Oyuncu karşı koymak için birden fazla tür hasar veren cihaz üretmelidir. Örneğin, oyuncu ok saldırıları ve top mermisi saldırılarıyla başlar. Oklara karşı çok yüksek direnci olan bir düşman ortaya çıkar, bu yüzden oyuncu saldırılarını dengelediğinden emin olmalıdır.

Bir zorluk eğrisi yapmak için, gerçekten doğru bir cevap yoktur. Doğru yapmak için çok fazla test ve tweak alacak. Oyunun ne kadar süreceği ve ne kadar zor olmasını istediğinize bağlı olacaktır. Excel'i veya WolframAlpha gibi bir siteyi kullanmanızı ve farklı işlevlerin ne tür bir eğri oluşturduğunu görmenizi öneririm. Üstel artışları, doğrusal artışları vb. Deneyin. Sizin için uygun olanı bulun.


Fikirler için teşekkürler ama seçilen cevabın ihtiyacım olan şey olduğunu düşünüyorum. Ama bana kesinlikle düşünce için daha fazla yiyecek verdin ve cevabını iptal ettim
TommyBs

2

Değişken bir olasılıkla sabit sayıda düşmana (bir) sahip olmak yerine, onu tersine çevirebilir ve sabit bir olasılıkla değişken sayıda düşmana sahip olabilirsiniz.

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

Zorluk seviyesi 1'de, bu, her kene başına bir düşman üretme şansı% 1 olacaktır.

Zorluk seviyesi 1000'de, her biri% 1 ayrı bir şansa sahip olan 1000'e kadar düşman üretecek. Bu, kene başına ortalama 10'un ortaya çıkacağı anlamına gelir, ancak aynı zamanda az ya da çok olabilir. 10'dan çok farklı bir sayının aynı anda, belki de 1000'in hepsinde ortaya çıkma olasılığı vardır. Ancak bu, olasılıkın nasıl çalıştığı nedeniyle çok düşük bir olaydır (karşılaştırın: Büyük Sayılar Kanunu ).

Farklı davranışlara ve istatistiklere sahip daha farklı düşmanlar eklediğinizde, daha sert düşmanların bazılarının yalnızca daha yüksek zorluklarda ve daha sonra düşük yoğunlukta ortaya çıkmaya başlamasını isteyebilirsiniz. Bunu yapmak için, mevcut zorluktan çıkarılan bir zorluk değiştirici ekleyebilirsiniz. Bu şekilde düşman, bu zorluk seviyesine ulaşılmadan doğmayacak ve o zaman bile ilk başta daha düşük bir şansla:

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

1
Bu uyarıcıdır ancak kullanılmadan önce optimize edilmelidir. Örneğin, kaç tane düşman doğacağına karar vermek için Math.random () öğesini bir kez kullanabilirsiniz. Büyük miktarda düşman için daha az şans bırakmak istiyorsanız, "Normal Dağılım" ı daha verimli bir şekilde uygulayabilirsiniz. stackoverflow.com/questions/2325472/…
AturSams
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.