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:
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.