Per rispondere brevemente alla tua domanda principale, i principali vantaggi di un mondo di gioco generato proceduralmente sono:
Il mondo può essere enorme , molto più grande di qualsiasi altro mondo di gioco progettato manualmente.
Il mondo (o almeno parti di esso) può essere rigenerato per ogni gioco, aumentando potenzialmente il valore di replay, poiché il giocatore avrà sempre qualcosa di nuovo da scoprire.
Al contrario, i principali svantaggi della generazione procedurale sono:
A seconda dei metodi di generazione utilizzati, può essere difficile assicurarsi che il mondo sia sempre giocabile, vale a dire che il giocatore non può rimanere bloccato senza alcun modo di procedere solo perché sfortunato con la generazione del mondo.
Anche se puoi evitare di generare mondi completamente ingiocabili, la generazione casuale del mondo può portare a un livello di difficoltà molto variabile: a volte, il giocatore potrebbe trovare tutto ciò di cui ha bisogno semplicemente in fila per la presa, a volte potrebbe passare molto tempo senza trovare nulla di utile .
Per lunghi periodi, tali fluttuazioni casuali tendono a fare una media, ma se la difficoltà del gioco è ad esempio pesantemente caricata in anticipo (tipica per i giochi di sopravvivenza), una brutta partenza potrebbe rovinare una partita mentre una partenza molto fortunata potrebbe privarla di ogni sfida.
Una generazione procedurale mal eseguita può rendere monotono e noioso il mondo: dopo aver visto una dozzina di labirinti generati casualmente, iniziano tutti a sembrare uguali, anche se differiscono nei dettagli.
Inoltre, se il mondo di gioco è completamente rigenerato per ogni gioco, non ci saranno posizioni fisse o caratteristiche che il giocatore possa riconoscere dai giochi precedenti. Tale mancanza di familiarità potrebbe rendere più difficile per il giocatore interagire con il gioco a livello emotivo o condividere esperienze con altri giocatori.
C'è anche una cosa che potresti contare in entrambi gli elenchi: in un gioco in cui il mondo viene rigenerato casualmente per ogni gioco, non può esistere una guida "walkthrough", poiché ogni gioco sarà diverso.
(Questa irripetibilità potrebbe anche essere un problema per il test e il debug, sebbene possa essere almeno in parte evitata consentendo di specificare il seme RNG, almeno in modalità debug e / o fornendo il comando "cheat" che può essere usato per riproduzione in avanti veloce a diversi livelli.)
Tuttavia, se si guarda all'elenco degli svantaggi, si vedrà che descrive principalmente gli svantaggi della pura generazione procedurale; molti di questi possono essere evitati mescolando contenuti generati manualmente e proceduralmente .
Ad esempio, il giocatore può sempre iniziare in una città fissa, progettata manualmente, forse circondata da una regione di residenza più ampia o più fissa, ma i luoghi più lontani dalla città potrebbero essere generati casualmente per fornire sempre regioni sconosciute per il giocatore da esplorare.
Potrebbero esserci anche altre città progettate manualmente o altre posizioni posizionate (più o meno) casualmente nel mondo, in modo tale che il giocatore dovrà trovarle, ma saprà cosa aspettarsi una volta arrivato lì. Al contrario, le caratteristiche di spicco come le montagne potrebbero essere posizionate manualmente (almeno in prossimità della posizione di partenza fissa), ma i dettagli del loro terreno potrebbero essere randomizzati.
Per quanto riguarda il posizionamento casuale che causa deadlock e variazioni di difficoltà, questo può essere risolto implementando vari controlli di coerenza e bilanciamento in cima al tuo algoritmo di generazione del mondo procedurale. Ad esempio, se il giocatore ha bisogno di un oggetto particolare per poter attraversare l'acqua, è possibile includere un codice assicurandosi che almeno uno di tali oggetti sia posizionato in modo che il giocatore possa raggiungerlo senza attraversare l'acqua.
Allo stesso modo, potresti anche voler modificare le regole di posizionamento degli oggetti in modo che non vengano posizionate bacchette di straordinaria bellezza prima che il giocatore abbia raggiunto il livello x , e forse per assicurarsi che almeno uno sia posizionato in una posizione fissa dove il giocatore può raggiungere prima di arrivare sul palco dove ne avranno bisogno per sopravvivere.
A proposito, un modo comune per creare mesh di contenuti procedurali e generati manualmente in modo più o meno uniforme è quello di avviare il processo di generazione manuale utilizzando il generatore del mondo procedurale (forse opportunamente ottimizzato, ad esempio per generare un villaggio o un picco di montagna dove lo si desidera) ) per inizializzare la regione che si sta progettando, quindi modificarla manualmente per aggiungere e regolare i dettagli desiderati. (Ciò può anche consentire una memorizzazione di livello molto compatta, salvando solo le modifiche manuali, il seme del generatore e i parametri utilizzati.)
Altri modi per combinare contenuti manuali e procedurali includono lasciare spazi vuoti nei livelli progettati manualmente, da riempire con contenuti randomizzati (ad esempio un castello potrebbe includere un labirinto generato casualmente nei sotterranei, con solo il contorno e le uscite fissi), oppure la progettazione manuale potrebbe specificare solo il profilo generale di alcune parti del livello (ad esempio il posizionamento delle case in una città) e lasciare che i dettagli (come l'aspetto esatto di ogni casa) vengano scelti casualmente.
In effetti, anche molti giochi che hanno completamente risolto il mondo di gioco usano una qualche forma di generazione procedurale come parte del loro processo di progettazione dei livelli, poiché ci sono alcuni aspetti della generazione del mondo (come la produzione di un terreno dall'aspetto naturale o il posizionamento di singoli alberi in una foresta) che sono difficili e / o noiosi da fare a mano, ma relativamente facili da automatizzare.
Al contrario, la maggior parte dei generatori del mondo procedurale utilizzerà almeno alcuni oggetti ed elementi progettati manualmente per costruire il mondo fuori da. Si potrebbe anche facilmente avere più livelli di generazione casuale / manuale nidificata: ad esempio, un mondo generato proceduralmente potrebbe includere una città generata manualmente circondata da boschi generati proceduralmente con un contorno disegnato manualmente, con alberi generati proceduralmente che portano foglie progettate manualmente.
Nota anche che la generazione di contenuti procedurali non è necessariamente incompatibile con un mondo fisso: potresti semplicemente scegliere un seme RNG fisso e usarlo per generare il tuo mondo. Questo può essere utile se vuoi esplorare un mondo enorme per i giocatori, ma vuoi mantenerlo lo stesso per ogni gioco e ogni giocatore.
Nota che, se lo fai (o forse anche se non lo fai), dovresti davvero progettare il tuo generatore mondiale in modo che funzioni in modo gerarchico, usando più istanze RNG, in modo tale che, ad esempio, il generatore globale di mappe mantenga una singola istanza RNG che userebbe per generare sottoregioni, assegnando a ciascuna sottoregione un diverso valore seed che il generatore di regioni userebbe quindi per seedare un'istanza RNG separata che userebbe per generare la regione, e così via. Questo per evitare l '"effetto farfalla", in cui cambiando anche il più piccolo dettaglio della parte più piccola della mappa si potrebbe sincronizzare l'RNG e far sì che tutto il resto del mondo sia completamente diverso.
Un altro modo importante per evitare l'effetto farfalla, in particolare se stai generando il mondo "al volo" mentre il giocatore lo esplora, è di evitare del tutto i normali RNG (ad eccezione dei processi che avvengono "istantaneamente" dal punto di vista del giocatore, come la generazione un nuovo livello quando il giocatore entra) e usa invece metodi di generazione di numeri casuali che non memorizzano alcuno stato interno. Ad esempio, quando si sceglie il seme per una sottoregione in cui il giocatore sta per entrare, il generatore globale del mondo potrebbe prendere le coordinate della sottoregione (e il proprio seme complessivo) e inviarle a una funzione hash per generare il seme della sottoregione. In questo modo, ogni regione avrà sempre lo stesso aspetto, indipendentemente dall'ordine in cui il giocatore le inserisce.
Ps. Dopo tutta quella digressione, lasciatemi brevemente rispondere alla tua ultima domanda sul codice effettivo utilizzato per la generazione procedurale. Ahimè, non penso che sia veramente responsabile in alcun senso significativo senza molti più dettagli di quelli che hai fornito, dal momento che ci sono letteralmente tanti modi diversi di fare la generazione del mondo procedurale quanti sono i giochi che li usano.
Ad esempio, il pronipote di tutti i giochi di esplorazione generati proceduralmente è probabilmente Rogue , il cui algoritmo di generazione di livelli consisteva semplicemente nel posizionare casualmente un gruppo di stanze rettangolari all'interno di un livello rettangolare più grande e nel collegare quelle stanze con passaggi (e posizionare una scala a il livello successivo in uno di essi). I suoi diversi successori , da Nethack alla serie Diablo , hanno elaborato questo sistema in molti modi, ma la maggior parte ha mantenuto l'idea di base di livelli distinti costituiti da stanze, sotterranei e labirinti posizionati più o meno casualmente su una mappa della griglia.
Al contrario, per i giochi con impostazioni esterne aperte, probabilmente vorrai iniziare con una sorta di algoritmo di generazione del terreno frattale e costruire altre caratteristiche (fiumi, foreste, città, ecc.). Oppure potresti fare qualcosa di simile a quello che fa Minecraft e generare una trama procedurale 3D casuale che determina quali parti del tuo paesaggio sono rispettivamente terra e aria (ridimensionate e distorte in modo che i blocchi inferiori abbiano più probabilità di essere macinati), quindi sovrapponi caratteristiche come l'acqua , terra / roccia, vegetazione, ecc. sopra di esso.
Naturalmente, nessuna delle precedenti è valida se, per esempio, stai scrivendo un gioco di esplorazione dello spazio , nel qual caso dovrai solo generare un gruppo di sistemi stellari posizionati in modo casuale in base a una funzione di densità, quindi generare un casuale insieme di stelle e pianeti in ciascuno di essi. O forse stai impostando i tuoi giocatori ad esplorare un paesaggio non euclideo , nel qual caso dovrai affrontare una serie completamente diversa di sfide (come il fatto che il volume in un determinato raggio cresca in modo esponenziale piuttosto che polinomiale, rendendolo davvero difficile mantenere una grande mappa in memoria).