Come posso aumentare il numero e la sfida dei nemici in un'ondata di attacco mentre il gioco procede?


9

Attualmente sto realizzando un gioco di difesa in cui i nemici genereranno e attaccheranno l'esercito del giocatore. È simile a un gioco di Tower Defense, tranne per il fatto che esiste un solo livello. I nemici continueranno a spawnare fino a quando l'utente non muore o accumula un esercito abbastanza grande da spazzare via qualsiasi nemico che si genera all'istante (speriamo che sia abbastanza impegnativo che ciò non accada).

Quello che sto lottando al momento è come rendere questo gioco progressivamente più difficile e la probabilità che un nemico si riproduca alla fine raggiungerà il 100%.

Finora ho qualcosa di simile al seguente

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

Ma sembra troppo uniforme per cominciare. Al momento sto generando solo un tipo di nemico, l'idea è che vengano generati nemici più duri col passare del tempo.

Penso anche che dovrei randomizzare un spawnTimerpo 'di più e renderlo più veloce col passare del tempo, ma non riesco proprio a capire come dovrebbe essere la mia logica per l'intera sezione. Qualcuno è in grado di aiutare con un'idea approssimativa di questo tipo di formula?

Attualmente sto usando JavaScript per scrivere il gioco, ma ovviamente si tratta più del concetto.


Qual è il tempo trascorso? È quello che è passato fino ad ora? Quanto spesso chiamate questa condizione?
AturSams,

Ciao, scusa, il tempo trascorso è il tempo trascorso dall'inizio del gioco e questo si chiama nel ciclo update () dei miei giochi basato su window.requestAnimationFrame
TommyBs

Risposte:


3

È probabile che la funzione che hai scelto non sia adatta al tuo scopo. Innanzitutto, se segui questa strada, una condizione casuale fallita dovrebbe comportare un ritardo prima del successivo lancio dei dadi. Inoltre, è improbabile che mantenere il timer di spawn in un intervallo costante sia buono per il tuo obiettivo.

Lascia che threshsia una soglia di difficoltà che ritieni sia alta. Lo useremo in seguito per decidere quando rallentare il ritmo con cui il gioco diventa più difficile.

Lascia che ratesia la quantità di mostri che vuoi che arrivi ogni minuto (o round).

Lascia che GROWTH_RATEsia la velocità con cui aumenta la difficoltà (per ora lo sarà 0.2).

Diciamo che inizi con rate = 10. Ora il giocatore ha ucciso i 5mostri in modo da poter aumentare il tasso di GROWTH_RATE * 5 = 1.0e il nuovo rate = 11.

Come implementare una condizione che genererà ratemostri ogni minuto:

Impostare il timer di spawn a un numero compreso tra 0.5a 1.0 multiplied by 60 seconds orround-tempo and divided bytasso . Also leave a0.25` possibilità che nessun mostro viene generato quando il timer raggiunge lo 0 e il tempo è randomizzato di nuovo.

Se ratemai arriva threshdevi rallentare. Ora invece di aumentare ratedi GROWTH_RATE, potresti aumentarlo di 1 / math.sqrt(rate). In questo modo il giocatore non verrà distrutto all'istante nell'impostazione più difficile.

Puoi resettare threshcirca l'80% di quello ratein cui il giocatore ha perso la partita.

Se desideri randomizzare la forza del mostro, fai attenzione al timer. Per esempio, se si decide che player-score(determinato da mostri uccisi finora) verrà utilizzato per determinare la forza massima di un mostro che potrebbe deporre le uova, si può fare qualcosa di simile a questo: max-monster-strength = player-score / 1000. Poi casuale una floato doubletra 0.0di 1.0e moltiplicare il risultato per sé.

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;

Ora, quando randomizzi il timer, dovresti probabilmente prendere in considerazione il livello di potenza. Ad esempio, potresti moltiplicare il risultato del timer per la radice quadrata della potenza dei mostri successivi.

spawn_timer *= math.sqrt(monster_power);

6

Ci sono molte opzioni, due con la tua configurazione attuale:

  • Rendi i nemici più difficili
  • Genera più nemici (più spesso o più contemporaneamente)

Quindi altro con funzionalità aggiuntive:

  • I nemici iniziano a infliggere diversi tipi di danno e il giocatore deve difendersi in modo diverso da ciascuno di essi. Ad esempio, attacchi a distanza, magia, ecc.
  • I nemici iniziano a difendersi da diversi tipi di danno. Il giocatore deve costruire più tipi di dispositivi che infliggono danni per contrastare. Ad esempio, il giocatore inizia con attacchi di frecce e attacchi di palle di cannone. Un nemico che ha un'altissima resistenza alle frecce si genera, quindi il giocatore deve assicurarsi di aver bilanciato i propri attacchi.

Per quanto riguarda la creazione di una curva di difficoltà, non esiste davvero una risposta corretta. Ci vorranno un sacco di playtest e modifiche per farlo bene. Dipenderà dalla durata del gioco e dalla difficoltà che vorresti avere. Ti suggerisco di utilizzare Excel o un sito come WolframAlpha e vedere quale tipo di curva creano diverse funzioni. Prova aumenti esponenziali, aumenti lineari, ecc. Trova quello che funziona per te.


Grazie per le idee, ma penso che la risposta selezionata sia più ciò di cui ho bisogno. Ma sicuramente mi hai dato più spunti di riflessione e ho votato a fondo la tua risposta
TommyBs

2

Invece di avere un numero fisso di nemici (uno) spawn con una probabilità variabile, puoi girarlo e avere un numero variabile di nemici spawn con una probabilità fissa.

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

Al livello di difficoltà 1, ciò avrà una probabilità dell'1% di generare un nemico per tick.

Al livello di difficoltà 1000, genererà fino a 1000 nemici, ognuno con una possibilità separata dell'1%. Ciò significa che in media 10 si genereranno per tick, ma potrebbe anche essere più o meno. Esiste la possibilità che un numero molto diverso da 10 compaia contemporaneamente, forse anche tutti i 1000. ma questo è un evento molto improbabile a causa di come funziona la probabilità (confronta: Legge dei grandi numeri ).

Quando aggiungi più nemici diversi con comportamenti e statistiche diversi, potresti volere che alcuni dei nemici più difficili inizino a generarsi solo su difficoltà più elevate e anche in un primo momento con una bassa densità. Per fare ciò potresti aggiungere un modificatore di difficoltà che viene sottratto dalla difficoltà attuale. In questo modo il nemico non si genererà prima che venga raggiunto quel livello di difficoltà e anche solo inizialmente con una probabilità inferiore:

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

1
Questo è stimolante ma dovrebbe essere ottimizzato prima di essere utilizzato. Ad esempio, potresti usare Math.random () una volta per decidere quanti nemici generare. Se vuoi lasciare una possibilità minore per una grande quantità di nemici, puoi implementare la "Distribuzione normale" in modo più efficiente. stackoverflow.com/questions/2325472/...
AturSams
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.