Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package it.uniroma3.diadia.io;
- import it.uniroma3.diadia.ambienti.Stanza;
- import it.uniroma3.diadia.attrezzi.Attrezzo;
- import it.uniroma3.diadia.personaggi.AbstractPersonaggio;
- import it.uniroma3.diadia.personaggi.Mago;
- import java.io.*;
- import java.util.*;
- public class CaricatoreLabirinto {
- /* prefisso di una singola riga di testo contenente tutti i nomi delle stanze */
- private static final String STANZE_MARKER = "Stanze:";
- /* prefisso di una singola riga contenente il nome della stanza iniziale */
- private static final String STANZA_INIZIALE_MARKER = "Inizio:";
- /* prefisso della riga contenente il nome stanza vincente */
- private static final String STANZA_VINCENTE_MARKER = "Vincente:";
- /* prefisso della riga contenente le specifiche degli attrezzi da collocare nel formato <nomeAttrezzo> <peso> <nomeStanza> */
- private static final String ATTREZZI_MARKER = "Attrezzi:";
- /* prefisso della riga contenente le specifiche dei collegamenti tra stanza nel formato <nomeStanzaDa> <direzione> <nomeStanzaA> */
- private static final String USCITE_MARKER = "Uscite:";
- /* prefisso della riga contenente le specifiche dei personaggi da collocare nel formato <tipoPersonaggio> <nomePersonaggio> <presentazionePersonaggio> <nomeStanza>
- * se fosse un Mago il formato dovrebbe essere <tipoPersonaggio> <nomePersonaggio> <presentazionePersonaggio> <nomeStanza> <nomeAttrezzoPosseduto> <pesoAttrezzoPosseduto>
- */
- private static final String PERSONAGGI_MARKER = "Personaggi:";
- /*
- * Esempio di un possibile file di specifica di un labirinto (vedi POO-26-eccezioni-file.pdf)
- Stanze: biblioteca, N10, N11
- Inizio: N10
- Vincente: N11
- Attrezzi: martello 10 biblioteca, pinza 2 N10
- Uscite: biblioteca nord N10, biblioteca sud N11
- Personaggi: Mago Merlino *presentazione* N10 chiave 2, Strega Morgana biblioteca
- */
- private LineNumberReader reader;
- private Map<String, Stanza> nome2stanza;
- private Stanza stanzaIniziale;
- private Stanza stanzaVincente;
- public CaricatoreLabirinto(String nomeFile) throws FileNotFoundException {
- this.nome2stanza = new HashMap<String,Stanza>();
- this.reader = new LineNumberReader(new FileReader(nomeFile));
- }
- public void carica() throws FormatoFileNonValidoException {
- try {
- this.leggiECreaStanze();
- this.leggiInizialeEvincente();
- this.leggiECollocaAttrezzi();
- this.leggiEImpostaUscite();
- this.leggiEImpostaPersonaggi();
- } finally {
- try {
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
- }
- private String leggiRigaCheCominciaPer(String marker) throws FormatoFileNonValidoException {
- try {
- String riga = this.reader.readLine();
- check(riga.startsWith(marker),"era attesa una riga che cominciasse per "+marker);
- return riga.substring(marker.length());
- } catch (IOException e) {
- throw new FormatoFileNonValidoException(e.getMessage());
- }
- }
- private void leggiECreaStanze() throws FormatoFileNonValidoException {
- String nomiStanze = this.leggiRigaCheCominciaPer(STANZE_MARKER);
- for(String nomeStanza : separaStringheAlleVirgole(nomiStanze)) {
- Stanza stanza = new Stanza(nomeStanza);
- this.nome2stanza.put(nomeStanza, stanza);
- }
- }
- private List<String> separaStringheAlleVirgole(String string) {
- List<String> result = new LinkedList<>();
- Scanner scanner = new Scanner(string);
- scanner.useDelimiter(",");
- while(scanner.hasNext()){
- result.add(scanner.next());
- }
- scanner.close();
- return result;
- }
- private void leggiInizialeEvincente() throws FormatoFileNonValidoException {
- String nomeStanzaIniziale = null;
- nomeStanzaIniziale = this.leggiRigaCheCominciaPer(STANZA_INIZIALE_MARKER);
- check(this.isStanzaValida(nomeStanzaIniziale), nomeStanzaIniziale +" non definita");
- String nomeStanzaVincente = this.leggiRigaCheCominciaPer(STANZA_VINCENTE_MARKER);
- check(this.isStanzaValida(nomeStanzaVincente), nomeStanzaVincente + " non definita");
- this.stanzaIniziale = this.nome2stanza.get(nomeStanzaIniziale);
- this.stanzaVincente = this.nome2stanza.get(nomeStanzaVincente);
- }
- private void leggiECollocaAttrezzi() throws FormatoFileNonValidoException {
- String specificheAttrezzi = this.leggiRigaCheCominciaPer(ATTREZZI_MARKER);
- for(String specificaAttrezzo : separaStringheAlleVirgole(specificheAttrezzi)) {
- String nomeAttrezzo = null;
- String pesoAttrezzo = null;
- String nomeStanza = null;
- try (Scanner scannerLinea = new Scanner(specificaAttrezzo)) {
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome di un attrezzo."));
- nomeAttrezzo = scannerLinea.next();
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il peso dell'attrezzo "+nomeAttrezzo+"."));
- pesoAttrezzo = scannerLinea.next();
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome della stanza in cui collocare l'attrezzo "+nomeAttrezzo+"."));
- nomeStanza = scannerLinea.next();
- }
- posaAttrezzo(nomeAttrezzo, pesoAttrezzo, nomeStanza);
- }
- }
- private void posaAttrezzo(String nomeAttrezzo, String pesoAttrezzo, String nomeStanza) throws FormatoFileNonValidoException {
- int peso;
- try {
- peso = Integer.parseInt(pesoAttrezzo);
- Attrezzo attrezzo = new Attrezzo(nomeAttrezzo, peso);
- check(isStanzaValida(nomeStanza),"Attrezzo "+ nomeAttrezzo+" non collocabile: stanza " +nomeStanza+" inesistente");
- this.nome2stanza.get(nomeStanza).addAttrezzo(attrezzo);
- }
- catch (NumberFormatException e) {
- check(false, "Peso attrezzo "+nomeAttrezzo+" non valido");
- }
- }
- private boolean isStanzaValida(String nomeStanza) {
- return this.nome2stanza.containsKey(nomeStanza);
- }
- private void leggiEImpostaUscite() throws FormatoFileNonValidoException {
- String specificheUscite = this.leggiRigaCheCominciaPer(USCITE_MARKER);
- for(String specificaStanze : separaStringheAlleVirgole(specificheUscite)) {
- String stanzaPartenza = null;
- String dir = null;
- String stanzaDestinazione = null;
- try (Scanner scannerDiLinea = new Scanner(specificaStanze)){
- while (scannerDiLinea.hasNext()) {
- check(scannerDiLinea.hasNext(),msgTerminazionePrecoce("le uscite di una stanza."));
- stanzaPartenza = scannerDiLinea.next();
- check(scannerDiLinea.hasNext(),msgTerminazionePrecoce("la direzione di una uscita della stanza "+stanzaPartenza));
- dir = scannerDiLinea.next();
- check(scannerDiLinea.hasNext(),msgTerminazionePrecoce("la destinazione di una uscita della stanza "+stanzaPartenza+" nella direzione "+dir));
- stanzaDestinazione = scannerDiLinea.next();
- impostaUscita(stanzaPartenza, dir, stanzaDestinazione);
- }
- }
- }
- }
- private String msgTerminazionePrecoce(String msg) {
- return "Terminazione precoce del file prima di leggere "+msg;
- }
- private void impostaUscita(String stanzaDa, String dir, String nomeA) throws FormatoFileNonValidoException {
- check(isStanzaValida(stanzaDa),"Stanza di partenza sconosciuta "+dir);
- check(isStanzaValida(nomeA),"Stanza di destinazione sconosciuta "+ dir);
- Stanza partenzaDa = this.nome2stanza.get(stanzaDa);
- Stanza arrivoA = this.nome2stanza.get(nomeA);
- //Imposta direzione diretta
- partenzaDa.impostaStanzaAdiacente(dir, arrivoA);
- //Imposta direzione inversa
- if(dir.equals("est"))
- arrivoA.impostaStanzaAdiacente("ovest",partenzaDa);
- if(dir.equals("ovest"))
- arrivoA.impostaStanzaAdiacente("est",partenzaDa);
- if(dir.equals("nord"))
- arrivoA.impostaStanzaAdiacente("sud",partenzaDa);
- if(dir.equals("sud"))
- arrivoA.impostaStanzaAdiacente("nord",partenzaDa);
- }
- private void leggiEImpostaPersonaggi() throws FormatoFileNonValidoException{
- String specifichePersonaggi = this.leggiRigaCheCominciaPer(PERSONAGGI_MARKER);
- for(String specificaPersonaggio : separaStringheAlleVirgole(specifichePersonaggi)) {
- String tipoPersonaggio = null;
- String nomePersonaggio = null;
- String presentazionePersonaggio = null;
- String nomeStanza = null;
- String attrezzoPosseduto=null;
- String pesoAttrezzo=null;
- try (Scanner scannerLinea = new Scanner(specificaPersonaggio)) {
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il tipo di un personaggio."));
- tipoPersonaggio = scannerLinea.next();
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome di un personaggio."));
- nomePersonaggio = scannerLinea.next();
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("la presentazione del personaggio "+nomePersonaggio+"."));
- presentazionePersonaggio = scannerLinea.next();
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome della stanza in cui collocare il personaggio "+nomePersonaggio+"."));
- nomeStanza = scannerLinea.next();
- if(tipoPersonaggio.equals("Mago")){
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome dell'attrezzo posseduto dal personaggio "+nomePersonaggio+"."));
- attrezzoPosseduto = scannerLinea.next();
- check(scannerLinea.hasNext(),msgTerminazionePrecoce("il peso dell'attrezzo "+attrezzoPosseduto+"."));
- pesoAttrezzo = scannerLinea.next();
- }
- }
- aggiungiPersonaggio(tipoPersonaggio, nomePersonaggio, presentazionePersonaggio, nomeStanza, attrezzoPosseduto,pesoAttrezzo);
- }
- }
- private void aggiungiPersonaggio(String tipoPersonaggio,String nomePersonaggio, String presentazionePersonaggio,String nomeStanza,String attrezzoPosseduto,String pesoAttrezzo) throws FormatoFileNonValidoException {
- String s = "it.uniroma3.diadia.personaggi.";
- try{
- AbstractPersonaggio personaggio = (AbstractPersonaggio) Class.forName(s+tipoPersonaggio).newInstance();
- personaggio.setNome(nomePersonaggio);
- personaggio.setPresentazione(presentazionePersonaggio);
- if(tipoPersonaggio.equals("Mago"))
- fornisciAttrezzo(attrezzoPosseduto, pesoAttrezzo, (Mago)personaggio);
- check(isStanzaValida(nomeStanza),"Personaggio "+ nomePersonaggio+" non collocabile: stanza " +nomeStanza+" inesistente");
- this.nome2stanza.get(nomeStanza).setPersonaggio(personaggio);
- }
- catch(ClassNotFoundException e){
- System.out.println("Classe "+s+tipoPersonaggio+" non trovata");
- e.printStackTrace();
- }
- catch(InstantiationException e){
- System.out.println("Classe "+s+tipoPersonaggio+" non istanziabile o non possiede costruttore no-args");
- e.printStackTrace();
- }
- catch(IllegalAccessException e){
- System.out.println("Classe "+s+tipoPersonaggio+" non istanziabile, costruttore o parametri non visibili");
- e.printStackTrace();
- }
- }
- private void fornisciAttrezzo(String nomeAttrezzo, String pesoAttrezzo, Mago personaggio) throws FormatoFileNonValidoException {
- int peso;
- try {
- peso = Integer.parseInt(pesoAttrezzo);
- Attrezzo attrezzo = new Attrezzo(nomeAttrezzo, peso);
- personaggio.setAttrezzo(attrezzo);
- }
- catch (NumberFormatException e) {
- check(false, "Peso attrezzo "+nomeAttrezzo+" non valido");
- }
- }
- final private void check(boolean condizioneCheDeveEsseraVera, String messaggioErrore) throws FormatoFileNonValidoException {
- if (!condizioneCheDeveEsseraVera)
- throw new FormatoFileNonValidoException("Formato file non valido [" + this.reader.getLineNumber() + "] "+messaggioErrore);
- }
- public Stanza getStanzaIniziale() {
- return this.stanzaIniziale;
- }
- public Stanza getStanzaVincente() {
- return this.stanzaVincente;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement