C'è qualche punto in un'implementazione digraph?

3

La prefazione

Ciao! Sono solo uno studente di informatica medio, abbastanza principiante, che fa progetti personali di programmazione, e che probabilmente è fuori dalla sua profondità e non ha idea di cosa stia facendo. Quindi, potrei aver bisogno di aiuto / spiegazioni extra per capire le cose.

Il contesto

Giochi e narrazioni di branchi

È molto frustrante mettere questo contesto in parole, ma questo diagramma / immagine aiuta davvero a inquadrare la mia domanda (Nota: Potenziali spoiler per The Stanley Parable):

Qualcosacheèsemprestatonellamiamenteècomeigiochipossonoaverepercorsi'ramificati'.C'èsolocosìtantochepuoiandareconledichiarazioniifannidateprimadiottenereunpasticcioorribile.Ora,dopoalcunericerche,hoscopertoil'digraph'...

Cosahofatto

Bene,hoiniziatoapianificareunmodoperimplementareundigraph.Hotrovatoquestaguida: link Per essere molto utile, e stavo per implementare un elenco di adiacenze.

Per attraversare il grafico, creerei un "cursore del grafico". Il cursore del grafico potrebbe essere impostato su una posizione se necessario, ma altrimenti avrebbe dovuto seguire le regole direzionali di qualsiasi nodo al momento "sat".

I nodi conterrebbero i dati per qualunque sia l'evento (ad esempio un evento di dialogo storia in cui il giocatore dovrebbe scegliere quale frazione da schierare), inoltre, conterrà anche le regole per i prerequisiti da disabilitare alcuni rami se il giocatore non li ha incontrati (ad esempio, il giocatore ha bisogno di almeno 100 reputazione prima di poter accedere a un'opzione di dialogo / riga di ricerca).

Ora, vi è il problema di come nel mondo ogni nodo avrebbe alcuna conoscenza di ciò che sono gli altri nodi (Come sapere quali nodi collegare), che può essere risolto prendendo una pagina dal web, e assegna a ciascun nodo un identificatore di risorsa ...

Ma qui è dove la mia inesperienza sta davvero portando alla mia rovina.

Il problema

Ho definito il nodo come un "evento" ma ... non è del tutto corretto.

In una panoramica, un digrafo è solo un insieme di dati correlati. Le regole definiscono la natura direzionale dei dati, ma non definiscono le condizioni per la scelta di un percorso rispetto a un altro.

Sto cercando di forzare la struttura dei dati per memorizzare "eventi", come se ciò fosse significativo per il digraph. Il digraph non si preoccupa di quali dati memorizza, semplicemente definisce come viene memorizzato!

Quindi ... cosa significa?

Bene, ho trovato un modello / astrazione alternativo. Basato più su pagine web / scegli i tuoi libri di avventura. Piuttosto che rappresentare ogni nodo e le connessioni tra i nodi - c'è solo un elenco di "pagine" con ID. Una pagina può contenere collegamenti in uscita basati sull'ID. Se una pagina viene eliminata o un link punta alla cosa sbagliata, ottieni solo un errore 404 o solo un link sbagliato.

Ma ... puoi anche creare un modello digraph di questo.

La domanda

Quindi alla fine di tutto, c'è qualche motivo nel tentativo di implementare una struttura digraph? Almeno in questo tipo di contesto, voglio dire, ovviamente è utile per qualsiasi argomento pesante di teoria dei grafi.

Ma come prima, c'erano dei vantaggi nella struttura del digrafo?

Non ho ancora implementato / tentato di creare nulla di tutto ciò ... questo è proprio quello che ho scoperto dal pianificare le cose.

Voglio solo assicurarmi di aver capito bene questa volta.

In risposta a @Doc Brown

Esempi di pseudocodice negativi del genere cosa intendo:

class digraph {

    private List<node> myNodes;
    private Dictionary<Node, List<Node>> myAdjacencyList;

    public Digraph() {
        //Constructor
    }

    public list<node> NeighboursOf (Node node) {
        // Gets neighbours of node
    }

    public list<node> GetNode (string NodeResourceID) {
        // Gets neighbours of node based on ID.
    }

    // Add node method, Add Adjacency, Remove Adjacency, etc.
}

class node {
    // Does whatever a node does.
    // GetNeighbours method, GetDataStoredByNode, CheckNodeRules

}

vs

public List<string> pages;

class PageInterpreter {
    public LoadPage() {
        //Loads a page, 
    }
    // BAsicly, a 'web page', with everything in the bag.
}

void RunEngineCode() (
    if (current_page has updated) {
        LoadPage(currentPage);
    }
    UpdateAllElementsOfLoadedPage();
    redrawScreenIfNeeded();
    //etc.
)

main {
    while (true) {
        RunEngineCode();
    }
}

Se la mia domanda ha problemi, contattami per migliorarla.

Se la mia domanda è sbagliata, beh ... non so cosa dire. Ho bisogno dell'aiuto di qualcuno più esperto di me. Se questo non è il posto giusto per dirlo, dimmi dove dovrei andare.

Grazie.

    
posta Gry- 17.11.2017 - 04:56
fonte

2 risposte

3

La rappresentazione che hai scelto dovrebbe rendere possibile l'implementazione della tua idea, e spero sia facile e chiara. Quello che hai in quel diagramma è una macchina a stati finiti . In ogni dato stato, gli input determinano quale sarà il prossimo stato. Gli input possono essere input letterali dall'utente tramite tastiera, mouse, controller di gioco, ecc. E possono anche essere dati dal mondo di gioco, ad esempio se il giocatore ha la chiave d'oro nel proprio inventario.

Il modo in cui memorizzi i dati è meno importante di come lo si utilizza e che rappresenta ciò che si desidera. Se questo ti aiuta a realizzare il tuo obiettivo, fallo in un modo, quindi fallo. Un modo potrebbe essere avere un nodo che contiene cose come 1) Cosa mostrare all'utente (forse una finestra di dialogo o azioni di altri personaggi), 2) Un elenco di possibili stati successivi e 3) Un elenco di vincoli o requisiti necessari per andare a ciascuno di questi stati.

Quindi potrebbe essere qualcosa di simile a questo:

nodo 1

Informa l'utente: sei in una stanza scarsamente illuminata. C'è un tavolo al centro della stanza. Sul tavolo c'è una candela tremolante accanto a un coltello affilato. Senti un ululato in lontananza. C'è una porta aperta a ovest. C'è una porta chiusa a nord. C'è una scala a est.

Possibili stati successivi:

node 2

node 3

node 4

Vincoli

node 2: Player deve andare ad ovest

nodo 3: il giocatore deve avere la chiave e andare a nord

nodo 4: il giocatore deve andare verso est o verso l'alto

Nel codice, quello che dici all'utente potrebbe essere solo una stringa. Gli stati successivi potrebbero essere solo indici nella serie di nodi. E i vincoli potrebbero essere solo un elenco di comandi e articoli di inventario richiesti.

Un altro termine che potrebbe essere utile è programmazione basata sui dati . Qui è dove un insieme di dati controlla il flusso del programma piuttosto che il codice stesso.

    
risposta data 17.11.2017 - 07:36
fonte
1

Mi sembra che il succo della tua domanda sia:

  • Si dovrebbe implementare un gioco di questo tipo intrecciando le transizioni consentite tra posizioni / stati di gioco usando direttamente una sorta di linguaggio di markup (che descrive anche le finestre di dialogo / pagine / descrizione posizione ecc.), insieme a un interprete per quella lingua?

  • Oppure: dovresti utilizzare una specie di struttura separata per il digramma?

IMHO questa risposta è in qualche modo pensata, ma penso che avere un linguaggio dichiarativo, specifico per il dominio per definire la struttura di localizzazione del gioco, contenente la descrizione delle posizioni e le transizioni consentite e forse i vincoli e le condizioni per loro in un unico posto sia sicuramente una buona idea per fare giochi di una complessità paragonabile alla foto di esempio che hai dato.

Quindi, avrai bisogno di un interprete per questo "linguaggio specifico del dominio", che genera l'HTML / UI dalla descrizione di un luogo. Questo interprete avrà bisogno di una "struttura del digrafo" astratta internamente? Non vedo immediatamente una ragione convincente per cui ne avrà bisogno, ma per il design di alto livello questa IMHO è abbastanza irrilevante. Ciò di cui questo interprete avrà bisogno è ovviamente

  • qualche cursore / posizione attiva (in cui la posizione è il giocatore corrente)

  • altre informazioni sullo stato del gioco (ad esempio, inventario del giocatore, stato di alcuni oggetti nel gioco, ecc.)

Quindi continua, inizia a progettare la tua lingua e il tuo interprete e, quando si tratta dei dettagli cruenti dell'implementazione, scoprirai sicuramente se hai bisogno di strutture dati aggiuntive, e quale.

    
risposta data 17.11.2017 - 22:19
fonte

Leggi altre domande sui tag