JATA Just Another Text Adventure
Progetto d’esame di Gianluca Gallo
Linguaggi e modelli computazionali LM
Prof. Enrico Denti
“Sono programmi per computer che simulano un ambiente nel quale i giocatori usano comandi testuali per istruire il personaggio della storia ad interagire con l'ambiente in cui si trova.”
(Da Wikipedia)
Caratterizzate da: Scopo Ambiente di gioco
Stanze esplorabili Oggetti Inventario
Obiettivo: Il giocatore deve esplorare l’ambiente di gioco e interagire
con esso fino al completamento dello scopo dell’avventura.
Avventure testuali
Realizzare un interprete per avventure testuali Riconoscere le frasi di gioco Eseguire le azioni corrispondenti
Scopo del progetto
Tipologie di azioni: Movimento Raccolta Vista Utilizzo
Linguaggio
Tipologie di azioni: Movimento Raccolta Vista Utilizzo
Linguaggio
Esempi:
vai cantina - vai in cantina – vai nella cantinacammina verso cantinaspostati verso tetto – spostati sul tetto
Tipologie di azioni: Movimento Raccolta Vista Utilizzo
Linguaggio
Esempi:
prendi stivali – prendi gli stivaliraccogli martello – raccogli il martello
Tipologie di azioni: Movimento Raccolta Vista Utilizzo
Linguaggio
Esempi:
guarda la spada - guarda inventarioosserva spadaesamina cantina
Tipologie di azioni: Movimento Raccolta Vista Utilizzo
Linguaggio
Esempi:
usa spada – usa la spada usa la spada su cattivo – usa spada cattivoutilizza il martello – utilizza il martello con le mura
Azione ::= ( Movimento | Raccoglimento | Vista | Utilizzo ) “;”
Movimento ::= <MOVIMENTO> Compl_movimento
Compl_movimento ::= ( <PARTICELLA_MOVIMENTO> )? <STRINGA> <DEFAULT> TOKEN : { <MOVIMENTO: "vai" | "cammina" | "spostati" | "VAI" | "CAMMINA" | "SPOSTATI"> }
<DEFAULT> TOKEN : { <PARTICELLA_MOVIMENTO: "verso" | "in" | "sul" | "a" | "nel" | "nella" | "VERSO" | "IN" | "SUL" | "A" | "NEL" | "NELLA"> }
Raccolta ::= <RACCOLTA> Compl_oggetto
Compl_oggetto ::= ( <ARTICOLO> )? <STRINGA> <DEFAULT> TOKEN : { <RACCOLTA: "prendi" | "raccogli" | "PRENDI" | "RACCOGLI"> }
Vista ::= <VISTA> Compl_oggetto <DEFAULT> TOKEN : { <VISTA: "guarda" | "osserva" | "esamina" | "GUARDA" | "OSSERVA" | "ESAMINA"> }
Utilizzo ::= <UTILIZZO> Compl_oggetto ( Compl_uso )? <DEFAULT> TOKEN : { <UTILIZZO: "usa" | "utilizza" | "USA" | "UTILIZZA"> }
Compl_uso ::= ( <PREPOSIZIONE_USO> )? ( <ARTICOLO> )? <STRINGA> <DEFAULT> TOKEN : { <PREPOSIZIONE_USO: "con" | "su" | "CON" | "SU"> }
<DEFAULT> TOKEN : { <ARTICOLO: "il" | "lo" | "la" | "le" | "gli" | "i" | "IL" | "LO" | "LA" | "LE" | "GLI" | "I“> }
<DEFAULT> TOKEN : { <STRINGA: (<LETTERA>)+> | <#LETTERA: ["_","a"-"z","A"-"Z"]> }
Grammatica di gioco
La struttura delle produzioni è vincolata alla forma A→α, conα∈(VT ∪VN)*,A ∈VN
Grammatica di Tipo 2
Nessun simbolo non terminale è self-embedded Linguaggio generato di Tipo 3 (Regolare)
Nessun simbolo non terminale genera la stringa vuota; per ogni simbolo non terminale che appare nella parte sinistra di più produzioni, gli starter symbol appartenenti alle parti destre delle produzioni alternative sono disgiunti Grammatica LL(1)
Grammatica e linguaggio
Struttura del gioco
Scopo
Oggetti
Stanze
Inventario
Stato
Stanza corrente
Introduzione
Un visitor che evolve stato del gioco in base all’azione eseguita
Azione Movimento
Semantica di gioco: PlayVisitor
Un visitor che evolve stato del gioco in base all’azione eseguita
Azione Raccolta
Semantica di gioco: PlayVisitor
Un visitor che evolve stato del gioco in base all’azione eseguita
Azione Vista
Semantica di gioco: PlayVisitor
Un visitor che evolve stato del gioco in base all’azione eseguita
Azione Utilizzo
Semantica di gioco: PlayVisitor
Utilizzo del PlayVisitor fino alla condizione di terminazione
Struttura dell’engine
Esempio
Gioco cablato nel codice
Estrarre l’ambienteOgni gioco ha la sua intro, le sue stanze e i suoi oggetti
FACILE: istanze
Ma anche un determinato scopo...
...e ogni oggetto ha un uso diverso!
DIFFICILE: comportamento
Gioco dinamico1. Lettura
informazioni di gioco da file esterno
2. Creazione di classi specifiche
3. Istanziamento stanze e oggetti
Start ::= DescrizioneGioco StanzaIniziale Oggetti Stanze
DescrizioneGioco ::= Introduzione CondizioneTerminazione
Introduzione ::= "INTRODUZIONE:" Descrizione
CondizioneTerminazione ::= "FINE:" JavaCode
StanzaIniziale ::= "STANZAINIZIALE:" <STRINGA>
Oggetti ::= ( Oggetto )*
Oggetto ::= NomeOggetto Descrizione JavaCode
NomeOggetto ::= "OGGETTO:" <STRINGA>
Stanze ::= ( Stanza )+
Stanza ::= NomeStanza Descrizione "[" ( OggettoPresente )* "]" "[" ( StanzaRaggiungibile )* "]"
NomeStanza ::= "STANZA:" <STRINGA>
OggettoPresente ::= <STRINGA>
StanzaRaggiungibile ::= <STRINGA>
Grammatica dei giochi
Descrizione ::= <DESCRIZIONE>
JavaCode ::= <CODE>
<DEFAULT> TOKEN : { <CODE: "$" (~["$"])* "$"> }
<DEFAULT> TOKEN : { <DESCRIZIONE: "{" (~["}"])* "}"> }
Parsing file di gioco Controllo sintattico parser Controllo semantico CheckSemanticVisitor Controllo sintattico codice java
ToolProvider.getSystemJavaCompiler();
Costruzione classi di gioco CreateGameVisitor
Compilazione gioco compiler.getTask()
Avvio (reflection)Controllo tramite engine di gioco (chiamata ciclica al PlayVisitor)
Struttura del costruttore
Acquisite le stanze e gli oggetti dal file di gioco: La stanza iniziale deve essere stata definitiva; Gli oggetti contenuti nelle varie stanze devono
essere stati definiti; I vicinati devono essere consistenti
Stanze vicine devono essere definite Stanze vicine devono esserlo reciprocamente
Controllo semantico: CheckSemanticVisitor
Esempio di gioco esterno
Creazione codice classe oggetti
Costruzione del gioco: CreateGameVisitor
Creazione codice classe di gioco
Costruzione del gioco: CreateGameVisitor
Istanziazione oggetti e stanze
Costruzione del gioco: CreateGameVisitor
Esempio completo
Grammatica di gioco più elastica Stanze customizzabili
Eventi all’ingresso Eventi all’uscita
Eventi asincroni Esecuzione azioni entro certi tempi Mostri in movimento
Porting in JavaScript
Sviluppi futuri
JATA Just Another Text Adventure
Progetto d’esame di Gianluca Gallo
Linguaggi e modelli computazionali LM
Prof. Enrico Denti
Top Related