Studente: Luca Del Bolgia Prof.: Enrico Denti. Descrizione Del Problema Editor di giochi:...

39
The RulesGame Attività Progettuale di Linguaggi e Modelli Computazionali M Studente: Luca Del Bolgia Prof.: Enrico Denti

Transcript of Studente: Luca Del Bolgia Prof.: Enrico Denti. Descrizione Del Problema Editor di giochi:...

  • Slide 1
  • Studente: Luca Del Bolgia Prof.: Enrico Denti
  • Slide 2
  • Descrizione Del Problema Editor di giochi: Architettura predefinita; Regole Personalizzabili; Utilizzo di BOT: Random (Stupidi); Guidati da euristiche (Intelligenti);
  • Slide 3
  • Definizione delle regole Creazione dello stato iniziale File XML di configurazione Inizializzazione del gioco Esecuzione del gioco Scrittura Lettura RulesGame Language JAXBJAXB tuProlog PercorsoParser
  • Slide 4
  • Architettura Predefinita Due schieramenti: Attaccanti: devono raggiungere un TOT di obiettivi; Difensori: devono ostacolare ed eliminare gli attaccanti; Tipologie di caselle: Causano effetti sia positivi che negativi ai giocatori che le attraversano; Entit Passive: Interagiscono con i giocatori che si fermano su di esse; Numero di Mosse: Il numero di mosse viene deciso in modo random a run-time
  • Slide 5
  • Architettura Predefinita Si utilizza il linguaggio Prolog per creare larchitettura di base; Sono quattro le regole principali del sistema: Lo spostamento del giocatore; La gestione dei turni; I BOT random; I BOT guidati da euristiche;
  • Slide 6
  • Lo stato corrente
  • Slide 7
  • RulesGame Language Nasce il bisogno di un linguaggio semplice e facilmente comprensibile sia da utenti principianti che utenti esperti di programmazione, per creare regole personalizzate di (quasi) qualsiasi tipo per un gioco. Il gioco non sar completamente implementabile: una parte del sistema pre-implementato, e definisce larchitettura di base. Alcune regole di base potranno essere superate da utenti esperti del linguaggio Prolog, che potranno scrivere le regole in modo che il sistema si comporti in modo completamente personalizzato.
  • Slide 8
  • RulesGame Language Token della grammatica:
  • Slide 9 "> "> " title="RulesGame Language Token della grammatica: ","=","+","*","/","^","\\","%"])+("}") >">
  • RulesGame Language Token della grammatica: ","=","+","*","/","^","\\","%"])+("}") >
  • Slide 10
  • RulesGame Language Produzioni della grammatica: Scopo::=Regole Inizializzazione Regole::=Caselle Giocatori EntitaPassive Caselle::= (RegolaCasella)+ Giocatori::=Attaccanti Difensori Attaccanti::= Info Euristica Obiettivi Difensori::= Info Euristica EntitaPassive::= (RegolaEntitaPassiva)*
  • Slide 11
  • RulesGame Language Produzioni della grammatica: RegolaCasella::= Nome ( | Codice) Info::= | | Codice Euristica::= |Codice Obiettivi::= RegolaEntitaPassiva::= Nome ( | | | | | Codice) ( | | | | | Codice) Codice::= Nome::=
  • Slide 12
  • RulesGame Language Produzioni della grammatica: Inizializzazione::= Griglia Mosse Griglia::= (Casella)+ Casella::= Nome ( |Nome) (Attaccante|Difensore| ) Attaccante::= ( Bot )? Difensore::= ( Bot )? Mosse::= Bot::=
  • Slide 13
  • RulesGame Language-esempio 1/5 caselle [ libero:windefender bloccato:block ] Per prima cosa si creano le tipologie di caselle, definendo il nome del tipo e quali sono gli effetti dellattraversamento su una di esse. NomeEffetto Pu essere sostituito da codice Prolog, racchiuso tra graffe, per maggiori info vedere il manuale.
  • Slide 14
  • RulesGame Language-esempio 2/5 attaccanti [ nothing scorenemies 1 ] Si definiscono informazioni aggiuntive, euristica e obiettivi dello schieramento attaccanti. Pu essere sostituito da codice Prolog, racchiuso tra graffe, per maggiori info vedere il manuale. Informazioni Euristica Obiettivi
  • Slide 15
  • RulesGame Language-esempio 3/5 difensori [ nothing scorenemies ] Pu essere sostituito da codice Prolog, racchiuso tra graffe, per maggiori info vedere il manuale. Informazioni Euristica Si definiscono informazioni aggiuntive, euristica dello schieramento difensori.
  • Slide 16
  • RulesGame Language-esempio 4/5 entitapassive [ fine: attaccante score difensore nothing ] Si definiscono le entit passive: nome, effetto sullattaccante ed effetto sul difensore per ognuna. Pu essere sostituito da codice Prolog, racchiuso tra graffe, per maggiori info vedere il manuale. Effetto Attaccante Effetto Difensore Nome
  • Slide 17
  • RulesGame Language-esempio 5/5 inizializzazione [ 1,1:libero,nothing,attaccante1 1,2:libero,nothing,nothing... 2,3:libero,nothing,difensore1(bot,true) 3,1:bloccato,nothing,nothing 3,2:libero,nothing,nothing 3,3:libero,fine,nothing mosse:2 ] Infine si crea lo stato iniziale. Colonna Riga Tipo casella Entit passiva Nome giocatore Definizione BOT Max Mosse
  • Slide 18
  • RulesGame Language Poich il linguaggio non presenta self-embedding esso una linguaggio di tipo 3. La grammatica appena presentata di tipo 2, poich non lineare ne a destra ne a sinistra, per facile trasformarla in una grammatica lineare a destra, semplicemente eliminando un sacco di simboli non terminali, che sono stati utilizzati per avere maggiore chiarezza. Scopo::=Regole Inizializzazione Regole::=Caselle Giocatori EntitaPassive Caselle::= La soluzione pessima in quanto a leggibilit e chiarezza.
  • Slide 19
  • RulesGame Language Altra soluzione, cambiando un poco la grammatica: Scopo::= Caselle::= Prima produzione pi pulita e chiara Caselle Giocatori EntitaPassiveRegoleInizializzazione
  • Slide 20
  • RulesGame Language File di configurazione XMLRegole ed inizializzazione
  • Slide 21
  • JAXB:Java Architecture for XML Binding JAXB permette agli sviluppatori java di accedere e processare I dati XML senza conoscere XML; per esempio non c bisogno di creare o usare un parser SAX oppure scrivere metodi di callback.
  • Slide 22 "> "> " title="File XSD di esempio-RulesGame.xsd ">
  • File XSD di esempio-RulesGame.xsd
  • Slide 23
  • JAXB:creare le classi java da file XSD (Binding a schema) Fare il binding di uno schema significa generare un set di classi java che lo rappresentano. Ogni classe avr dei metodi get e set per gli attributi ed elementi interni allelemento XML corrispondente.
  • Slide 24
  • JAXB:scrivere un file XML Per scrivere un file XML bisogna creare unistanza del XmlRootElement ed inizializzarla a dovere (utilizzando le set). Infine utilizzare un istanza della classe Marshaller (si ottiene dal JABXContext) per creare il file XML corrispondente.
  • Slide 25
  • JAXB:scrivere un file XML-esempio 1/3 try { // la stringa jaxb.parser rappresenta il package delle classi create con JAXB JAXBContext jc = JAXBContext.newInstance("jaxb.parser"); jaxb.parser.ObjectFactory factory=new jaxb.parser.ObjectFactory(); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,new Boolean(true)); jaxb.parser.Gioco gioco=factory.createGioco(); //creazione del XmlRootElement
  • Slide 26
  • JAXB:scrivere un file XML-esempio 2/3 jaxb.parser.Regole regole=factory.createRegole(); jaxb.parser.Bots bots=factory.createBots(); regole.setStatoIniziale("["+statoCaselle+","+statoAttaccanti+","+statoDifensori +","+statoTurno+"]"); regole.setMosse(mosse);//mosse un intero regole.setBOTS(bots); gioco.setMotore(motore);//motore una stringa gioco.setRegole(regole);
  • Slide 27
  • JAXB:scrivere un file XML-esempio 3/3 marshaller.marshal(gioco, new FileOutputStream(fileName)); } catch (JAXBException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); }
  • Slide 28
  • JAXB:leggere un file XML Per leggere un file XML bisogna creare unistanza dellUnmarshaller (si ottiene dal JABXContext), dal quale ricaveremo lXmlRootElement. Quindi tramite le get sar possibile accedere a tutti i campi del file XML.
  • Slide 29
  • JAXB:leggere un file XML-esempio 1/2 JAXBContext jc = JAXBContext.newInstance("jaxb.parser"); //creazione dellUnmarshaller Unmarshaller unmarshaller = jc.createUnmarshaller(); //creazione del RootElement dal file XML Gioco gioco=(Gioco)unmarshaller.unmarshal(new File(nomeFile)); //getMotore restituir una stringa writer.println(gioco.getMotore());
  • Slide 30
  • JAXB:leggere un file XML-esempio 2/2 JAXBContext jc = JAXBContext.newInstance("jaxb.parser"); Unmarshaller unmarshaller = jc.createUnmarshaller(); Gioco gioco=(Gioco)unmarshaller.unmarshal(new File(nomeFile)); Regole regole=gioco.getRegole(); Bots bots=regole.getBOTS(); List list=bots.getBOT(); statoCorrente=new Stato(regole.getStatoIniziale(),list); MAX_MOSSE=regole.getMosse();
  • Slide 31
  • JAXB-conclusioni JAXB risulta molto utile e facile da utilizzare; in questo modo si riesce a disaccoppiare totalmente il programma java dalla sintassi XML dei file utilizzati. Inoltre un vantaggio non da poco dato dalla creazione e lettura di file tramite tecniche che utilizzano un XSD Schema: difatti lXML verr scritto seguendo le regole dettate nello schema, e, in automatico, verr validato allatto della lettura, dando una eccezione nel caso di validazione errata. XSD inoltre permette maggiori vincoli nei confronti di DTD, quindi maggiori vincoli sintattici. Sito di approfondimento: http://www.oracle.com/technetwork/articles/javase/index- 140168.html#introjb JAXB scaricabile da: http://www.oracle.com/technetwork/java/1-6-136288.html Per utilizzare al meglio JAXB consiglio il plugin eclipse XJC: http://www.webmanie.de/cms158/index.php?option=com_content&view=article&id=13&Itemid=0
  • Slide 32
  • Inizializzazione ed esecuzione del gioco Nel file XML di configurazione sono presenti alcune informazioni utili per: Creare il motore del gioco Informazioni allinterno del file XML; Architettura di base gi implementata; Inizializzare il gioco Stato iniziale (in formato Prolog); Mosse massime per giocatore; Lista dei bot;
  • Slide 33
  • tuProlog-il motore del sistema La comunicazione tra motore ed applicazione gestita da tuProlog, e le query fatte al motore Prolog possono essere di 4 tipologie: Richiesta di spostamento Prossimo turno Spostamento Bot Random Spostamento Bot con Euristica
  • Slide 34
  • tuProlog-query Richiesta di spostamento spostamento(Percorso, Giocatore, Siniziale, Sfinale, SUCCESS) Prossimo turno prossimoTurno(Scorrente, Sfinale)
  • Slide 35
  • tuProlog-query Spostamento Bot Random movimentoCasualeBot(MaxMovimento, Siniziale, Sfinale, SUCCESS) Spostamento Bot con Euristica movimentoEuristicoBot(Mosse, Siniziale, Sfinale, Profondita, SUCCESS)
  • Slide 36
  • PercorsoParser Il compito di questo compilatore di trasformare una stringa rappresentante lo spostamento richiesto da parte dellutente attraverso la griglia di gioco, in una corretta rappresentazione del tragitto in Prolog, e quindi utilizzabile correttamente nella query al motore del gioco tramite tuProlog. up,right,downUtente nella casella 3,4: Prolog:[transito(on(2,4)),transito(on(2,5)),fine(on(3,5))]
  • Slide 37
  • PercorsoParser SF S F | F, S Grammatica Tipo 3: Linguaggio Tipo 3 Automa Riconoscitore top down Espressione regolare: (,)* -top down
  • Slide 38
  • PercorsoParser IS I | S S, I Grammatica Tipo 3: Linguaggio Tipo 3 Automa Riconoscitore bottom up Espressione regolare: (, )* -bottom up
  • Slide 39
  • Possibili sviluppi futuri Aggiungere nuove funzionalit di base tramite la costruzione di regole personalizzate. Modificare larchitettura Prolog di modo che possa sostenere anche altre tipologie di gioco (con un relativo aumento del delay per Bot Euristici). Creazione di una interfacca utente personalizzata, correlata alle regole implementate, utilizzando la buona modularit del sistema.