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

16

Voglio creare un gioco semplice simile a quello dei libri di tua scelta. Il giocatore viene presentato con un testo narrativo e arriva a 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, a seconda di alcune decisioni precedenti, l'elenco delle possibilità potrebbe essere diverso.

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

Sto per scrivere questo in Java o forse Groovy. Al momento sono più interessato ai problemi concettuali, cioè come dovrebbe essere fatto a un livello più ampio (come fanno le persone a giocare a scacchi o giochi di carte, comunque?), Ma anche alcuni consigli su una libreria specifica sono ben accetti.

Ovviamente, il "motore di gioco" del titolo non fa riferimento al rilevamento delle collisioni o ad altre meccaniche fisiche / grafiche, ma la logica che decide quali opzioni ha un giocatore ha dato la situazione e il suo stato attuale.

    
posta kaqqao 16.07.2013 - 14:21
fonte

4 risposte

7

In base a ciò che hai detto nei commenti, questo è il modo in cui 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 appare sempre come un'opzione disponibile, ma in caso contrario, devono essere valutate quando viene visualizzata la pagina, e se la valutazione restituisce False , la Transizione non viene visualizzata.

Ci sono due modi fondamentali per implementare le Condizioni. Il primo è impostare un motore di script completo all'interno del gioco, quindi la condizione è come return player.inventory.contains(GUN) . Questo è inizialmente più complicato da configurare, ma consente uno scripting più avanzato.

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

    
risposta data 16.07.2013 - 15:09
fonte
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 suggerito da Gilbert Le Blanc, OPPURE potresti dare un'occhiata a Drools , un motore di regole.

what options does a player have given the situation and his current state

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

  • player is pageX:

    • scelta 1: titolo: "vai a sinistra", azione: "pagina45"
    • choice 2: title: "go right", action: "page56"
    • IF player ha lo Staff of Fireballs THEN choice 3: title "lancia fireball", action: "page32"
    • IF player ha una Abilità Perception di 10 THEN choice 4: title "check writings on the wall", action: "page67"

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

Ecco alcune risorse per aiutarti a iniziare con Drools:

risposta data 16.07.2013 - 15:02
fonte
2

La macchina a stati sembra un approccio sicuro per modellare il tuo gioco. Ci sono molte librerie per le finzioni interattive:

link

non menzionato in wikipedia, lo spago è molto popolare al momento.

    
risposta data 16.07.2013 - 14:52
fonte
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 passi da un'azione all'altra è la parte difficile. Potresti usare un database relazionale. Potresti usare un albero.

È un po 'difficile essere più specifici senza sapere quale linguaggio del computer si desidera utilizzare. Dato che hai citato Java, mi piacerebbe più orientarmi verso una struttura ad albero.

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

Crea una classe di testo che contiene 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ì, c'è qualche duplicazione del testo, ma seguendo la catena, le azioni future possono prendere in considerazione le decisioni passate. È un enorme albero decisionale.

    
risposta data 16.07.2013 - 14:43
fonte