290 likes | 404 Views
JATA Just Another Text Adventure. Progetto d’esame di Gianluca Gallo. Linguaggi e modelli computazionali LM Prof. Enrico Denti. Avventure testuali.
E N D
JATAJust Another Text Adventure Progetto d’esame di Gianluca Gallo Linguaggi e modelli computazionali LM Prof. Enrico Denti
Avventure testuali • “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.
Scopo del progetto • Realizzare un interprete per avventure testuali • Riconoscere le frasi di gioco • Eseguire le azioni corrispondenti
Linguaggio • Tipologie di azioni: • Movimento • Raccolta • Vista • Utilizzo
Linguaggio • Tipologie di azioni: • Movimento • Raccolta • Vista • Utilizzo Esempi: vai cantina - vai in cantina – vai nella cantina cammina verso cantina spostati verso tetto – spostati sul tetto
Linguaggio • Tipologie di azioni: • Movimento • Raccolta • Vista • Utilizzo Esempi: prendi stivali – prendi gli stivali raccogli martello – raccogli il martello
Linguaggio • Tipologie di azioni: • Movimento • Raccolta • Vista • Utilizzo Esempi: guarda la spada - guarda inventario osserva spada esamina cantina
Linguaggio • Tipologie di azioni: • Movimento • Raccolta • Vista • Utilizzo Esempi: usa spada – usa la spada usa la spada su cattivo – usa spada cattivo utilizza il martello – utilizza il martello con le mura
Grammatica di gioco • 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 e linguaggio • 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 disgiuntiGrammatica LL(1)
Struttura del gioco Stato Introduzione Stanza corrente Stanze Inventario Oggetti Scopo
Semantica di gioco: PlayVisitor • 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
Struttura dell’engine • Utilizzo del PlayVisitor fino alla condizione di terminazione
Esempio Gioco cablato nel codice
Estrarre l’ambiente Ogni 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 dinamico Lettura informazioni di gioco da file esterno Creazione di classi specifiche Istanziamento stanze e oggetti
Grammatica dei giochi • Start ::= DescrizioneGiocoStanzaInizialeOggettiStanze • 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> • Descrizione ::= <DESCRIZIONE> • JavaCode ::= <CODE> • <DEFAULT> TOKEN : { <CODE: "$" (~["$"])* "$"> } • <DEFAULT> TOKEN : { <DESCRIZIONE: "{" (~["}"])* "}"> }
Struttura del costruttore • 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)
Controllo semantico: CheckSemanticVisitor • 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
Costruzione del gioco: CreateGameVisitor • Creazione codice classe oggetti
Costruzione del gioco: CreateGameVisitor • Creazione codice classe di gioco
Costruzione del gioco: CreateGameVisitor • Istanziazione oggetti e stanze
Sviluppi futuri • 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
JATAJust Another Text Adventure Progetto d’esame di Gianluca Gallo Linguaggi e modelli computazionali LM Prof. Enrico Denti