Evitare stati impossibili in un gioco di avventura


15

Sto cercando di creare uno stile di gioco di avventura abbastanza complesso, scegli il tuo, ma sto cercando una tecnica o un metodo per aiutare con la progettazione del gioco.

Sarà una storia multi-ramificata, e a volte i rami si ripiegheranno su se stessi, e le tue azioni principali saranno ricordate e gli oggetti saranno raccolti. Ad esempio, se il giocatore va nella palude e nella foresta prima di andare al castello, ha raccolto un osso di dinosauro, ucciso un unicorno e fatto crescere un braccio in più. Se un giocatore arriva al castello attraverso le grotte e la cripta, ha raccolto una bicicletta e uno strano odore. Ora, durante lo sviluppo di enigmi per il castello, non voglio creare una situazione in cui sono necessarie due impossibilità, ad esempio: un braccio in più e l'odore sono necessari per uccidere un orco.

Oltre a documentare gli eventi e gli articoli con molta attenzione, esiste un processo, una tecnica che posso usare in un foglio di calcolo o in un software che mi può aiutare?

Risposte:


11

Sembra un problema con un grafico diretto.

Inizia dall'inizio, per ogni ramificazione nella storia registra gli elementi che hai attualmente e quindi ramifica il grafico. Da lì segui ogni ramo e fai lo stesso, una volta arrivato a un altro ramo registra i tuoi oggetti correnti e ramifica il grafico. Questo finirà con un grafico piuttosto denso con molti nodi duplicati (ma ogni nodo è arrivato da una diversa sequenza grafica) ma non dovresti ottenere loop.

Alla fine dovresti avere un grafico di tutti gli oggetti che puoi avere in un dato punto della tua storia e da tutti i modi possibili per arrivarci.

Ora, con il tuo grafico completo: per ciascuno dei tuoi problemi che richiedono elementi X + Y + Z trova tutti i nodi che hanno quel problema e vedi se gli elementi registrati possono soddisfare quella condizione. Se c'è un errore, basta tornare indietro nel grafico per trovare tutte le decisioni che ti hanno portato lì senza gli elementi adeguati per risolvere quel problema.

Con un po 'di fortuna il tuo design originale è già strutturato in questo modo, almeno concettualmente, quindi il codice dovrebbe rispecchiare la realtà ed essere facile da verificare.

Il tempo di elaborazione delle ricerche grafiche potrebbe diventare un po 'pesante se stai costruendo un gioco di grandi dimensioni, quindi crealo come un'utilità che può richiedere del tempo per essere eseguita e genera risultati in un rapporto che puoi utilizzare.


ciò significa sviluppare uno strumento. Mettiamola in ultima istanza.
Ali1S232,

6
Lo strumento sarà il tuo cervello, la tenuta dei registri e la capacità di memoria o sarà qualcosa di automatizzato che non si stancherà e mancherà un glitch =) Immagino che dipenda da quanto sarà grande il tuo gioco e se lo farai mai costruirne un altro dallo stesso motore, per decidere se valga la pena passarlo o meno.
Patrick Hughes,

Il modo migliore per farlo potrebbe essere quello di costruire un albero delle dipendenze dall'alto verso il basso (andare indietro) e se due elementi nell'albero condividono la stessa dipendenza (e la dipendenza richiede una scelta tra di loro), allora hai una violazione.
rallentato fino al

0

questa può sembrare una risposta strana, ma puoi facilmente verificare la presenza di eventi impossibili usando i compilatori (ad esempio c ++)! lasciami spiegare come: hai esattamente un file di intestazione per ogni fase. e il gioco termina nel main.cppfile. ogni volta che puoi passare da stage aa stage b, devi solo includere il file relativo a stage ain stage b. ogni volta che ottieni un nuovo oggetto in una fase, devi semplicemente definire un valore per quell'elemento. ogni volta che perdi o utilizzi un oggetto, devi solo annullarlo. alla fine in ogni fase devi solo usare tutti i valori definiti per gli elementi necessari in quella fase. ecco un esempio su come utilizzarlo nel codice:

ah

#define itemA

bh

#include <a.h>
#undef itemA
#define itemB

ch

#include <a.h>

itemA;

#include <b.h>

itemB;

main.cpp

#include <c.h>
int main()
{
}

anche se potrebbe aver bisogno di alcune modifiche prima di essere realmente utilizzato, ma immagino che tu possa creare un codice come questo. puoi anche usare l'ereditarietà e usare le classi per ogni fase invece dell'approccio che ho suggerito. a parte questo, penso che tu debba sviluppare uno strumento da solo.


2
è un vero uso improprio del compilatore!
Ali1S232,

3
È interessante ma sarebbe piuttosto fragile e funzionerebbe solo se nella mia storia avessi una classe per oggetto / evento / sezione. Stavo cercando più di un approccio basato sui dati, leggendo da XML o qualcosa del genere. Grazie per il tuo suggerimento però.
Dan Dan

3
Non è una buona idea forzare una ricompilazione ogni volta che una missione cambia, in più ciò non consentirebbe l'aggiornamento dei dati agli utenti finali (DLC ad esempio), o se eseguito da un server e l'applicazione di correzioni senza forzare i download.
Patrick Hughes,

2
quell'esempio di codice non è in alcun modo correlato al codice che verrà rilasciato e quel codice non fa davvero nulla. sta solo verificando se la trama e le missioni sono valide o meno. (se non lo sono, ricevi un errore di compilazione, altrimenti puoi implementare quell'albero delle missioni nel tuo gioco!
Ali1S232

Oh capisco, ho frainteso. Ho il sospetto che una persona possa dedicare più tempo a garantire che questo codice rifletta i dati effettivi rispetto a quelli che verrebbero salvati durante il debug degli errori della logica di ricerca, è un giudizio che l'autore del gioco deve fare.
Patrick Hughes,
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.