Compare commits

..

No commits in common. "master" and "main" have entirely different histories.
master ... main

29 changed files with 2 additions and 84683 deletions

23
.gitignore vendored
View file

@ -1,23 +0,0 @@
# IntelliJ
.idea/
*.iml
out/
# Eclipse
.classpath
.project
.settings/
bin/
# NetBeans
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
# VS Code
.vscode/
# macOS
.DS_Store

8
.idea/.gitignore generated vendored
View file

@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View file

@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="google.code.gson" type="repository">
<properties maven-id="com.google.code.gson:gson:2.10.1" />
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/gson-2.10.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View file

@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="kibofplib-1.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/kibofplib-1.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

6
.idea/misc.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_19" default="true" project-jdk-name="corretto-19" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated
View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/PatenteELibbrettoPregoh.iml" filepath="$PROJECT_DIR$/PatenteELibbrettoPregoh.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

212
.idea/workspace.xml generated
View file

@ -1,212 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="af162031-d7bc-4a6c-bf85-8552ba253018" name="Changes" comment="Save diary" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
<option value="Enum" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="2viDAWzJ9gaEHvUFcho7UWwFSvI" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Application.PatenteELibbrettoPregohMain.executor&quot;: &quot;Run&quot;,
&quot;Downloaded.Files.Path.Enabled&quot;: &quot;true&quot;,
&quot;Repository.Attach.Annotations&quot;: &quot;false&quot;,
&quot;Repository.Attach.JavaDocs&quot;: &quot;false&quot;,
&quot;Repository.Attach.Sources&quot;: &quot;false&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;master&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;/Users/leonardo-orizio/Desktop/Scuola/UniBs/PrimoAnno/Fondamenti di info/ProgettoArnaldo/PatenteELibbrettoPregoh&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;project.structure.last.edited&quot;: &quot;Project&quot;,
&quot;project.structure.proportion&quot;: &quot;0.15&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="RecentsManager">
<key name="CreateClassDialog.RecentsKey">
<recent name="it.unibs.fp.patenteelibbrettopregoh" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/lib" />
</key>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-9823dce3aa75-fbdcb00ec9e3-intellij.indexing.shared.core-IU-251.23774.435" />
<option value="bundled-js-predefined-d6986cc7102b-f27c65a3e318-JavaScript-IU-251.23774.435" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="af162031-d7bc-4a6c-bf85-8552ba253018" name="Changes" comment="" />
<created>1744618859254</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1744618859254</updated>
<workItem from="1744618862239" duration="6795000" />
<workItem from="1744796155390" duration="10205000" />
<workItem from="1744899816172" duration="2720000" />
<workItem from="1745060286799" duration="3585000" />
<workItem from="1746090394771" duration="7577000" />
<workItem from="1746098459756" duration="164000" />
<workItem from="1746099005276" duration="376000" />
<workItem from="1746099462736" duration="181000" />
</task>
<task id="LOCAL-00001" summary="First commit">
<option name="closed" value="true" />
<created>1744619010467</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1744619010467</updated>
</task>
<task id="LOCAL-00002" summary="First classes and C.F.">
<option name="closed" value="true" />
<created>1744625521049</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1744625521049</updated>
</task>
<task id="LOCAL-00003" summary="Game logic">
<option name="closed" value="true" />
<created>1744806827798</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1744806827798</updated>
</task>
<task id="LOCAL-00004" summary="Diary implementation, refactoring">
<option name="closed" value="true" />
<created>1745064335338</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1745064335338</updated>
</task>
<task id="LOCAL-00005" summary="Parsing in JSON, Javadoc">
<option name="closed" value="true" />
<created>1746096671150</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1746096671150</updated>
</task>
<task id="LOCAL-00006" summary="Build">
<option name="closed" value="true" />
<created>1746097962786</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1746097962786</updated>
</task>
<task id="LOCAL-00007" summary="Build fix">
<option name="closed" value="true" />
<created>1746098566296</created>
<option name="number" value="00007" />
<option name="presentableId" value="LOCAL-00007" />
<option name="project" value="LOCAL" />
<updated>1746098566296</updated>
</task>
<task id="LOCAL-00008" summary="Bug fix">
<option name="closed" value="true" />
<created>1746099310889</created>
<option name="number" value="00008" />
<option name="presentableId" value="LOCAL-00008" />
<option name="project" value="LOCAL" />
<updated>1746099310889</updated>
</task>
<task id="LOCAL-00009" summary="Save diary">
<option name="closed" value="true" />
<created>1746099535428</created>
<option name="number" value="00009" />
<option name="presentableId" value="LOCAL-00009" />
<option name="project" value="LOCAL" />
<updated>1746099535428</updated>
</task>
<option name="localTasksCounter" value="10" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="RECENT_FILTERS">
<map>
<entry key="Branch">
<value>
<list>
<RecentGroup>
<option name="FILTER_VALUES">
<option value="origin/master" />
</option>
</RecentGroup>
<RecentGroup>
<option name="FILTER_VALUES">
<option value="master" />
</option>
</RecentGroup>
</list>
</value>
</entry>
</map>
</option>
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="First commit" />
<MESSAGE value="First classes and C.F." />
<MESSAGE value="Game logic" />
<MESSAGE value="Diary implementation, refactoring" />
<MESSAGE value="Parsing in JSON, Javadoc" />
<MESSAGE value="Build" />
<MESSAGE value="Build fix" />
<MESSAGE value="Bug fix" />
<MESSAGE value="Save diary" />
<option name="LAST_COMMIT_MESSAGE" value="Save diary" />
</component>
</project>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="kibofplib-1.0" level="project" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/Downloads/gson-2.10.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="google.code.gson" level="project" />
</component>
</module>

2
README.md Normal file
View file

@ -0,0 +1,2 @@
# PatenteELibbrettoPregoh

Binary file not shown.

Binary file not shown.

View file

@ -1,51 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
/**
* Classe che rappresenta un comune con nome e codice.
*/
public class Comune {
private final String nome;
private final String codice;
/**
* Costruttore della classe Comune.
*
* @param nome il nome del comune
* @param codice il codice del comune
*/
public Comune(String nome, String codice) {
this.nome = nome;
this.codice = codice;
}
/**
* Restituisce il nome del comune.
*
* @return il nome del comune
*/
public String getNome() {
return nome;
}
/**
* Restituisce il codice del comune.
*
* @return il codice del comune
*/
public String getCodice() {
return codice;
}
/**
* Restituisce una rappresentazione testuale del comune.
*
* @return una stringa che rappresenta il comune
*/
@Override
public String toString() {
return "Comune{" +
"nome='" + nome + '\'' +
", codice='" + codice + '\'' +
'}';
}
}

View file

@ -1,61 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import java.util.ArrayList;
/**
* Classe che rappresenta una lista di comuni.
*/
public class Comuni {
private final ArrayList<Comune> comuni;
/**
* Costruttore della classe Comuni.
* Inizializza la lista di comuni.
*/
public Comuni() {
this.comuni = new ArrayList<>();
}
/**
* Aggiunge un comune alla lista.
*
* @param comune il comune da aggiungere
*/
public void addComune(Comune comune) {
this.comuni.add(comune);
}
/**
* Rimuove un comune dalla lista.
*
* @param comune il comune da rimuovere
*/
public void removeComune(Comune comune) {
this.comuni.remove(comune);
}
/**
* Restituisce la lista di comuni.
*
* @return la lista di comuni
*/
public ArrayList<Comune> getComuni() {
return comuni;
}
/**
* Restituisce il codice del comune dato il nome.
*
* @param nomeComune il nome del comune
* @return il codice del comune, oppure null se non trovato
*/
public String getCodiceComune(String nomeComune) {
for (Comune comune : comuni) {
if (comune.getNome().equalsIgnoreCase(nomeComune)) {
return comune.getCodice();
}
}
return null; // Comune non trovato
}
}

View file

@ -1,5 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
public enum Formato {
JSON, XML;
}

View file

@ -1,230 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import java.time.LocalDate;
import java.util.ArrayList;
/**
* GameData.java
* questa classe rappresenta i dati di gioco, come il formato, il nome del personaggio,
* il diario, le persone, il saldo, il numero di mazzette accettate dalla polizia,
* il numero di rivoluzionari accettati, lo stato del gioco e la data.
*
*/
public class GameData {
private final Formato formato;
private final String nomePersonaggio;
private final ArrayList<PaginaDiario> diario;
private final Comuni comuni;
private final ArrayList<Persona> persone;
private double saldo;
private int numeroMazzetteAccettatePolizia;
private int numeroRivoluzionariAccettati;
private StatoGioco statoGioco;
private int giorno;
private LocalDate data;
/**
* costruttore della classe GameData.
* Inizializza i dati di gioco con il formato specificato.
*
* @param formato il formato del gioco
*/
public GameData(Formato formato) {
this.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.data = LocalDate.of(2024, 4, 26);
}
/**
* getter per il diario.
*
*/
public ArrayList<PaginaDiario> getDiario() {
return diario;
}
/**
* getter per i comuni.
*
* @return i comuni
*/
public Comuni getComuni() {
return comuni;
}
/**
* getter per le persone.
*
* @return le persone
*/
public ArrayList<Persona> getPersone() {
return persone;
}
/**
* getter per il saldo.
*
* @return il saldo
*/
public double getSaldo() {
return saldo;
}
/**
* getter di una persona casuale da controllare.
*
* @return la persona casuale da controllare
*/
public Persona getPersonaDaControlare() {
return persone.get((int) (Math.random() * (persone.size() + 1)));
}
/**
* getter per il numero di mazzette accettate dalla polizia.
*
* @return il numero di mazzette accettate dalla polizia
*/
public int getNumeroMazzetteAccettatePolizia() {
return numeroMazzetteAccettatePolizia;
}
/**
* getter per il numero di rivoluzionari accettati.
*
* @return il numero di rivoluzionari accettati
*/
public int getNumeroRivoluzionariAccettati() {
return numeroRivoluzionariAccettati;
}
/**
* aggiunge una pagina al diario.
*/
public void addPaginaDiario(PaginaDiario pagina) {
diario.add(pagina);
}
/**
* incrementa il saldo di un valore specificato.
*/
public void addSaldo(double valore) {
saldo += valore;
}
/**
* paga una multa di un valore specificato.
*/
public void pagaMulta(double valore) {
paga(valore);
}
/**
* aumenta il numero di mazzette accettate dalla polizia.
*/
public void incrementaMazzetteAccettatePolizia() {
numeroMazzetteAccettatePolizia++;
if (numeroMazzetteAccettatePolizia >= 2) {
statoGioco = StatoGioco.GIUSTIZIATO;
}
}
/**
* aumenta il numero di rivoluzionari accettati.
*/
public void incrementaRivoluzionariAccettati() {
numeroRivoluzionariAccettati++;
if (numeroRivoluzionariAccettati >= 5) {
statoGioco = StatoGioco.RIVOLUZIONE;
}
}
/**
* getter per il nome del personaggio.
*
* @return il nome del personaggio
*/
public String getNomePersonaggio() {
return nomePersonaggio;
}
/**
* getter per lo stato del gioco.
*
* @return lo stato del gioco
*/
public StatoGioco getStatoGioco() {
return statoGioco;
}
/**
* getter per il giorno corrente del gioco.
*
* @return il giorno corrente del gioco
*/
public int getGiorno() {
return giorno;
}
/**
* aumenta il giorno corrente e aggiorna il saldo.
*
* @param personeControllate la lista delle persone controllate
*/
public void incrementaGiorno(ArrayList<PersonaControllata> personeControllate) {
if (!personeControllate.isEmpty()) {
addSaldo(50 * personeControllate.size());
}
paga(200);
PaginaDiario pagina = new PaginaDiario(String.format("%d-%02d-%02d", data.getYear(), data.getMonthValue(), data.getDayOfMonth()), saldo);
for (PersonaControllata persona : personeControllate) {
pagina.addPersonaControllata(persona);
}
diario.add(pagina);
giorno++;
data = LocalDate.of(data.getYear(), data.getMonthValue(), data.getDayOfMonth() + 1);
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;
}
}
/**
* fa pagare un valore specificato al saldo.
*/
private void paga(double valore) {
saldo -= valore;
if (saldo < 0) {
statoGioco = StatoGioco.ARRESTATO;
}
}
/**
* getter per la data del gioco.
*
* @return la data del gioco
*/
public LocalDate getData() {
return data;
}
/**
* salva il diario in un file.
*
*/
public void saveDiario() {
Parser.saveDiario("FileEsercizio/diario", diario, formato);
}
}

View file

@ -1,84 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import com.google.gson.annotations.SerializedName;
// import java.time.LocalDate;
import java.util.ArrayList;
/**
* La classe PaginaDiario rappresenta una pagina del diario di un personaggio.
* Ogni pagina contiene la data, il bilancio e una lista di persone controllate.
*/
public class PaginaDiario {
private final String data; // per nevitare problemi con Gson e la serializzazione di LocalDate
private final double bilancio;
@SerializedName("persone")
private final ArrayList<PersonaControllata> personeControllate;
/**
* Costruttore della classe PaginaDiario.
*
* @param data la data della pagina
* @param bilancio il bilancio della pagina
*/
public PaginaDiario(String data, double bilancio) {
this.data = data;
this.bilancio = bilancio;
this.personeControllate = new ArrayList<>();
}
/**
* Restituisce il giorno.
*
* @return il giorno della data
*/
public int getGiorno() {
return Integer.parseInt(data.split("-")[2]);
}
/**
* Restituisce la data.
*
* @return la data
*/
public String getData() {
return data;
}
/**
* Restituisce il bilancio.
*
* @return il bilancio
*/
public double getBilancio() {
return bilancio;
}
/**
* Restituisce la lista di persone controllate.
*
* @return la lista di persone controllate
*/
public ArrayList<PersonaControllata> getPersoneControllate() {
return personeControllate;
}
/**
* aggiunge una persona controllata alla pagina del diario.
*
* @param persona la persona da aggiungere
*/
public void addPersonaControllata(PersonaControllata persona) {
this.personeControllate.add(persona);
}
/**
* rimuove una persona controllata dalla pagina del diario.
*
* @param persona la persona da rimuovere
*/
public void removePersonaControllata(PersonaControllata persona) {
this.personeControllate.remove(persona);
}
}

View file

@ -1,342 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import javax.xml.stream.*;
import java.io.*;
import java.lang.reflect.Type;
import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import java.io.FileWriter;
/**
* Parser.java
* Questa classe è responsabile della lettura e scrittura dei dati di gioco in formato JSON e XML.
* Utilizza la libreria Gson per la serializzazione e deserializzazione dei dati.
*/
public class Parser {
/**
* Metodo per il parsing delle persone da un file JSON o XML.
*
* @param formato il formato del file (JSON o XML)
* @param fileName il nome del file senza estensione
* @return una lista di oggetti Persona
*/
public static ArrayList<Persona> parsePersone(Formato formato, String fileName) {
ArrayList<Persona> persone = new ArrayList<>();
if (formato == Formato.XML) {
parsePersoneXML(fileName, persone);
}
else {
persone = parsePersoneJSON(fileName, persone);
}
return persone;
}
/**
* Metodo per il parsing delle persone da un file JSON.
*
* @param fileName il nome del file senza estensione
* @param persone la lista di persone da riempire
* @return la lista di persone
*/
private static ArrayList<Persona> parsePersoneJSON(String fileName, ArrayList<Persona> persone) {
fileName = fileName + ".json";
try (FileReader reader = new FileReader(fileName)) {
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<Persona>>(){}.getType();
persone = gson.fromJson(reader, listType);
} catch (JsonIOException | JsonSyntaxException | IOException e) {
System.out.println("Error reading the JSON file: " + e.getMessage());
}
return persone;
}
/**
* Metodo per il parsing delle persone da un file XML.
*
* @param fileName il nome del file senza estensione
* @param persone la lista di persone da riempire
*/
private static void parsePersoneXML(String fileName, ArrayList<Persona> persone) {
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());
}
}
/**
* Metodo per il parsing dei comuni da un file JSON o XML.
*
* @param formato il formato del file (JSON o XML)
* @param fileName il nome del file senza estensione
* @return un oggetto Comuni contenente la lista di comuni
*/
public static Comuni parseComuni(Formato formato, String fileName) {
Comuni comuni = new Comuni();
if (formato == Formato.XML) {
parseComuniXML(fileName, comuni);
}
else {
comuni = parseComuniJSON(fileName, comuni);
}
return comuni;
}
/**
* Metodo per il parsing dei comuni da un file JSON.
*
* @param fileName il nome del file senza estensione
* @param comuni l'oggetto Comuni da riempire
* @return l'oggetto Comuni
*/
private static Comuni parseComuniJSON(String fileName, Comuni comuni) {
fileName = fileName + ".json";
try (FileReader reader = new FileReader(fileName)) {
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<Comune>>() {}.getType();
ArrayList<Comune> listaComuni = gson.fromJson(reader, listType);
comuni = new Comuni();
for (Comune comune : listaComuni) {
comuni.addComune(comune);
}
} catch (JsonIOException | JsonSyntaxException | IOException e) {
System.out.println("Error reading the JSON file: " + e.getMessage());
}
return comuni;
}
/**
* Metodo per il parsing dei comuni da un file XML.
*
* @param fileName il nome del file senza estensione
* @param comuni l'oggetto Comuni da riempire
*/
private static void parseComuniXML(String fileName, Comuni comuni) {
fileName = fileName + ".xml";
XMLInputFactory xmlif;
XMLStreamReader xmlr;
String currentElement = null;
String nome = null;
String codice = 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();
break;
case XMLStreamConstants.CHARACTERS:
String text = xmlr.getText().trim();
if (!text.isEmpty() && currentElement != null) {
if (currentElement.equals("nome")) {
nome = text;
} else if (currentElement.equals("codice")) {
codice = text;
}
}
break;
case XMLStreamConstants.END_ELEMENT:
String endTag = xmlr.getLocalName();
if (endTag.equals("comune")) {
Comune comune = new Comune(nome, codice);
comuni.addComune(comune);
nome = null;
codice = null;
}
currentElement = null;
break;
}
xmlr.next();
}
xmlr.close();
} catch (FactoryConfigurationError | XMLStreamException | IOException e) {
System.out.println("Error reading the file: " + e.getMessage());
}
}
/**
* Metodo per il salvataggio del diario in formato JSON o XML.
*
* @param fileName il nome del file senza estensione
* @param pagineDiario la lista di pagine del diario
* @param formato il formato del file (JSON o XML)
*/
public static void saveDiario (String fileName, ArrayList<PaginaDiario> pagineDiario, Formato formato) {
if (formato == Formato.XML) {
salvaDiarioXML(fileName, pagineDiario);
} else if (formato == Formato.JSON) {
salvaDiarioJSON(fileName, pagineDiario);
}
System.out.println("Diario salvato nella cartella corrente con nome: " + fileName);
}
/**
* Metodo per il salvataggio del diario in formato JSON.
*
* @param fileName il nome del file senza estensione
* @param pagineDiario la lista di pagine del diario
*/
private static void salvaDiarioJSON(String fileName, ArrayList<PaginaDiario> pagineDiario) {
fileName = fileName + ".json";
Gson gson = new Gson();
try (FileWriter writer = new FileWriter(fileName)) {
gson.toJson(pagineDiario, writer);
} catch (JsonIOException | IOException e) {
System.out.println("Error in initializing the writer:");
System.out.println(e.getMessage());
}
}
/**
* Metodo per il salvataggio del diario in formato XML.
*
* @param fileName il nome del file senza estensione
* @param pagineDiario la lista di pagine del diario
*/
private static void salvaDiarioXML(String fileName, ArrayList<PaginaDiario> pagineDiario) {
fileName = fileName + ".xml";
try (FileOutputStream outputStream = new FileOutputStream(fileName)) {
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter xmlWriter = xmlOutputFactory.createXMLStreamWriter(outputStream, "UTF-8");
xmlWriter.writeStartDocument("UTF-8", "1.0");
xmlWriter.writeStartElement("diario");
for (PaginaDiario pagina : pagineDiario) {
xmlWriter.writeStartElement("giornata");
xmlWriter.writeAttribute("numero", String.valueOf(pagina.getGiorno()));
xmlWriter.writeStartElement("data");
xmlWriter.writeCharacters(pagina.getData());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("bilancio");
xmlWriter.writeCharacters(String.valueOf(pagina.getBilancio()));
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("persone");
xmlWriter.writeAttribute("numero", String.valueOf(pagina.getPersoneControllate().size()));
for (int i = 0; i < pagina.getPersoneControllate().size(); i++) {
PersonaControllata persona = pagina.getPersoneControllate().get(i);
xmlWriter.writeStartElement("persona");
xmlWriter.writeAttribute("id", String.valueOf(i + 1));
xmlWriter.writeStartElement("nome");
xmlWriter.writeCharacters(persona.getNome());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("cognome");
xmlWriter.writeCharacters(persona.getCognome());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("sesso");
xmlWriter.writeCharacters(persona.getSesso());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("data_nascita");
xmlWriter.writeCharacters(persona.getDataNascita());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("comune_nascita");
xmlWriter.writeCharacters(persona.getComuneNascita());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("codice_fiscale");
xmlWriter.writeCharacters(persona.getCodiceFiscale());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("data_scadenza_id");
xmlWriter.writeCharacters(persona.getScadenzaDocumento());
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("stato_transito");
xmlWriter.writeCharacters(persona.getStatoTransito());
xmlWriter.writeEndElement();
xmlWriter.writeEndElement(); // persona
}
xmlWriter.writeEndElement(); // persone
xmlWriter.writeEndElement(); // giornata
}
xmlWriter.writeEndElement(); // diario
xmlWriter.writeEndDocument();
xmlWriter.flush();
} catch (XMLStreamException | IOException e) {
System.out.println("Error writing the file: " + e.getMessage());
}
}
}

View file

@ -1,268 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import it.kibo.fp.lib.InputData;
import java.util.ArrayList;
/**
* PatenteELibbrettoPregohMain.java
* Questa classe rappresenta il punto di ingresso del gioco "Patente e Libretto Pregoh".
* Inizializza il gioco, gestisce il ciclo di gioco e termina il gioco.
*/
public class PatenteELibbrettoPregohMain {
/**
* Metodo principale che avvia il gioco.
*
*/
public static void main(String[] args) {
System.out.println("PatenteELibbrettoPregoh!");
Formato formato = getFormato();
GameData gameData = new GameData(formato);
gameLoop(gameData);
endGame(gameData);
}
/**
* Metodo che gestisce il ciclo di gioco.
*
* @param gameData i dati di gioco
*/
private static void gameLoop(GameData gameData) {
while (gameData.getStatoGioco() == StatoGioco.IN_CORSO) {
int personeChePassano = ((int)(Math.random() * 5) + 3);
System.out.println("\nIl giorno " + gameData.getData() + " passeranno " + personeChePassano + " persone\nIl tuo saldo è di: " + gameData.getSaldo() + "§\n");
ArrayList<PersonaControllata> personeControllate = new ArrayList<>();
for (int i = 0; i < personeChePassano; i++) {
if (gameData.getStatoGioco() == StatoGioco.IN_CORSO) {
System.out.println("\nPassa la persona " + (i + 1) + " di " + personeChePassano + "\n");
gestisciPersona(gameData, personeControllate);
}
}
gameData.incrementaGiorno(personeControllate);
}
}
/**
* Metodo che gestisce una persona controllata.
*
* @param gameData i dati di gioco
* @param personeControllate la lista delle persone controllate
*/
private static void gestisciPersona(GameData gameData, ArrayList<PersonaControllata> personeControllate) {
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){
datiCorrettiAccettati(personaDaControllare, personeControllate);
} else {
datiSbagliatiAccettati(personaDaControllare, personeControllate, gameData);
}
} else {
if (esito) {
datiCorrettiRifiutati(personaDaControllare, personeControllate, gameData);
} else {
datiSbagliatiRifiutati(personaDaControllare, gameData, personeControllate);
}
}
}
/**
* Metodo che gestisce i dati errati rifiutati.
*
* @param personaDaControllare la persona da controllare
* @param gameData i dati di gioco
* @param personeControllate la lista delle persone controllate
*/
private static void datiSbagliatiRifiutati(Persona personaDaControllare, GameData gameData, ArrayList<PersonaControllata> personeControllate) {
System.out.println("La persona aveva i dati errati");
PersonaControllata personaControllata;
if (Math.random() < 0.4){
gestisciMazzetta(personaDaControllare, gameData, personeControllate);
} else {
personaRifiutata(personaDaControllare, personeControllate);
}
}
/**
* Metodo che gestisce la persona rifiutata.
*
* @param personaDaControllare la persona da controllare
* @param personeControllate la lista delle persone controllate
*/
private static void personaRifiutata(Persona personaDaControllare, ArrayList<PersonaControllata> personeControllate) {
PersonaControllata personaControllata;
personaControllata = new PersonaControllata(personaDaControllare, false, TipoPersonaControllata.PERSONA_NORMALE);
personeControllate.add(personaControllata);
}
/**
* Metodo che gestisce la mazzetta.
*
* @param personaDaControllare la persona da controllare
* @param gameData i dati di gioco
* @param personeControllate la lista delle persone controllate
*/
private static void gestisciMazzetta(Persona personaDaControllare, GameData gameData, ArrayList<PersonaControllata> personeControllate) {
PersonaControllata personaControllata;
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){
mazzettaRivoluzionario(personaDaControllare, gameData, personeControllate);
} else {
mazzettaPoliziotto(personaDaControllare, gameData, personeControllate);
}
} else {
mazzettaRifiutata(personaDaControllare, personeControllate);
}
}
/**
* Metodo che gestisce la mazzetta rifiutata.
*
* @param personaDaControllare la persona da controllare
* @param personeControllate la lista delle persone controllate
*/
private static void mazzettaRifiutata(Persona personaDaControllare, ArrayList<PersonaControllata> personeControllate) {
PersonaControllata personaControllata;
personaControllata = new PersonaControllata(personaDaControllare, false, TipoPersonaControllata.PERSONA_NORMALE);
personeControllate.add(personaControllata);
}
/**
* Metodo che gestisce la mazzetta di un poliziotto.
*
* @param personaDaControllare la persona da controllare
* @param gameData i dati di gioco
* @param personeControllate la lista delle persone controllate
*/
private static void mazzettaPoliziotto(Persona personaDaControllare, GameData gameData, ArrayList<PersonaControllata> personeControllate) {
PersonaControllata personaControllata;
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);
personeControllate.add(personaControllata);
}
/**
* Metodo che gestisce la mazzetta di un rivoluzionario.
*
* @param personaDaControllare la persona da controllare
* @param gameData i dati di gioco
* @param personeControllate la lista delle persone controllate
*/
private static void mazzettaRivoluzionario(Persona personaDaControllare, GameData gameData, ArrayList<PersonaControllata> personeControllate) {
PersonaControllata personaControllata;
System.out.println("Hai accettato la mazzetta, ti è andata bene ... era un rivoluzionario");
gameData.incrementaRivoluzionariAccettati();
personaControllata = new PersonaControllata(personaDaControllare, true, TipoPersonaControllata.RIVOLUZIONARIO);
personeControllate.add(personaControllata);
}
/**
* Metodo che gestisce i dati corretti rifiutati.
*
* @param personaDaControllare la persona da controllare
* @param personeControllate la lista delle persone controllate
* @param gameData i dati di gioco
*/
private static void datiCorrettiRifiutati(Persona personaDaControllare, ArrayList<PersonaControllata> personeControllate, GameData gameData) {
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);
}
}
/**
* Metodo che gestisce i dati errati accettati.
*
* @param personaDaControllare la persona da controllare
* @param personeControllate la lista delle persone controllate
* @param gameData i dati di gioco
*/
private static void datiSbagliatiAccettati(Persona personaDaControllare, ArrayList<PersonaControllata> personeControllate, GameData gameData) {
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);
}
}
/**
* Metodo che gestisce i dati corretti accettati.
*
* @param personaDaControllare la persona da controllare
* @param personeControllate la lista delle persone controllate
*/
private static void datiCorrettiAccettati(Persona personaDaControllare, ArrayList<PersonaControllata> personeControllate) {
System.out.println("La persona aveva i dati corretti");
PersonaControllata personaControllata = new PersonaControllata(personaDaControllare, true, TipoPersonaControllata.PERSONA_NORMALE);
personeControllate.add(personaControllata);
}
/**
* Metodo che termina il gioco e mostra il risultato finale.
*
* @param gameData i dati di gioco
*/
private static void endGame(GameData gameData) {
gameData.saveDiario();
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");
}
}
/**
* Metodo che controlla se una persona ha i dati corretti.
*
* @param persona la persona da controllare
* @param comuni la lista dei comuni
* @param gameData i dati di gioco
* @return true se la persona ha i dati corretti, false altrimenti
*/
private static boolean controllaPersona(Persona persona, Comuni comuni, GameData gameData) {
return persona.isCodiceFiscaleValido(comuni) && persona.isDocumentoValido(gameData.getData());
}
/**
* Metodo che chiede all'utente di scegliere il formato di salvataggio.
*
* @return il formato scelto
*/
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;
}
}

View file

@ -1,362 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import com.google.gson.annotations.SerializedName;
import java.time.LocalDate;
import java.util.ArrayList;
/**
* Classe che rappresenta una persona con i suoi dati anagrafici e il codice fiscale.
* La classe fornisce metodi per calcolare il codice fiscale e verificarne la validità.
*/
public class Persona {
private final String nome;
private final String cognome;
private final String sesso;
@SerializedName("data_nascita") // Per la serializzazione/deserializzazione JSON
private final String dataNascita;
@SerializedName("comune_nascita") // Per la serializzazione/deserializzazione JSON
private final String comuneNascita;
@SerializedName("codice_fiscale") // Per la serializzazione/deserializzazione JSON
private final String codiceFiscale;
@SerializedName("scadenza_documento") // Per la serializzazione/deserializzazione JSON
private final String scadenzaDocumento;
/**
* Costruttore della classe Persona.
*
* @param nome Nome della persona.
* @param cognome Cognome della persona.
* @param sesso Sesso
* @param dataNascita Data di nascita in formato "YYYY-MM-DD".
* @param comuneNascita Comune di nascita.
* @param codiceFiscale Codice fiscale.
* @param scadenzaDocumento Data di scadenza del documento in formato "YYYY-MM-DD".
*/
public Persona(String nome, String cognome, String sesso, String dataNascita, String comuneNascita, String codiceFiscale, String scadenzaDocumento) {
this.nome = nome;
this.cognome = cognome;
this.sesso = sesso;
this.dataNascita = dataNascita;
this.comuneNascita = comuneNascita;
this.codiceFiscale = codiceFiscale;
this.scadenzaDocumento = scadenzaDocumento;
}
/**
* Restituisce il nome della persona.
*
* @return Nome della persona.
*/
public String getNome() {
return nome;
}
/**
* Restituisce il cognome della persona.
*
* @return Cognome della persona.
*/
public String getCognome() {
return cognome;
}
/**
* Restituisce il sesso della persona.
*
* @return Sesso della persona.
*/
public String getSesso() {
return sesso;
}
/**
* Restituisce la data di nascita della persona.
*
* @return Data di nascita della persona in formato "YYYY-MM-DD".
*/
public String getDataNascita() {
return dataNascita;
}
/**
* Restituisce il comune di nascita della persona.
*
* @return Comune di nascita della persona.
*/
public String getComuneNascita() {
return comuneNascita;
}
/**
* Restituisce il codice fiscale della persona.
*
* @return Codice fiscale della persona.
*/
public String getCodiceFiscale() {
return codiceFiscale;
}
/**
* Restituisce la data di scadenza del documento della persona.
*
* @return Data di scadenza del documento in formato "YYYY-MM-DD".
*/
public String getScadenzaDocumento() {
return scadenzaDocumento;
}
/**
* Verifica se il codice fiscale fornito è valido confrontandolo con quello calcolato.
*
* @param comuni Oggetto Comuni per ottenere il codice del comune di nascita.
* @return true se il codice fiscale è valido, false altrimenti.
*/
public boolean isCodiceFiscaleValido(Comuni comuni) {
return codiceFiscale.equals(calcolaCodiceFiscale(comuni));
}
/**
* Calcola il codice fiscale della persona in base ai suoi dati anagrafici.
*
* @param comuni Oggetto Comuni per ottenere il codice del comune di nascita.
* @return Il codice fiscale calcolato.
*/
public String calcolaCodiceFiscale(Comuni comuni) {
ArrayList<String> consonantiCognome = getCaratteri(cognome, true);
ArrayList<String> consonantiNome = getCaratteri(nome, true);
StringBuilder codiceFiscaleCalcolato = new StringBuilder();
int stillMissing = 3 - consonantiCognome.size();
if (stillMissing <= 0) {
for (int i = 0; i < 3; i++) {
codiceFiscaleCalcolato.append(consonantiCognome.get(i));
}
} else {
ArrayList<String> vocaliCognome = getCaratteri(cognome, false);
for (String consonante : consonantiCognome) {
codiceFiscaleCalcolato.append(consonante);
}
for (int i = 0; i < stillMissing; i++) {
if (i < vocaliCognome.size()) {
codiceFiscaleCalcolato.append(vocaliCognome.get(i));
} else {
codiceFiscaleCalcolato.append("X");
}
}
}
if (consonantiNome.size() > 3){
codiceFiscaleCalcolato.append(consonantiNome.get(0));
codiceFiscaleCalcolato.append(consonantiNome.get(2));
codiceFiscaleCalcolato.append(consonantiNome.get(3));
} else if (consonantiNome.size() == 3){
for (String consonante : consonantiNome) {
codiceFiscaleCalcolato.append(consonante);
}
} else {
stillMissing = 3 - consonantiNome.size();
ArrayList<String> vocaliNome = getCaratteri(nome, false);
for (String consonante : consonantiNome) {
codiceFiscaleCalcolato.append(consonante);
}
if (vocaliNome.size() >= stillMissing){
for (int i = 0; i < stillMissing; i++) {
codiceFiscaleCalcolato.append(vocaliNome.get(i));
}
} else {
stillMissing = stillMissing - vocaliNome.size();
for (String vocali : vocaliNome) {
codiceFiscaleCalcolato.append(vocali);
}
for (int i = 0; i < stillMissing; i++) {
codiceFiscaleCalcolato.append("X");
}
}
}
codiceFiscaleCalcolato.append(dataNascita, 2, 4);
;
int mese = Integer.parseInt(dataNascita.substring(5, 7));
codiceFiscaleCalcolato.append(getLetteraMese(mese));
int giorno = Integer.parseInt(dataNascita.substring(8, 10));
if (sesso.equalsIgnoreCase("F")) {
giorno += 40;
}
if (giorno < 10) {
codiceFiscaleCalcolato.append("0");
}
codiceFiscaleCalcolato.append(giorno);
String codiceComune = comuni.getCodiceComune(comuneNascita);
codiceFiscaleCalcolato.append(codiceComune);
Character carattereDiControllo;
int somma = 0;
for (int i = 0; i < codiceFiscaleCalcolato.length(); i++) {
char c = codiceFiscaleCalcolato.charAt(i);
somma += getValueOf(c, (i + 1)%2 == 0);
}
int resto = somma % 26;
carattereDiControllo = (char) ('A' + resto);
codiceFiscaleCalcolato.append(carattereDiControllo);
return codiceFiscaleCalcolato.toString();
}
/**
* Restituisce il valore numerico associato a un carattere in base alla sua posizione.
*
* @param c Carattere da convertire.
* @param b Indica se il carattere è in una posizione pari o dispari.
* @return Valore numerico associato al carattere.
*/
private int getValueOf(char c, boolean b) {
if (!b) {
return switch (c) {
case '0', 'A' -> 1;
case '1', 'B' -> 0;
case '2', 'C' -> 5;
case '3', 'D' -> 7;
case '4', 'E' -> 9;
case '5', 'F' -> 13;
case '6', 'G' -> 15;
case '7', 'H' -> 17;
case '8', 'I' -> 19;
case '9', 'J' -> 21;
case 'K' -> 2;
case 'L' -> 4;
case 'M' -> 18;
case 'N' -> 20;
case 'O' -> 11;
case 'P' -> 3;
case 'Q' -> 6;
case 'R' -> 8;
case 'S' -> 12;
case 'T' -> 14;
case 'U' -> 16;
case 'V' -> 10;
case 'W' -> 22;
case 'X' -> 25;
case 'Y' -> 24;
case 'Z' -> 23;
default -> -1; // Invalid character
};
} else {
return switch (c) {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> c - '0';
case 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' -> c - 'A';
default -> -1; // Invalid character
};
}
}
/**
* Restituisce la lettera corrispondente al mese fornito.
*
* @param mese Mese in formato numerico (1-12).
* @return Lettera corrispondente al mese.
*/
private String getLetteraMese(int mese) {
return switch (mese) {
case 1 -> "A";
case 2 -> "B";
case 3 -> "C";
case 4 -> "D";
case 5 -> "E";
case 6 -> "H";
case 7 -> "L";
case 8 -> "M";
case 9 -> "P";
case 10 -> "R";
case 11 -> "S";
case 12 -> "T";
default -> "";
};
}
/**
* Verifica se il documento della persona è valido in base alla data fornita.
*
* @param date Data da confrontare con la scadenza del documento.
* @return true se il documento è valido, false altrimenti.
*/
public boolean isDocumentoValido(LocalDate date) {
LocalDate scadenza = LocalDate.parse(scadenzaDocumento);
return date.isBefore(scadenza) || date.isEqual(scadenza);
}
/**
* Verifica se il carattere fornito è una vocale.
*
* @param c Carattere da verificare.
* @return true se il carattere è una vocale, false altrimenti.
*/
private static boolean isVocale(char c) {
c = Character.toLowerCase(c);
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
/**
* Verifica se il carattere fornito è una consonante.
*
* @param c Carattere da verificare.
* @return true se il carattere è una consonante, false altrimenti.
*/
public static boolean isConsonante(char c) {
return Character.isLetter(c) && !isVocale(c);
}
/**
* Restituisce un ArrayList di caratteri consonanti o vocali presenti nella stringa fornita.
*
* @param s Stringa da analizzare.
* @param tipo true per consonanti, false per vocali.
* @return ArrayList di caratteri consonanti o vocali.
*/
private ArrayList<String> getCaratteri(String s, boolean tipo){
ArrayList<String> ret = new ArrayList<>();
if (tipo){ // consonanti
for (char c : s.toCharArray()) {
if (isConsonante(c)) {
ret.add(String.valueOf(c).toUpperCase());
}
}
} else { // vocali
for (char c : s.toCharArray()) {
if (isVocale(c)) {
ret.add(String.valueOf(c).toUpperCase());
}
}
}
return ret;
}
/**
* Restituisce una rappresentazione testuale della persona.
*
* @return Stringa contenente i dati anagrafici e il codice fiscale della persona.
*/
@Override
public String toString() {
return nome + " " + cognome + " (" + sesso + ") nato il " + dataNascita + " a " + comuneNascita + " con C.F. " + codiceFiscale + ", validità documento " + scadenzaDocumento;
}
}

View file

@ -1,71 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
import com.google.gson.annotations.SerializedName;
/**
* La classe PersonaControllata estende la classe Persona e rappresenta una persona che è stata controllata.
* Contiene informazioni sul risultato del controllo e sul tipo di persona controllata.
*/
public class PersonaControllata extends Persona {
@SerializedName("approvato")
private final boolean esitoControllo;
private transient final TipoPersonaControllata tipoPersonaControllata;
/**
* Costruttore della classe PersonaControllata.
*
* @param persona L'oggetto Persona da cui estrarre le informazioni.
* @param esitoControllo Il risultato del controllo (true se approvato, false se rifiutato).
* @param tipoPersonaControllata Il tipo di persona controllata.
*/
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;
}
/**
* Restituisce il risultato del controllo.
*
* @return true se il controllo è positivo, false altrimenti.
*/
public boolean isEsitoControllo() {
return esitoControllo;
}
/**
* Restituisce il tipo di persona controllata.
*
* @return Il tipo di persona controllata.
*/
public TipoPersonaControllata getTipoPersonaControllata() {
return tipoPersonaControllata;
}
/**
* Restituisce lo stato del transito in base all'esito del controllo.
*
* @return "APPROVATO" se il controllo è positivo, "RIFIUTATO" altrimenti.
*/
public String getStatoTransito() {
return esitoControllo ? "APPROVATO" : "RIFIUTATO";
}
/**
* Restituisce una rappresentazione testuale della PersonaControllata.
*
* @return Una stringa contenente le informazioni della persona controllata.
*/
@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";
}
}

View file

@ -1,5 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
public enum StatoGioco {
ARRESTATO, GIUSTIZIATO, RIVOLUZIONE, DODICESIMO_GIORNO, NON_ABBASTANZA_SOLDI, IN_CORSO;
}

View file

@ -1,5 +0,0 @@
package it.unibs.fp.patenteelibbrettopregoh;
public enum TipoPersonaControllata {
RIVOLUZIONARIO, POLIZIOTTO, PERSONA_NORMALE;
}

BIN
uml.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

149
uml.puml
View file

@ -1,149 +0,0 @@
@startuml
class Comune {
- nome: String
- codice: String
+ getNome(): String
+ getCodice(): String
}
class Comuni {
- comuni: ArrayList<Comune>
+ addComune(Comune): void
+ removeComune(Comune): void
+ getComuni(): ArrayList<Comune>
+ getCodiceComune(String): String
}
enum Formato {
JSON
XML
}
enum StatoGioco {
IN_CORSO
GIUSTIZIATO
RIVOLUZIONE
DODICESIMO_GIORNO
NON_ABBASTANZA_SOLDI
ARRESTATO
}
class PatenteELibbrettoPregohMain {
+main(String[]): void
-gameLoop(GameData): void
-gestisciPersona(GameData, ArrayList<PersonaControllata>): void
-datiSbagliatiRifiutati(Persona, GameData, ArrayList<PersonaControllata>): void
-personaRifiutata(Persona, ArrayList<PersonaControllata>): void
-gestisciMazzetta(Persona, GameData, ArrayList<PersonaControllata>): void
-mazzettaRifiutata(Persona, ArrayList<PersonaControllata>): void
-mazzettaPoliziotto(Persona, GameData, ArrayList<PersonaControllata>): void
-mazzettaRivoluzionario(Persona, GameData, ArrayList<PersonaControllata>): void
-datiCorrettiRifiutati(Persona, ArrayList<PersonaControllata>, GameData): void
-datiSbagliatiAccettati(Persona, ArrayList<PersonaControllata>, GameData): void
-datiCorrettiAccettati(Persona, ArrayList<PersonaControllata>): void
-endGame(GameData): void
-controllaPersona(Persona, Comuni, GameData): boolean
-getFormato(): Formato
}
class Persona {
-nome: String
-cognome: String
-sesso: String
-dataNascita: String
-comuneNascita: String
-codiceFiscale: String
-scadenzaDocumento: String
+getNome(): String
+getCognome(): String
+getSesso(): String
+getDataNascita(): String
+getComuneNascita(): String
+getCodiceFiscale(): String
+getScadenzaDocumento(): String
+isCodiceFiscaleValido(Comuni): boolean
+calcolaCodiceFiscale(Comuni): String
}
class GameData {
- formato: Formato
- nomePersonaggio: String
- diario: ArrayList<PaginaDiario>
- comuni: Comuni
- persone: ArrayList<Persona>
- saldo: double
- numeroMazzetteAccettatePolizia: int
- numeroRivoluzionariAccettati: int
- statoGioco: StatoGioco
- giorno: int
- data: LocalDate
+ getDiario(): ArrayList<PaginaDiario>
+ getComuni(): Comuni
+ getPersone(): ArrayList<Persona>
+ getSaldo(): double
+ getPersonaDaControlare(): Persona
+ getNumeroMazzetteAccettatePolizia(): int
+ getNumeroRivoluzionariAccettati(): int
+ addPaginaDiario(PaginaDiario): void
+ addSaldo(double): void
+ pagaMulta(double): void
+ incrementaMazzetteAccettatePolizia(): void
+ incrementaRivoluzionariAccettati(): void
+ getNomePersonaggio(): String
+ getStatoGioco(): StatoGioco
+ getGiorno(): int
+ incrementaGiorno(ArrayList<PersonaControllata>): void
+ getData(): LocalDate
+ saveDiario(): void
}
class PaginaDiario {
- data: String
- bilancio: double
- personeControllate: ArrayList<PersonaControllata>
+ getGiorno(): int
+ getData(): String
+ getBilancio(): double
+ getPersoneControllate(): ArrayList<PersonaControllata>
+ addPersonaControllata(PersonaControllata): void
+ removePersonaControllata(PersonaControllata): void
}
class Parser {
+ parsePersone(Formato, String): ArrayList<Persona>
+ parseComuni(Formato, String): Comuni
+ saveDiario(String, ArrayList<PaginaDiario>, Formato): void
}
class PersonaControllata {
- esitoControllo: boolean <<@SerializedName("approvato")>>
- tipoPersonaControllata: TipoPersonaControllata <<transient>>
--
+ PersonaControllata(persona: Persona, esitoControllo: boolean, tipoPersonaControllata: TipoPersonaControllata)
+ isEsitoControllo(): boolean
+ getTipoPersonaControllata(): TipoPersonaControllata
+ getStatoTransito(): String
+ toString(): String
}
PersonaControllata --|> Persona
PatenteELibbrettoPregohMain --> GameData
PatenteELibbrettoPregohMain --> PersonaControllata
PatenteELibbrettoPregohMain --> Persona
PatenteELibbrettoPregohMain --> Formato
PatenteELibbrettoPregohMain --> StatoGioco
PatenteELibbrettoPregohMain --> Comuni
PatenteELibbrettoPregohMain --> Parser
Persona --> Comuni
Comune <-- Comuni
GameData --> Comuni
GameData --> "0..*" Persona
GameData --> "0..*" PaginaDiario
GameData --> Formato
GameData --> StatoGioco
GameData --> "0..*" PersonaControllata
}
@enduml