Compare commits

...

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

29 changed files with 84683 additions and 2 deletions

23
.gitignore vendored Normal file
View file

@ -0,0 +1,23 @@
# 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 Normal file
View file

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

10
.idea/libraries/google_code_gson.xml generated Normal file
View file

@ -0,0 +1,10 @@
<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>

9
.idea/libraries/kibofplib_1_0.xml generated Normal file
View file

@ -0,0 +1,9 @@
<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 Normal file
View file

@ -0,0 +1,6 @@
<?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 Normal file
View file

@ -0,0 +1,8 @@
<?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 Normal file
View file

@ -0,0 +1,6 @@
<?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 Normal file
View file

@ -0,0 +1,212 @@
<?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>

9002
FileEsercizio/IDpersone.json Normal file

File diff suppressed because it is too large Load diff

9003
FileEsercizio/IDpersone.xml Normal file

File diff suppressed because it is too large Load diff

32370
FileEsercizio/comuni.json Normal file

File diff suppressed because it is too large Load diff

32371
FileEsercizio/comuni.xml Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,22 @@
<?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>

View file

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

BIN
lib/gson-2.10.1.jar Normal file

Binary file not shown.

BIN
lib/kibofplib-1.0.jar Normal file

Binary file not shown.

View file

@ -0,0 +1,51 @@
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

@ -0,0 +1,61 @@
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

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

View file

@ -0,0 +1,230 @@
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

@ -0,0 +1,84 @@
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

@ -0,0 +1,342 @@
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

@ -0,0 +1,268 @@
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

@ -0,0 +1,362 @@
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

@ -0,0 +1,71 @@
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

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

View file

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

BIN
uml.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

149
uml.puml Normal file
View file

@ -0,0 +1,149 @@
@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