Concettualmente, come si fa a creare un motore di regole / vincoli (non grafica / fisica) per un gioco


16

Voglio creare un gioco semplice simile ai libri di avventura personalizzata. Il giocatore viene presentato con un testo narrativo e può scegliere la sua azione da un elenco di possibilità. Questo, a sua volta, porta a un nuovo testo narrativo, all'infinito. L'unico problema è che, in base ad alcune decisioni precedenti, l'elenco delle possibilità potrebbe differire.

A prima vista, questo suona come un carico di istruzioni if-else, quindi implica che un motore di regole sarebbe in atto. Ma a me sembra anche una macchina a stati finiti.

Sto per scrivere questo in Java o forse Groovy. Al momento sono più interessato alle questioni concettuali, ovvero come dovrebbe essere fatto a un livello ampio (come fanno le persone a implementare giochi di scacchi o di carte, comunque?), Ma alcuni consigli su una biblioteca specifica sono ben accetti.

Ovviamente, il "motore di gioco" dal titolo non si riferisce al rilevamento delle collisioni o ad altre meccaniche di fisica / grafica, ma la logica che decide quali opzioni ha un giocatore ha dato la situazione e il suo stato attuale.


1
Questa domanda è più adatta a Gamedev ?
Uwe Plonus,

2
@Uwe Plonus Lo ha considerato, ma io non ci credo. La mia domanda è puramente concettuale e non ha nulla a che fare con le biblioteche grafiche, il 3D e altri argomenti che dominano gamedev. Vieni a pensarci bene, questa domanda ha poco a che fare con i giochi in sé ... ma non sono sicuro di come intitolarlo meglio.
Kaqqao,

Gli scacchi e i giochi di carte sono molto diversi dalle avventure.
Deer Hunter,

1
La tua domanda sembra riguardare anche lo sviluppo di sistemi esperti. Quando la gamma di domande di follow-up e le possibili diagnosi viene limitata con ogni risposta selezionata. Forse è quello che cercare per trovare qualche "input" in più?
Marjan Venema,

Risposte:


7

Sulla base di ciò che hai detto nei commenti, ecco come lo gestirò:

Implementa la storia come una macchina a stati finiti, con una svolta. Ogni stato è una pagina della storia e ogni transizione è un collegamento da una pagina all'altra. Ma ogni Transizione ha anche Condizioni . Le Condizioni potrebbero essere nulle, nel qual caso la Transizione viene sempre visualizzata come un'opzione disponibile, ma in caso contrario, devono essere valutate quando viene visualizzata la pagina e se la valutazione ritorna False, la Transizione non viene visualizzata.

Esistono due modi di base per implementare le Condizioni. Il primo è quello di creare un motore di script completo nel gioco, e quindi la Condizione sembra return player.inventory.contains(GUN). Inizialmente è più complicato da configurare, ma consente script più avanzati.

Il secondo è codificare le possibili condizioni in una sorta di oggetto. Potrebbe avere un RequiredItemcampo e se quel campo ha un valore, controlli per vedere se la condizione è soddisfatta. Questo sistema è più semplice da configurare. Limita ciò che puoi fare molto più di quanto farebbe lo script, ma se non hai bisogno della flessibilità che un motore di script fornirebbe, è probabilmente molto più facile da usare.


1
In realtà usiamo qualcosa del genere nella nostra app web completamente non legata al gioco. L'utente ha un numero di Stati e qualsiasi numero di Eventi può essere attivato nel codice, molti dei quali sono preimpostati per la transizione degli utenti da uno Stato a un altro. Penso che per i casi descritti della domanda, avere una sorta di linguaggio di scripting rudimentale (o un linguaggio completo come Python / Lua) per definire condizioni / trigger sarebbe anche utile.
Katana314,

Mi piace un po 'questo approccio. Grazie! Lo esaminerò ulteriormente. Qualche possibilità di conoscere una libreria utile?
Kaqqao,

@veggen: No, scusa. Non uno sviluppatore Java.
Mason Wheeler,

@MasonWheeler: cosa ne pensi di Lazzaro ?
Robert Harvey,

1
Poiché questa domanda ha colpito l'elenco delle domande popolari oggi, riferirò che l'ho implementato esattamente come ho detto che avrei fatto nel commento precedente. Ho fatto un bel DSL e ho implementato la logica FSM in quanto è davvero molto semplice. Non potrebbe essere più soddisfatto della soluzione. @MasonWheeler Grazie ancora per un ottimo consiglio!
Kaqqao,

5

Penso che la risposta sia nel titolo: hai bisogno di un motore di regole. Se hai intenzione di scrivere la tua applicazione con Java, puoi ovviamente scrivere la tua come suggeriva Gilbert Le Blanc, O potresti dare un'occhiata a Drools , un motore di regole.

quali opzioni ha dato un giocatore alla situazione e al suo stato attuale

Con Drools o qualsiasi altro motore di regole, infatti, puoi definire una situazione parametrizzata che genera un elenco di possibili azioni. Puoi codificare semplici regole che suc ha:

  • il giocatore è su pageX:

    • scelta 1: titolo: "vai a sinistra", azione: "pagina45"
    • scelta 2: titolo: "vai a destra", azione: "pagina56"
    • Se il giocatore ha lo Staff of Fireballs POI scelta 3: titolo "lancia palla di fuoco", azione: "pagina32"
    • Se il giocatore ha un'abilità percettiva di 10 POI scelta 4: titolo "controlla gli scritti sul muro", azione: "pagina67"

Ciò che è interessante con Drools è che puoi codificare tutte le tue regole in un file Excel, e quindi all'inizio del gioco, fai leggere a Drools quel file. Dopodiché tutto è in memoria, devi solo preoccuparti della tua interfaccia utente.

Ecco alcune risorse per aiutarti a iniziare con Drools:


In generale, cerca l'algoritmo di Rete implementato in qualsiasi motore di regole di tuo gradimento.
Deer Hunter,

Sì, Drools è stata una delle cose con cui ho iniziato. Devo indagare un po 'di più per vedere se riesco a valutare solo un pacchetto di regole alla volta, dato che è piuttosto importante nel mio caso. Grazie!
Kaqqao,

@veggen felice di aiutarti!
Jalayn,


2

Concettualmente, il tuo gioco è semplice. In psudeocode, sarebbe simile a questo:

while not at end of adventure story
    display text
    get response

Ora, concatenare tutto il testo insieme in modo che scorra da un'azione all'altra è la parte difficile. È possibile utilizzare un database relazionale. Potresti usare un albero.

È un po 'difficile essere più specifici senza sapere quale linguaggio del computer vuoi usare. Da quando hai citato Java, mi spingerei di più verso una struttura ad albero.

Creare una classe di risposta che contiene una risposta e un collegamento a una classe di testo.

Crea una classe di testo che contenga il testo dell'avventura e un Elenco di risposte come istanze della classe di risposta.

Modificato per rispondere al commento:

Non si calcola nulla in base a questo modello. Usando il tuo esempio, l'albero sarebbe simile a questo, dove T è il testo e A è una scelta di azione:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Sì, esiste una duplicazione del testo, ma seguendo la catena, le azioni future possono tenere conto delle decisioni passate. È un enorme albero decisionale.


Il mio problema è il calcolo delle possibili risposte. Le decisioni passate influenzano le opzioni attuali. Quindi, se un giocatore presentato con "inciampi su un poliziotto morto" sceglie "ruba la sua pistola" invece di "non toccare nulla", in seguito ha la possibilità di "sparare all'inseguitore" oltre a "scappare come pazzo ", che sarebbe stata l'unica opzione se non avessero precedentemente acquistato una pistola.
Kaqqao,

@veggen: vedi la risposta aggiornata.
Gilbert Le Blanc,
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.