Jak mogę skalować liczbę wrogów i wyzwanie na fali ataku w miarę postępu gry?

9

Obecnie tworzę grę obronną, w której wrogowie odradzają się i atakują armię gracza. Jest podobny do gry Tower Defense, z tym że istnieje tylko jeden poziom. Wrogowie będą się pojawiać, aż w końcu użytkownik zginie lub zgromadzi wystarczająco dużą armię, aby zlikwidować każdego wroga, który natychmiast się pojawi (mam nadzieję, że będzie to wystarczająco trudne, aby tak się nie stało).

W tej chwili walczę z tym, jak sprawić, by ta gra była coraz trudniejsza, a prawdopodobieństwo pojawienia się wroga w zasadzie w końcu osiągnie 100%.

Do tej pory mam coś podobnego do następującego

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

Ale na pierwszy rzut oka wydaje się to zbyt jednolite. W tej chwili odradzam tylko jednego rodzaju wroga, chodzi o to, że trudniejsi wrogowie pojawiają się wraz z upływem czasu.

Myślę też, że muszę spawnTimertrochę bardziej losowo losować i przyspieszać z biegiem czasu, ale po prostu nie widzę, jak mogę skupić się na tym, jak powinna wyglądać moja logika dla całej tej sekcji. Czy ktoś jest w stanie pomóc z grubym pomysłem na tego rodzaju formułę?

Obecnie używam javascript do pisania gry, ale oczywiście chodzi o koncepcję.

TommyBs
źródło
Jaki upłynął czas? Czy to już minęło? Jak często nazywasz ten stan?
AturSams
Cześć, tak, przepraszam, że upłynął czas, który upłynął od rozpoczęcia gry, i jest to wywoływane w moim cyklu aktualizacji gier () opartym na window.requestAnimationFrame
TommyBs

Odpowiedzi:

3

Wybrana funkcja prawdopodobnie nie będzie odpowiednia do Twoich celów. Po pierwsze, jeśli wybierzesz tę trasę, nieudany losowy stan powinien spowodować opóźnienie przed następnym rzutem kostką. Jest również mało prawdopodobne, aby utrzymywanie timera odradzania w stałym zakresie było dobre dla twojego celu.

Niech threshbędzie próg trudności, który Twoim zdaniem jest wysoki. Wykorzystujemy to później, aby zdecydować, kiedy spowolnić tempo, w którym gra staje się trudniejsza.

Pozwól ratebyć potworom, które chcesz przybyć w każdej minucie (lub rundzie).

Niech GROWTH_RATEbędzie szybkość wzrostu trudności (na razie będzie 0.2).

Powiedzmy, że zaczynasz rate = 10. Teraz gracz zabija 5potwory, dzięki czemu możesz zwiększyć szybkość GROWTH_RATE * 5 = 1.0i nowe rate = 11.

Jak wprowadzić warunek, który rateco minutę będzie generował potwory:

Zestaw tarło czasowy do numeru między 0.5do 1.0 multiplied by 60 seconds orokrągłego czasie and divided bystopa . Also leave a0.25` szansa, że żaden potwór zrodził kiedy licznik osiągnie 0, a czas jest znowu randomizacji.

Jeśli ratekiedykolwiek dotrze thresh, musisz zwolnić. Teraz zamiast zwiększać rateo GROWTH_RATE, możesz go zwiększyć o 1 / math.sqrt(rate). W ten sposób gracz nie zostanie natychmiast zniszczony w trudniejszych warunkach.

Możesz zresetować threshdo około 80% tego, ratew którym gracz przegrał grę.

Jeśli chcesz randomizować siłę potwora, zachowaj ostrożność co do timera. Na przykład, jeśli uznasz, że player-score(określona przez potwory zabite tej pory) zostaną wykorzystane do określenia max siłę potwora, który mógłby tarło, można zrobić coś takiego: max-monster-strength = player-score / 1000. Następnie losowo floatlub doublemiędzy 0.0do 1.0i pomnożyć wynik przez siebie.

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;

Teraz, kiedy randomizujesz stoper, prawdopodobnie powinieneś wziąć pod uwagę poziom mocy. Na przykład możesz pomnożyć wynik licznika przez pierwiastek kwadratowy mocy następnych potworów.

spawn_timer *= math.sqrt(monster_power);
AturSams
źródło
6

Istnieje wiele opcji, dwie z obecną konfiguracją:

  • Utrudniaj wrogów
  • Odradzaj więcej wrogów (częściej lub więcej naraz)

Następnie więcej z dodatkowymi funkcjami:

  • Wrogowie zaczynają zadawać różne rodzaje obrażeń, a gracz musi bronić się przed nimi inaczej. Na przykład ataki dystansowe, magia itp.
  • Wrogowie zaczynają się bronić przed różnymi rodzajami obrażeń. Gracz musi zbudować wiele rodzajów urządzeń do zadawania obrażeń, aby przeciwdziałać. Na przykład gracz zaczyna od ataku strzałą i ataku kulą armatnią. Wróg, który ma bardzo wysoką odporność na strzały, odradza się, więc gracz musi się upewnić, że zrównoważył swoje ataki.

Jeśli chodzi o tworzenie krzywej trudności, naprawdę nie ma poprawnej odpowiedzi. To zajmie dużo testowania i poprawiania, aby zrobić to dobrze. Będzie to zależeć od tego, jak długo ma trwać gra i od tego, jak trudne ma być. Sugeruję skorzystanie z Excela lub strony takiej jak WolframAlpha i sprawdzenie, jaki rodzaj krzywej tworzą różne funkcje. Wypróbuj wykładnicze wzrosty, liniowe wzrosty itp. Znajdź taki, który Ci odpowiada.

MichaelHouse
źródło
Dzięki za pomysły, ale myślę, że wybrana odpowiedź jest tym, czego potrzebuję. Ale zdecydowanie dałeś mi więcej do myślenia, a ja głosowałem za odpowiedzią
TommyBs
2

Zamiast stałej liczby wrogów (jednego) odradzających się ze zmiennym prawdopodobieństwem, możesz je odwrócić i mieć zmienną liczbę wrogów odradzających się ze stałym prawdopodobieństwem.

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

Na poziomie trudności 1 będzie to miało 1% szansę na odrodzenie jednego wroga na kleszcza.

Na poziomie trudności 1000 odrodzi do 1000 wrogów, każdy z osobną szansą 1%. Oznacza to, że średnio odrodzi się 10 na kleszcza, ale może to być również mniej więcej. Istnieje możliwość, że od razu pojawi się liczba bardzo różna od 10, może nawet wszystkie 1000. ale jest to bardzo mało prawdopodobne zdarzenie ze względu na to, jak działa prawdopodobieństwo (porównaj: Prawo dużych liczb ).

Kiedy dodajesz więcej różnych wrogów o różnych zachowaniach i statystykach, być może chcesz, aby niektórzy z twardszych wrogów zaczęli pojawiać się tylko na wyższych poziomach trudności, a nawet wtedy z małą gęstością na początku. Aby to zrobić, możesz dodać modyfikator trudności, który jest odejmowany od bieżącej trudności. W ten sposób wróg nie odrodzi się przed osiągnięciem tego poziomu trudności, a nawet wtedy z początkową mniejszą szansą:

for (EnemyType enemyType: allEnemyTypes) {
    for (int i = 0; i < currentDifficulty - enemyType.getDifficulty(); i++) {
        if(Math.random() < enemyType.spawnChance() ){
            spawnEnemy(enemyType);
        }
    }
}
Philipp
źródło
1
To stymuluje, ale należy je zoptymalizować przed użyciem. Na przykład możesz raz użyć Math.random (), aby zdecydować, ilu wrogów ma się odrodzić. Jeśli chcesz zostawić mniejszą szansę dużej liczbie wrogów, możesz efektywniej wdrożyć „Normalną dystrybucję”. stackoverflow.com/questions/2325472/…
AturSams