Calcolo dell'output di due eserciti in lotta


20

Sto programmando un gioco strategico usando Flash. Il gioco funziona in modo molto simile al famoso gioco "Travian".

Il mio problema è il seguente: sto provando a fare il calcolo delle truppe perse a causa di uno scontro tra due eserciti. I due eserciti hanno diversi tipi di unità. Alcuni di loro sono più forti contro alcune altre unità e più deboli contro altri tipi.

Come posso mettere quell'effetto di queste differenze nell'equazione della lotta?

Sembra facile se hanno solo punti att e def, ma quando si verifica la dipendenza dal tipo di unità, mi perdo.


6
Il risultato delle tue battaglie dovrebbe essere puramente deterministico o vuoi usare una sorta di casualità?
sum1stolemyname

4
Non penso che dovrebbe essere etichettato come un gioco multiplayer dal momento che non è dato dall'OP-potrebbe essere umano vs AI. E per "dipendenza dal tipo", stiamo parlando del classico rock-> scissors-> paper-> rock type?
Il comunista Duck il

Risposte:


10

Oltre a sostenere il suggerimento di Amit di guardare le equazioni di Lanchester, voglio solo aggiungere che questa è una decisione di progettazione del gioco, non un fatto empirico che possiamo darti. Se vuoi prendere in considerazione il tipo di unità, devi decidere cosa significa. Questo significa scegliere un'equazione che includa tutti i fattori che desideri includere nel tuo gameplay. Se vuoi che la fanteria sia migliore della cavalleria, allora devi decidere cosa dovrebbe significare - ad es. di quanti cavalleria hai bisogno per eguagliare 100 fanteria? E importa chi attacca chi? Sembra che tu stia insinuando che dare semplicemente diversi valori di attacco e difesa a fanteria e cavalleria non è abbastanza buono - perché? Cos'altro stai cercando di rappresentare che non può essere catturato solo da quei valori?

Devi decidere quali fattori vuoi modellare nel tuo gioco, poiché influenzano il modo in cui i giocatori si avvicineranno. Questi potrebbero includere dimensioni / quantità dell'unità, tipo di unità, esperienza dell'unità (es. Stato di veterano), effetti sul terreno e sull'ambiente, differenze tra attaccare e difendersi, se modellare il danno e l'attrito o meno, se modellare il passare del tempo durante il combattimento, la capacità di ritirarsi o fuggire (possibilmente includendo la modellazione del morale), quanta casualità vuoi nell'equazione e così via.

Una volta che sai tutto questo, ci sono diversi approcci matematici di base che puoi adottare. Potresti fare un sistema round per round "possibilità di colpire" come hanno fatto molti giochi di ruolo, ad es. il sistema di combattimento d20. Potresti fare un sistema di lancio di monete ponderato "attacco contro difesa" di un round come fa il gioco originale Civilization. Puoi fare in modo che ciascuna parte generi un punteggio aggiungendo attributi a un numero casuale e vince chi ottiene il valore più alto. E puoi permettere a questi sistemi di funzionare su una base round-to-round, o di detrarre punti ferita o punti morale, o altro. Qualsiasi sistema può funzionare, ma devi bilanciarlo nel modo desiderato. Come in definitiva la scelta di come modellare il combattimento è una parte fondamentale del design del gioco, e non è qualcosa che altre persone possono semplicemente darti.


Hai perfettamente ragione Kylotan. Ho avuto alcune idee sulla lotta prima di iniziare la progettazione del gioco. Tuttavia, ho pubblicato questa domanda chiedendo se esiste un modo migliore per progettarlo e scoprire qual è il modo migliore per implementarlo. Ho vinto per entrambi gli scopi, immagino :) Amico, potresti dirmi dove posso trovare maggiori informazioni su quegli approcci matematici? Inoltre, se rispondo a tutte le domande che fai sulla scelta del sistema, puoi consigliarmi quale funziona meglio per il mio caso? Grazie mille per il tuo tempo :)
Ali Albahrani,

Non posso dirti quale sarà il migliore, ma probabilmente dovresti iniziare in modo semplice e migliorarlo se necessario. Travian sembra avere un semplice sistema di attacco contro difesa, con 2 tipi di unità (fanteria e cavalleria) e 2 punteggi di difesa per unità di conseguenza. Un modo semplice per risolvere una battaglia, come usato in Civilization 1, è quello di dividere il punteggio di attacco degli attaccanti per il totale di quello più il punteggio di difesa del difensore. Questo ti dà una percentuale. Ora scegli un numero casuale compreso tra 0 e 100 percento. Se è inferiore al punteggio di attacco dell'attaccante, vincono gli attaccanti. Altrimenti vincono i difensori.
Kylotan,

15

Per Solar Realms Elite mi sono ispirato alle equazioni di Lanchester per modellare la guerra . Ho avuto diversi combattimenti simultanei in ogni round di battaglia.

Nel primo combattimento, tutti hanno attaccato i soldati. In SRE i soldati sono i migliori contro i soldati (non si tratta di forbici di carta rock, ma di fanteria, attacco aereo e spazio profondo). Ho istituito un potere di attacco e di difesa in cui i soldati hanno avuto il miglior attacco:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

Nel secondo combattimento, tutti hanno attaccato le stazioni di difesa. In SRE i combattenti (aerei) sono i migliori contro le stazioni di difesa (ad es. Antiaerei):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

Nel terzo combattimento, tutti hanno attaccato gli incrociatori pesanti. In SRE gli incrociatori pesanti sono nello spazio e sono i migliori contro altri incrociatori pesanti:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(Non ricordo quali costanti ho usato; questi sono solo esempi.) In ogni round di battaglia gli attaccanti perderebbero una parte della forza di difesa e i difensori perderebbero una parte della forza di attacco. Credo che ciò corrisponda alla legge quadrata di Lanchester (equazioni qui ). Avevo aggiunto casualità ma non ricordo esattamente dove. Dopo ogni round di battaglia gli eserciti sarebbero più piccoli. Metto un limite massimo al numero di round; dopo ciò, la parte perdente si ritirerebbe.

Non era realistico far sparare la fanteria a terra nello spazio profondo, ma ha funzionato meglio per motivi di gioco in modo che tutte le unità fossero in grado di combattere tutte le altre unità (con efficacia ridotta).


12

Tendo a dire "se non riesci a trovare una soluzione esplicita, cercane una implicita". Potresti simulare la battaglia internamente fino a quando un esercito non viene spazzato via o si ritira (a seconda dei possibili risultati del tuo gioco).

Userei qualcosa del genere:

Per ogni iterazione della battaglia, tutte le unità sono opportunistiche, quindi cercano di fare il maggior danno possibile. Ogni unità seleziona un'unità nemica che sta per attaccare in questo round, in base ai vantaggi / svantaggi noti.

Quindi, vengono eseguiti tutti i combattimenti secondari. Un esempio:

Lascia che i lancieri siano efficaci contro il cavallario, cavalaray efficace contro gli arcieri e gli arcieri efficaci contro il lanciere.

In uno scontro tra due eserciti costituiti da entrambi i tipi di queste unità base, tutti i lancieri avrebbero attaccato la cavalleria, tutte le unità di cavalleria avrebbero attaccato gli arcieri e tutti gli arcieri avrebbero attaccato i lancieri. Se per esempio una parte non avesse arcieri, l'altra cavalleria selezionerebbe il prossimo miglior tipo di bersaglio (essendo le unità di cavalleria nemiche)

Ogni evento unità-attacco-unità viene risolto separatamente, con l'unità perdente danneggiata o contrassegnata come distrutta.

Dopo che tutti i combattimenti individuali sono stati risolti, rimuovi tutte le unità che sono state gravemente danneggiate o distrutte.

La prossima iterazione inizia a usare gli eserciti ora ridotti.


Sono davvero d'accordo con questo post. Meglio iterare la battaglia invece di ridurla a una singola equazione. E aggiungerei sicuramente un po 'di casualità ad esso. Dovrebbe esserci una probabilità così minima che il difensore debole tira alto e segna un critico. Un altro vantaggio dell'iterativo è che puoi creare una narrazione degli eventi per mostrare al giocatore. "Gli spadaccini attaccarono e presto decimarono i footman, ma poi arrivò il calvario e ..."
Tim Holt il

Mi piace molto la tua risposta e penso che la implementerò con casualità :)
Ali Albahrani,

3

Sto testando beta un gioco che è attualmente una versione semplice di Solar Realms ( Star Empire Elite ) e ho iniziato usando qualcosa di simile alle equazioni di Amit (sopra). In particolare, mi è piaciuta l'idea di avere tre fasi della battaglia, in cui hai dovuto vincere due delle tre. Ma volevo anche introdurre un elemento di casualità nella battaglia, e per questo sono stato influenzato da alcuni giochi da tavolo.

L'elaborazione è un problema se il gioco deve essere ridimensionato, quindi non volevo seguire il metodo suggerito da sum1stolemyname sopra, anche se se il tuo gioco utilizza il client per elaborare i risultati, al contrario di un server, questo sembra essere un buon approccio.

Ho deciso di spezzare la battaglia in due fasi (analoga alle tre nel modello di Amit): aria e terra. Calcolo l'attacco e difendo la forza, e la diminuisco di una frazione (per dare al difensore il vantaggio). A quel punto, se la forza di attacco e la forza di difesa sono uguali, l'attacco ha una probabilità del 50% di vittoria. Da lì, aggiorno la probabilità percentuale di vittoria su o giù in base a quanta più (o meno) forza dell'attaccante ha paragonato al difensore. Ecco alcune equazioni semplificate per l'aria:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Preciso che chance_of_victory non può mai essere maggiore di 80 o inferiore a 5. Da lì, ho appena generato un numero casuale su 100, e quindi ho portato avanti quel risultato nella battaglia terrestre.

Una cosa che non ho risolto per la mia soddisfazione sono i tassi delle vittime. Ma sto pensando che un buon modo per capirlo sarebbe quello di confrontare chance_of_victory con il numero casuale generato, e usarlo per prendere una frazione delle forze attaccanti-difendenti come vittime.

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.