Advertisement
Guest User

DiaDiaffs

a guest
May 27th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.36 KB | None | 0 0
  1. package it.uniroma3.diadia.io;
  2.  
  3. import it.uniroma3.diadia.ambienti.Stanza;
  4. import it.uniroma3.diadia.attrezzi.Attrezzo;
  5. import it.uniroma3.diadia.personaggi.AbstractPersonaggio;
  6. import it.uniroma3.diadia.personaggi.Mago;
  7.  
  8. import java.io.*;
  9. import java.util.*;
  10.  
  11.  
  12. public class CaricatoreLabirinto {
  13.  
  14. /* prefisso di una singola riga di testo contenente tutti i nomi delle stanze */
  15. private static final String STANZE_MARKER = "Stanze:";
  16.  
  17. /* prefisso di una singola riga contenente il nome della stanza iniziale */
  18. private static final String STANZA_INIZIALE_MARKER = "Inizio:";
  19.  
  20. /* prefisso della riga contenente il nome stanza vincente */
  21. private static final String STANZA_VINCENTE_MARKER = "Vincente:";
  22.  
  23. /* prefisso della riga contenente le specifiche degli attrezzi da collocare nel formato <nomeAttrezzo> <peso> <nomeStanza> */
  24. private static final String ATTREZZI_MARKER = "Attrezzi:";
  25.  
  26. /* prefisso della riga contenente le specifiche dei collegamenti tra stanza nel formato <nomeStanzaDa> <direzione> <nomeStanzaA> */
  27. private static final String USCITE_MARKER = "Uscite:";
  28.  
  29. /* prefisso della riga contenente le specifiche dei personaggi da collocare nel formato <tipoPersonaggio> <nomePersonaggio> <presentazionePersonaggio> <nomeStanza>
  30. * se fosse un Mago il formato dovrebbe essere <tipoPersonaggio> <nomePersonaggio> <presentazionePersonaggio> <nomeStanza> <nomeAttrezzoPosseduto> <pesoAttrezzoPosseduto>
  31. */
  32. private static final String PERSONAGGI_MARKER = "Personaggi:";
  33.  
  34. /*
  35. * Esempio di un possibile file di specifica di un labirinto (vedi POO-26-eccezioni-file.pdf)
  36.  
  37. Stanze: biblioteca, N10, N11
  38. Inizio: N10
  39. Vincente: N11
  40. Attrezzi: martello 10 biblioteca, pinza 2 N10
  41. Uscite: biblioteca nord N10, biblioteca sud N11
  42. Personaggi: Mago Merlino *presentazione* N10 chiave 2, Strega Morgana biblioteca
  43.  
  44.  
  45. */
  46. private LineNumberReader reader;
  47.  
  48. private Map<String, Stanza> nome2stanza;
  49.  
  50. private Stanza stanzaIniziale;
  51. private Stanza stanzaVincente;
  52.  
  53.  
  54. public CaricatoreLabirinto(String nomeFile) throws FileNotFoundException {
  55. this.nome2stanza = new HashMap<String,Stanza>();
  56. this.reader = new LineNumberReader(new FileReader(nomeFile));
  57. }
  58.  
  59. public void carica() throws FormatoFileNonValidoException {
  60. try {
  61. this.leggiECreaStanze();
  62. this.leggiInizialeEvincente();
  63. this.leggiECollocaAttrezzi();
  64. this.leggiEImpostaUscite();
  65. this.leggiEImpostaPersonaggi();
  66. } finally {
  67. try {
  68. reader.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. throw new RuntimeException(e);
  72. }
  73. }
  74.  
  75. }
  76.  
  77. private String leggiRigaCheCominciaPer(String marker) throws FormatoFileNonValidoException {
  78. try {
  79. String riga = this.reader.readLine();
  80. check(riga.startsWith(marker),"era attesa una riga che cominciasse per "+marker);
  81. return riga.substring(marker.length());
  82. } catch (IOException e) {
  83. throw new FormatoFileNonValidoException(e.getMessage());
  84. }
  85. }
  86.  
  87. private void leggiECreaStanze() throws FormatoFileNonValidoException {
  88. String nomiStanze = this.leggiRigaCheCominciaPer(STANZE_MARKER);
  89. for(String nomeStanza : separaStringheAlleVirgole(nomiStanze)) {
  90. Stanza stanza = new Stanza(nomeStanza);
  91. this.nome2stanza.put(nomeStanza, stanza);
  92. }
  93. }
  94.  
  95. private List<String> separaStringheAlleVirgole(String string) {
  96. List<String> result = new LinkedList<>();
  97. Scanner scanner = new Scanner(string);
  98. scanner.useDelimiter(",");
  99. while(scanner.hasNext()){
  100. result.add(scanner.next());
  101. }
  102. scanner.close();
  103. return result;
  104. }
  105.  
  106.  
  107. private void leggiInizialeEvincente() throws FormatoFileNonValidoException {
  108. String nomeStanzaIniziale = null;
  109. nomeStanzaIniziale = this.leggiRigaCheCominciaPer(STANZA_INIZIALE_MARKER);
  110. check(this.isStanzaValida(nomeStanzaIniziale), nomeStanzaIniziale +" non definita");
  111. String nomeStanzaVincente = this.leggiRigaCheCominciaPer(STANZA_VINCENTE_MARKER);
  112. check(this.isStanzaValida(nomeStanzaVincente), nomeStanzaVincente + " non definita");
  113. this.stanzaIniziale = this.nome2stanza.get(nomeStanzaIniziale);
  114. this.stanzaVincente = this.nome2stanza.get(nomeStanzaVincente);
  115. }
  116.  
  117. private void leggiECollocaAttrezzi() throws FormatoFileNonValidoException {
  118. String specificheAttrezzi = this.leggiRigaCheCominciaPer(ATTREZZI_MARKER);
  119.  
  120. for(String specificaAttrezzo : separaStringheAlleVirgole(specificheAttrezzi)) {
  121. String nomeAttrezzo = null;
  122. String pesoAttrezzo = null;
  123. String nomeStanza = null;
  124. try (Scanner scannerLinea = new Scanner(specificaAttrezzo)) {
  125. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome di un attrezzo."));
  126. nomeAttrezzo = scannerLinea.next();
  127. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il peso dell'attrezzo "+nomeAttrezzo+"."));
  128. pesoAttrezzo = scannerLinea.next();
  129. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome della stanza in cui collocare l'attrezzo "+nomeAttrezzo+"."));
  130. nomeStanza = scannerLinea.next();
  131. }
  132. posaAttrezzo(nomeAttrezzo, pesoAttrezzo, nomeStanza);
  133. }
  134. }
  135.  
  136. private void posaAttrezzo(String nomeAttrezzo, String pesoAttrezzo, String nomeStanza) throws FormatoFileNonValidoException {
  137. int peso;
  138. try {
  139. peso = Integer.parseInt(pesoAttrezzo);
  140. Attrezzo attrezzo = new Attrezzo(nomeAttrezzo, peso);
  141. check(isStanzaValida(nomeStanza),"Attrezzo "+ nomeAttrezzo+" non collocabile: stanza " +nomeStanza+" inesistente");
  142. this.nome2stanza.get(nomeStanza).addAttrezzo(attrezzo);
  143. }
  144. catch (NumberFormatException e) {
  145. check(false, "Peso attrezzo "+nomeAttrezzo+" non valido");
  146. }
  147. }
  148.  
  149.  
  150. private boolean isStanzaValida(String nomeStanza) {
  151. return this.nome2stanza.containsKey(nomeStanza);
  152. }
  153.  
  154. private void leggiEImpostaUscite() throws FormatoFileNonValidoException {
  155. String specificheUscite = this.leggiRigaCheCominciaPer(USCITE_MARKER);
  156. for(String specificaStanze : separaStringheAlleVirgole(specificheUscite)) {
  157. String stanzaPartenza = null;
  158. String dir = null;
  159. String stanzaDestinazione = null;
  160. try (Scanner scannerDiLinea = new Scanner(specificaStanze)){
  161. while (scannerDiLinea.hasNext()) {
  162. check(scannerDiLinea.hasNext(),msgTerminazionePrecoce("le uscite di una stanza."));
  163. stanzaPartenza = scannerDiLinea.next();
  164. check(scannerDiLinea.hasNext(),msgTerminazionePrecoce("la direzione di una uscita della stanza "+stanzaPartenza));
  165. dir = scannerDiLinea.next();
  166. check(scannerDiLinea.hasNext(),msgTerminazionePrecoce("la destinazione di una uscita della stanza "+stanzaPartenza+" nella direzione "+dir));
  167. stanzaDestinazione = scannerDiLinea.next();
  168.  
  169. impostaUscita(stanzaPartenza, dir, stanzaDestinazione);
  170. }
  171. }
  172. }
  173. }
  174.  
  175. private String msgTerminazionePrecoce(String msg) {
  176. return "Terminazione precoce del file prima di leggere "+msg;
  177. }
  178.  
  179. private void impostaUscita(String stanzaDa, String dir, String nomeA) throws FormatoFileNonValidoException {
  180. check(isStanzaValida(stanzaDa),"Stanza di partenza sconosciuta "+dir);
  181. check(isStanzaValida(nomeA),"Stanza di destinazione sconosciuta "+ dir);
  182. Stanza partenzaDa = this.nome2stanza.get(stanzaDa);
  183. Stanza arrivoA = this.nome2stanza.get(nomeA);
  184. //Imposta direzione diretta
  185. partenzaDa.impostaStanzaAdiacente(dir, arrivoA);
  186. //Imposta direzione inversa
  187. if(dir.equals("est"))
  188. arrivoA.impostaStanzaAdiacente("ovest",partenzaDa);
  189. if(dir.equals("ovest"))
  190. arrivoA.impostaStanzaAdiacente("est",partenzaDa);
  191. if(dir.equals("nord"))
  192. arrivoA.impostaStanzaAdiacente("sud",partenzaDa);
  193. if(dir.equals("sud"))
  194. arrivoA.impostaStanzaAdiacente("nord",partenzaDa);
  195.  
  196. }
  197.  
  198. private void leggiEImpostaPersonaggi() throws FormatoFileNonValidoException{
  199. String specifichePersonaggi = this.leggiRigaCheCominciaPer(PERSONAGGI_MARKER);
  200.  
  201. for(String specificaPersonaggio : separaStringheAlleVirgole(specifichePersonaggi)) {
  202. String tipoPersonaggio = null;
  203. String nomePersonaggio = null;
  204. String presentazionePersonaggio = null;
  205. String nomeStanza = null;
  206. String attrezzoPosseduto=null;
  207. String pesoAttrezzo=null;
  208. try (Scanner scannerLinea = new Scanner(specificaPersonaggio)) {
  209. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il tipo di un personaggio."));
  210. tipoPersonaggio = scannerLinea.next();
  211. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome di un personaggio."));
  212. nomePersonaggio = scannerLinea.next();
  213. check(scannerLinea.hasNext(),msgTerminazionePrecoce("la presentazione del personaggio "+nomePersonaggio+"."));
  214. presentazionePersonaggio = scannerLinea.next();
  215. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome della stanza in cui collocare il personaggio "+nomePersonaggio+"."));
  216. nomeStanza = scannerLinea.next();
  217. if(tipoPersonaggio.equals("Mago")){
  218. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il nome dell'attrezzo posseduto dal personaggio "+nomePersonaggio+"."));
  219. attrezzoPosseduto = scannerLinea.next();
  220. check(scannerLinea.hasNext(),msgTerminazionePrecoce("il peso dell'attrezzo "+attrezzoPosseduto+"."));
  221. pesoAttrezzo = scannerLinea.next();
  222. }
  223. }
  224. aggiungiPersonaggio(tipoPersonaggio, nomePersonaggio, presentazionePersonaggio, nomeStanza, attrezzoPosseduto,pesoAttrezzo);
  225. }
  226. }
  227.  
  228.  
  229. private void aggiungiPersonaggio(String tipoPersonaggio,String nomePersonaggio, String presentazionePersonaggio,String nomeStanza,String attrezzoPosseduto,String pesoAttrezzo) throws FormatoFileNonValidoException {
  230. String s = "it.uniroma3.diadia.personaggi.";
  231. try{
  232. AbstractPersonaggio personaggio = (AbstractPersonaggio) Class.forName(s+tipoPersonaggio).newInstance();
  233. personaggio.setNome(nomePersonaggio);
  234. personaggio.setPresentazione(presentazionePersonaggio);
  235. if(tipoPersonaggio.equals("Mago"))
  236. fornisciAttrezzo(attrezzoPosseduto, pesoAttrezzo, (Mago)personaggio);
  237. check(isStanzaValida(nomeStanza),"Personaggio "+ nomePersonaggio+" non collocabile: stanza " +nomeStanza+" inesistente");
  238. this.nome2stanza.get(nomeStanza).setPersonaggio(personaggio);
  239. }
  240. catch(ClassNotFoundException e){
  241. System.out.println("Classe "+s+tipoPersonaggio+" non trovata");
  242. e.printStackTrace();
  243. }
  244. catch(InstantiationException e){
  245. System.out.println("Classe "+s+tipoPersonaggio+" non istanziabile o non possiede costruttore no-args");
  246. e.printStackTrace();
  247. }
  248. catch(IllegalAccessException e){
  249. System.out.println("Classe "+s+tipoPersonaggio+" non istanziabile, costruttore o parametri non visibili");
  250. e.printStackTrace();
  251. }
  252.  
  253.  
  254. }
  255.  
  256. private void fornisciAttrezzo(String nomeAttrezzo, String pesoAttrezzo, Mago personaggio) throws FormatoFileNonValidoException {
  257. int peso;
  258. try {
  259. peso = Integer.parseInt(pesoAttrezzo);
  260. Attrezzo attrezzo = new Attrezzo(nomeAttrezzo, peso);
  261. personaggio.setAttrezzo(attrezzo);
  262. }
  263. catch (NumberFormatException e) {
  264. check(false, "Peso attrezzo "+nomeAttrezzo+" non valido");
  265. }
  266. }
  267.  
  268. final private void check(boolean condizioneCheDeveEsseraVera, String messaggioErrore) throws FormatoFileNonValidoException {
  269. if (!condizioneCheDeveEsseraVera)
  270. throw new FormatoFileNonValidoException("Formato file non valido [" + this.reader.getLineNumber() + "] "+messaggioErrore);
  271. }
  272.  
  273. public Stanza getStanzaIniziale() {
  274. return this.stanzaIniziale;
  275. }
  276.  
  277. public Stanza getStanzaVincente() {
  278. return this.stanzaVincente;
  279. }
  280.  
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement