diff --git a/.idea/libraries/kibofplib_1_0.xml b/.idea/libraries/kibofplib_1_0.xml new file mode 100644 index 0000000..8aca0d5 --- /dev/null +++ b/.idea/libraries/kibofplib_1_0.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 4fe24a1..45b76e1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/PatenteELibbrettoPregoh.iml b/PatenteELibbrettoPregoh.iml index c90834f..e98415d 100644 --- a/PatenteELibbrettoPregoh.iml +++ b/PatenteELibbrettoPregoh.iml @@ -7,5 +7,6 @@ + \ No newline at end of file diff --git a/lib/kibofplib-1.0.jar b/lib/kibofplib-1.0.jar new file mode 100644 index 0000000..8929bd5 Binary files /dev/null and b/lib/kibofplib-1.0.jar differ diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/GameData.java b/src/it/unibs/fp/patenteelibbrettopregoh/GameData.java new file mode 100644 index 0000000..597a7d2 --- /dev/null +++ b/src/it/unibs/fp/patenteelibbrettopregoh/GameData.java @@ -0,0 +1,127 @@ +package it.unibs.fp.patenteelibbrettopregoh; + +import java.time.LocalDate; +import java.util.ArrayList; + +public class GameData { + private final String nomePersonaggio; + private final ArrayList diario; + private final Comuni comuni; + private final ArrayList persone; + private double saldo; + private int numeroMazzetteAccettatePolizia; + private int numeroRivoluzionariAccettati; + private StatoGioco statoGioco; + private int giorno; + private int indiceUltimaPersonaPassata; + private LocalDate data; + + public GameData(Formato formato) { + this.diario = new ArrayList<>(); + this.comuni = Parser.parseComuni(formato, "FileEsercizio/comuni"); + this.persone = Parser.parsePersone(formato, "FileEsercizio/IDpersone"); + this.saldo = 0; + this.numeroMazzetteAccettatePolizia = 0; + this.numeroRivoluzionariAccettati = 0; + this.statoGioco = StatoGioco.IN_CORSO; + this.nomePersonaggio = "Ajeje Brazorf"; + this.giorno = 1; + this.indiceUltimaPersonaPassata = -1; + this.data = LocalDate.of(2024, 5, giorno); + } + + public ArrayList getDiario() { + return diario; + } + + public Comuni getComuni() { + return comuni; + } + + public ArrayList getPersone() { + return persone; + } + + public double getSaldo() { + return saldo; + } + + public Persona getPersonaDaControlare() { + indiceUltimaPersonaPassata++; + return persone.get(indiceUltimaPersonaPassata); + + } + + public int getNumeroMazzetteAccettatePolizia() { + return numeroMazzetteAccettatePolizia; + } + + public int getNumeroRivoluzionariAccettati() { + return numeroRivoluzionariAccettati; + } + + public void addPaginaDiario(PaginaDiario pagina) { + diario.add(pagina); + } + + public void addSaldo(double valore) { + saldo += valore; + } + + public void pagaMulta(double valore) { + paga(valore); + } + + public void incrementaMazzetteAccettatePolizia() { + numeroMazzetteAccettatePolizia++; + if (numeroMazzetteAccettatePolizia >= 2) { + statoGioco = StatoGioco.GIUSTIZIATO; + } + } + + public void incrementaRivoluzionariAccettati() { + numeroRivoluzionariAccettati++; + if (numeroRivoluzionariAccettati >= 5) { + statoGioco = StatoGioco.RIVOLUZIONE; + } + } + + public String getNomePersonaggio() { + return nomePersonaggio; + } + + public StatoGioco getStatoGioco() { + return statoGioco; + } + + public int getGiorno() { + return giorno; + } + public void incrementaGiorno(int numeroPersoneControllate) { + if (numeroPersoneControllate > 0) { + addSaldo(50 * numeroPersoneControllate); + } + paga(200); + + giorno++; + + data = LocalDate.of(2024, 5, giorno); + + if (giorno > 12 && statoGioco == StatoGioco.IN_CORSO && saldo > 2300) { + statoGioco = StatoGioco.DODICESIMO_GIORNO; + } else if (giorno > 12 && statoGioco == StatoGioco.IN_CORSO) { + statoGioco = StatoGioco.NON_ABBASTANZA_SOLDI; + } + } + + private void paga(double valore) { + saldo -= valore; + if (saldo < 0) { + statoGioco = StatoGioco.ARRESTATO; + } + } + + public LocalDate getData() { + return data; + } +} diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/PaginaDiario.java b/src/it/unibs/fp/patenteelibbrettopregoh/PaginaDiario.java new file mode 100644 index 0000000..18c725f --- /dev/null +++ b/src/it/unibs/fp/patenteelibbrettopregoh/PaginaDiario.java @@ -0,0 +1,36 @@ +package it.unibs.fp.patenteelibbrettopregoh; + +import java.util.ArrayList; + +public class PaginaDiario { + private final String data; + private final double bilancio; + private final ArrayList personeControllate; + + public PaginaDiario(String data, double bilancio) { + this.data = data; + this.bilancio = bilancio; + this.personeControllate = new ArrayList<>(); + } + + public String getData() { + return data; + } + + public double getBilancio() { + return bilancio; + } + + public ArrayList getPersoneControllate() { + return personeControllate; + } + + public void addPersonaControllata(PersonaControllata persona) { + this.personeControllate.add(persona); + } + + public void removePersonaControllata(PersonaControllata persona) { + this.personeControllate.remove(persona); + } + +} diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/Parser.java b/src/it/unibs/fp/patenteelibbrettopregoh/Parser.java index ff072ef..43259a2 100644 --- a/src/it/unibs/fp/patenteelibbrettopregoh/Parser.java +++ b/src/it/unibs/fp/patenteelibbrettopregoh/Parser.java @@ -7,15 +7,70 @@ import java.util.ArrayList; public class Parser { public static ArrayList parsePersone(Formato formato, String fileName) { ArrayList persone = new ArrayList<>(); - // Implement parsing logic here based on the format - // For example, if formato is JSON, use a JSON library to parse the file - // and populate the persone list. + if (formato == Formato.XML) { + fileName = fileName + ".xml"; + XMLInputFactory xmlif; + XMLStreamReader xmlr; + String currentElement = null; + String nome = null; + String cognome = null; + String sesso = null; + String dataNascita = null; + String comuneNascita = null; + String codiceFiscale = null; + String scadenzaDocumento = null; + + try (FileInputStream reader = new FileInputStream(fileName)) { + xmlif = XMLInputFactory.newInstance(); + xmlr = xmlif.createXMLStreamReader(fileName, reader); + + while (xmlr.hasNext()) { + int event = xmlr.getEventType(); + switch (event) { + case XMLStreamConstants.START_ELEMENT: + currentElement = xmlr.getLocalName(); // <- sposta qui, nel posto giusto + break; + case XMLStreamConstants.CHARACTERS: + String text = xmlr.getText().trim(); + if (!text.isEmpty() && currentElement != null) { + switch (currentElement) { + case "nome" -> nome = text; + case "cognome" -> cognome = text; + case "sesso" -> sesso = text; + case "data_nascita" -> dataNascita = text; + case "comune_nascita" -> comuneNascita = text; + case "codice_fiscale" -> codiceFiscale = text; + case "scadenza_documento" -> scadenzaDocumento = text; + } + } + break; + case XMLStreamConstants.END_ELEMENT: + String endTag = xmlr.getLocalName(); + if (endTag.equals("persona")) { + Persona persona = new Persona(nome, cognome, sesso, dataNascita, comuneNascita, codiceFiscale, scadenzaDocumento); + persone.add(persona); + } + currentElement = null; // reset solo alla fine di un elemento + break; + } + xmlr.next(); // importante: avanza solo una volta per ciclo + } + xmlr.close(); + } catch (FactoryConfigurationError | XMLStreamException | IOException e) { + System.out.println("Error reading the file: " + e.getMessage()); + } + + } + else { + fileName = fileName + ".json"; + } return persone; } public static Comuni parseComuni(Formato formato, String fileName) { Comuni comuni = new Comuni(); if (formato == Formato.XML) { + fileName = fileName + ".xml"; XMLInputFactory xmlif; XMLStreamReader xmlr; String currentElement = null; @@ -67,11 +122,15 @@ public class Parser { } catch (FactoryConfigurationError | XMLStreamException | IOException e) { System.out.println("Error reading the file: " + e.getMessage()); } - - } else if (formato == Formato.JSON) { - // Implement XML parsing logic here - // For example, use an XML library to read the file and populate the comuni list + } + else { + fileName = fileName + ".json"; } return comuni; } + + public static void saveDiario (String fileName, ArrayList pagineDiario, Formato formato) { + // non so ancora come fare + return; + } } diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/PatenteELibbrettoPregohMain.java b/src/it/unibs/fp/patenteelibbrettopregoh/PatenteELibbrettoPregohMain.java index 4a922b3..a0c3471 100644 --- a/src/it/unibs/fp/patenteelibbrettopregoh/PatenteELibbrettoPregohMain.java +++ b/src/it/unibs/fp/patenteelibbrettopregoh/PatenteELibbrettoPregohMain.java @@ -1,14 +1,113 @@ package it.unibs.fp.patenteelibbrettopregoh; +import it.kibo.fp.lib.InputData; + import java.util.ArrayList; public class PatenteELibbrettoPregohMain { public static void main(String[] args) { System.out.println("PatenteELibbrettoPregoh!"); + Formato formato = getFormato(); + System.out.println(); + GameData gameData = new GameData(formato); - Comuni comuni = Parser.parseComuni(Formato.XML, "FileEsercizio/comuni.xml"); - //ArrayList persone = Parser.parsePersone(Formato.JSON, "persone.txt"); - Persona p = new Persona("Mario", "Rossi", "M", "1980-01-01", "Roma", "", "2005-01-15"); - System.out.println(p.calcolaCodiceFiscale(comuni)); + while (gameData.getStatoGioco() == StatoGioco.IN_CORSO) { + int personeChePassano = ((int)(Math.random() * 5) + 3); + System.out.println("Il giorno " + gameData.getData() + " passeranno " + personeChePassano + " persone"); + ArrayList personeControllate = new ArrayList<>(); + for (int i = 0; i < personeChePassano; i++) { + if (gameData.getStatoGioco() == StatoGioco.IN_CORSO) { + Persona personaDaControllare = gameData.getPersonaDaControlare(); + boolean esito = controllaPersona(personaDaControllare, gameData.getComuni(), gameData); + boolean accettata = InputData.readYesOrNo("Si presenta\n" + personaDaControllare + "\nC.F. calcolato: " + personaDaControllare.calcolaCodiceFiscale(gameData.getComuni()) + "\nAccettare"); + if (accettata) { + if (esito){ + System.out.println("La persona aveva i dati corretti"); + PersonaControllata personaControllata = new PersonaControllata(personaDaControllare, true, TipoPersonaControllata.PERSONA_NORMALE); + personeControllate.add(personaControllata); + } else { + System.out.println("La persona aveva i dati errati"); + PersonaControllata personaControllata = new PersonaControllata(personaDaControllare, true, TipoPersonaControllata.PERSONA_NORMALE); + personeControllate.add(personaControllata); + if (Math.random() < 0.5){ + System.out.println("Sei stato fortunato, non hai presso la multa"); + } else { + System.out.println("Hai preso una multa da 300§"); + gameData.pagaMulta(300); + } + } + } else { + if (esito) { + System.out.println("La persona aveva i dati corretti ... come sei salato"); + PersonaControllata personaControllata = new PersonaControllata(personaDaControllare, false, TipoPersonaControllata.PERSONA_NORMALE); + personeControllate.add(personaControllata); + if (Math.random() < 0.5){ + System.out.println("Sei stato fortunato, non hai presso la multa"); + } else { + System.out.println("Hai preso una multa da 150§"); + gameData.pagaMulta(150); + } + } else { + System.out.println("La persona aveva i dati errati"); + PersonaControllata personaControllata; + + if (Math.random() < 0.4){ + int mazzetta = ((int)((Math.random() * 251))) + 250; + System.out.println(personaDaControllare.getNome() + " " + personaDaControllare.getCognome() + " prova a corromperti con " + mazzetta + "§"); + boolean accettataMazzetta = InputData.readYesOrNo("Accettare la mazzetta"); + if (accettataMazzetta){ + gameData.addSaldo(mazzetta); + if (Math.random() < 0.7){ + System.out.println("Hai accettato la mazzetta, ti è andata bene ... era un rivoluzionario"); + gameData.incrementaRivoluzionariAccettati(); + personaControllata = new PersonaControllata(personaDaControllare, true, TipoPersonaControllata.RIVOLUZIONARIO); + } else { + System.out.println("Hai accettato la mazzetta ... era un poliziotto"); + gameData.incrementaMazzetteAccettatePolizia(); + gameData.pagaMulta(gameData.getSaldo() * 0.6); + personaControllata = new PersonaControllata(personaDaControllare, true, TipoPersonaControllata.POLIZIOTTO); + } + } else { + personaControllata = new PersonaControllata(personaDaControllare, false, TipoPersonaControllata.PERSONA_NORMALE); + } + } else { + personaControllata = new PersonaControllata(personaDaControllare, false, TipoPersonaControllata.PERSONA_NORMALE); + } + personeControllate.add(personaControllata); + } + } + } + } + + gameData.incrementaGiorno(personeControllate.size()); + } + + switch (gameData.getStatoGioco()){ + case ARRESTATO -> System.out.println("Sei stato arrestato"); + case GIUSTIZIATO -> System.out.println("Sei stato giustiziato"); + case RIVOLUZIONE -> System.out.println("Hai vinto la rivoluzione"); + case DODICESIMO_GIORNO -> System.out.println("Hai vinto, sei sopravvissuto 12 giorni"); + case NON_ABBASTANZA_SOLDI -> System.out.println("Non hai abbastanza soldi"); + default -> System.out.println("Hai perso"); + } + + } + + private static boolean controllaPersona(Persona persona, Comuni comuni, GameData gameData) { + return persona.isCodiceFiscaleValido(comuni) && persona.isDocumentoValido(gameData.getData()); + } + + private static Formato getFormato() { + Formato formato = null; + + int sceltaFormato = InputData.readIntegerBetween("Inserisci il formato (0: JSON, 1: XML): ", 0, 1); + if (sceltaFormato == 0) { + System.out.println("Hai scelto il formato JSON"); + formato = Formato.JSON; + } else { + System.out.println("Hai scelto il formato XML"); + formato = Formato.XML; + } + return formato; } } diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/Persona.java b/src/it/unibs/fp/patenteelibbrettopregoh/Persona.java index 17cb189..f2014ed 100644 --- a/src/it/unibs/fp/patenteelibbrettopregoh/Persona.java +++ b/src/it/unibs/fp/patenteelibbrettopregoh/Persona.java @@ -1,6 +1,10 @@ package it.unibs.fp.patenteelibbrettopregoh; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; public class Persona { private final String nome; @@ -208,11 +212,9 @@ public class Persona { }; } - - - public boolean isScadenzaDocumentoValido(){ - // Implement logic to validate the expiration date of the document - return false; + public boolean isDocumentoValido(LocalDate date) { + LocalDate scadenza = LocalDate.parse(scadenzaDocumento); + return date.isBefore(scadenza) || date.isEqual(scadenza); } private static boolean isVocale(char c) { @@ -241,4 +243,9 @@ public class Persona { } return ret; } + + @Override + public String toString() { + return nome + " " + cognome + " (" + sesso + ") nato il " + dataNascita + " a " + comuneNascita + " con C.F. " + codiceFiscale + ", validità documento " + scadenzaDocumento; + } } diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/PersonaControllata.java b/src/it/unibs/fp/patenteelibbrettopregoh/PersonaControllata.java new file mode 100644 index 0000000..4b20626 --- /dev/null +++ b/src/it/unibs/fp/patenteelibbrettopregoh/PersonaControllata.java @@ -0,0 +1,33 @@ +package it.unibs.fp.patenteelibbrettopregoh; + +public class PersonaControllata extends Persona { + private final boolean esitoControllo; + private final TipoPersonaControllata tipoPersonaControllata; + + public PersonaControllata(Persona persona, boolean esitoControllo, TipoPersonaControllata tipoPersonaControllata) { + super(persona.getNome(), persona.getCognome(), persona.getSesso(), persona.getDataNascita(), persona.getComuneNascita(), persona.getCodiceFiscale(), persona.getScadenzaDocumento()); + this.esitoControllo = esitoControllo; + this.tipoPersonaControllata = tipoPersonaControllata; + } + + public boolean isEsitoControllo() { + return esitoControllo; + } + + public TipoPersonaControllata getTipoPersonaControllata() { + return tipoPersonaControllata; + } + + @Override + public String toString() { + return "Nome: " + getNome() + "\n" + + "Cognome: " + getCognome() + "\n" + + "Sesso: " + getSesso() + "\n" + + "Data di Nascita: " + getDataNascita() + "\n" + + "Comune di Nascita: " + getComuneNascita() + "\n" + + "Codice Fiscale: " + getCodiceFiscale() + "\n" + + "Scadenza Documento: " + getScadenzaDocumento() + "\n" + + "Esito Controllo: " + (esitoControllo ? "Positivo" : "Negativo") + "\n" + + "Tipo Persona Controllata: " + tipoPersonaControllata.toString() + "\n"; + } +} diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/StatoGioco.java b/src/it/unibs/fp/patenteelibbrettopregoh/StatoGioco.java new file mode 100644 index 0000000..0efeeef --- /dev/null +++ b/src/it/unibs/fp/patenteelibbrettopregoh/StatoGioco.java @@ -0,0 +1,5 @@ +package it.unibs.fp.patenteelibbrettopregoh; + +public enum StatoGioco { + ARRESTATO, GIUSTIZIATO, RIVOLUZIONE, DODICESIMO_GIORNO, NON_ABBASTANZA_SOLDI, IN_CORSO; +} diff --git a/src/it/unibs/fp/patenteelibbrettopregoh/TipoPersonaControllata.java b/src/it/unibs/fp/patenteelibbrettopregoh/TipoPersonaControllata.java new file mode 100644 index 0000000..ed4e3ea --- /dev/null +++ b/src/it/unibs/fp/patenteelibbrettopregoh/TipoPersonaControllata.java @@ -0,0 +1,5 @@ +package it.unibs.fp.patenteelibbrettopregoh; + +public enum TipoPersonaControllata { + RIVOLUZIONARIO, POLIZIOTTO, PERSONA_NORMALE; +}