Come funzionano gli algoritmi di generazione della storia?


19

Ho sentito parlare del gioco Dwarf Fortress, ma solo ora una delle persone che seguo su Youtube ne ha fatto un commento ... Sono stato più che sorpreso quando ho notato come Dwarf Fortress abbia effettivamente generato una storia per il mondo!

Ora, come funzionano questi algoritmi? Che cosa prendono di solito come input, tranne la lunghezza della simulazione? Quanto possono essere specifici?

E ancora più importante; possono essere realizzati in Javascript o Javascript è troppo lento? (Immagino che questo dipenda dalla profondità della simulazione, ma prendi la Fortezza dei Nani come esempio.)


3
"Possono essere realizzati in Javascript?" La risposta è ovviamente sì, ma dipende da quanto velocemente vuoi i risultati e da quanto siano complessi. Dwarf Fortress richiede anche un po 'di tempo - e rallenta con l'invecchiamento del mondo! Quindi, finché vuoi una storia superficiale, sì, puoi farlo in Javascript, quindi dipende da quanto complessa vuoi che sia la storia.
doppelgreener,

2
Intende "a livello di fortezza nana", come in scala.
MichaelHouse

2
@Bane Sì, voglio dire che puoi modificare quanta cronologia ci sarà in DF. Quando inizi un mondo, prima genera in modo casuale terreno e poi inizia a invecchiare il mondo davanti ai tuoi occhi e a generare la storia mentre procede. Lo guardi mentre gli imperi si espandono e si restringono, mentre il terreno cambia, mentre le foreste crescono e si ritirano, mentre le aree diventano infestate (o non più infestate) e così via. Progredisce anno dopo anno (o diversi anni alla volta) davanti ai tuoi occhi. Questo continua fino a quando non gli dici di smettere. Quanto più in te aumenta quanto più lenta è la generazione (a causa dell'utilizzo della CPU, non della meccanica di gioco).
doppelgreener,

1
Per essere molto chiari: più vecchio è il mondo, più lento ogni anno è calcolare. In un mondo giovane si precipiterà attraverso i primi anni, in un mondo di centinaia di anni, il prossimo anno potrebbe richiedere un secondo o alcuni secondi per generare.
doppelgreener,

1
Oh, quello lo so. Per "profondità", non intendevo la quantità di anni, intendevo la quantità di eventi che accadono e la precisione della simulazione. Puoi semplicemente tenere un numero di quante persone ha un impero, o puoi effettivamente avere una classe chiamata Person, che fa le faccende, va all'esercito, ecc. Poco profondo lascerebbe che le dimensioni dell'impero decidano i risultati delle battaglie, ma in profondità sarebbe avere ogni soldato in lotta per il proprio.
jcora,

Risposte:


27

Prima di tutto, ci sono alcuni suggerimenti per la generazione della storia di Dwarf Fortress. Qualcuno ha chiesto sui forum Bay12 qualche tempo fa, e una trascrizione è stata condivisa e puoi trovare dove inizia la discussione cercando: "il nostro argomento oggi è la generazione del mondo e della storia".


Non so esattamente come faccia Dwarf Fortress, ma spiegherò come sto pianificando di implementare una prima bozza di base nel mio gioco. Userò un semplice automa cellulare . Se guardi attraverso questi prototipi di Spore , come la coltura cellulare e il bioma.

inserisci qui la descrizione dell'immagine

Questi sono esempi di automazioni cellulari e cosa possono produrre. Fondamentalmente creerò regole per diverse razze. Alcuni esempi di regole potrebbero essere:

  • La loro ostilità verso le altre razze
  • Le loro preferenze climatiche
  • I loro requisiti di risorse
  • I loro tassi di natalità e durata della vita
  • I loro desideri (ricerca tecnologica, commercio, esistenza pacifica, dominio del mondo)
  • Le loro capacità (costruzione di strutture, raccolta di risorse, guerra, ecc.)
  • E così via...

Quindi, l'input più critico per far funzionare tutto questo è un mondo in cui lanciare queste razze. Il terreno determinerà le loro preferenze ed espansioni. Quindi, una volta che hai generato un mondo, scegli posizioni casuali nel mondo in cui queste razze vivrebbero opportunamente e lascino perdere. Ora inizia a succedere qualcosa di interessante. Ora che hai terra e razze con desideri e capacità, puoi iniziare a costruire una storia. Queste razze raccolgono risorse, quindi vengono costruite strutture:

  • Città in aree ad alta risorsa, alta vivibilità.
  • Le strade collegano le città più grandi.
  • Ponti attraverso fiumi.
  • Gallerie attraverso le montagne.
  • Fortezze vicino alle prime linee di espansione in risposta alle battaglie.

Qualsiasi struttura può essere razziata / conquistata da altre razze. Più a lungo esiste una struttura (come una città o una fortezza) nella storia, più è difendibile, più è difficile sostituirla. E più è desiderabile per le razze che vogliono il controllo. Le battaglie si svolgono dove le razze si incontrano (almeno una è ostile). Le battaglie prendono il nome da punti di riferimento o strutture vicine, o se la battaglia è significativa o i punti di riferimento non sono nominati, i punti di riferimento prendono il nome dalla battaglia.

Strade, ponti e tunnel si espandono attraverso il commercio e il trasporto di risorse. Ciascuno ha un throughput massimo che può aumentare con la spesa in risorse. Costruire una fortezza di pietra in mezzo alle praterie? Quelle strade avranno un uso pesante trasportando la pietra richiesta. Diventeranno più grandi e avranno un nome.

Si verificano catastrofi naturali che colpiscono le popolazioni e il corso della storia. I terremoti potrebbero ridurre una città in rovina o far crollare un tunnel. Un'alluvione potrebbe lavare via una strada o un ponte.


Non è così approfondito come la Fortezza dei Nani, ma è un inizio. Ora come puoi immaginare, (e come menzionato da Johnathan Hobbs) più queste razze si espandono, più cellule vengono simulate. Non solo vengono simulate più celle, ma le simulazioni sono più complesse in quanto ora ci sono strutture da costruire / mantenere, battaglie da condurre, commercio da ... commercio, e così via. Questo diventa pesante per qualsiasi lingua. Javascript potrebbe rallentare prima. Tuttavia, puoi sempre sacrificare la complessità per una maggiore velocità.

È tutta una simulazione (anche se complessa), stai solo registrando gli eventi importanti lungo il percorso e chiamandolo storia.

Ho anche appena trovato un post sul forum Bay12 per le persone che fanno brainstorming su come rendere più veloce la generazione mondiale della Fortezza dei Nani. Non l'ho letto, ma potrebbe fornire alcuni suggerimenti se si verificano problemi con l'implementazione troppo lenta.


Ottimo e informativo come sempre, @ Byte56. :)
jcora,

1
Grazie Bane. Forse non sempre, capita solo che le persone facciano domande di cui penso di sapere qualcosa. Grazie per avermi dato l'opportunità di pensarci di più e di scrivere qualcosa :)
MichaelHouse

4

Proprio come un lato, JavaScript non è così lento come potresti pensare .

Gli sviluppatori di browser hanno speso molto tempo ed energie per ottimizzare i loro motori JavaScript . Il benchmark a cui ho collegato mostra che, al di fuori delle attività di benchmark, nella mediana, JavaScript era solo 5 volte più lento di C , cosa che non si può dire per alcune altre lingue interpretate. E il limite più basso è ancora più impressionante: alla pari con C .

Ovviamente, i benchmark linguistici non significano molto: probabilmente potresti trovare controesempi usando un benchmark diverso. Ma il punto è che JavaScript è piuttosto veloce . No, non è C o C ++ e non cerca di esserlo. Ma è bene non rimanere bloccati nella mentalità "interpreted language == slow", perché per qualsiasi compito di complessità non banale, le prestazioni contano di più sulla progettazione dell'algoritmo e meno sulla scelta della lingua.

In realtà stavo per scrivere tutto questo in un commento, ma ho esaurito lo spazio.


1

Sì, può essere costruito su javascript, controlla i progetti come ASM.js, che ottengono quasi 2 volte la velocità più lenta di C. Se ti occupi di più core (usando i webworker) può essere anche più veloce del DF (in termini di risorse) , che è in questo momento monocromatico.

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.