Class GameService
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final AppContext
private final DocumentDAO
private final GameReportDAO
private GameParams
private static final Random
private final StopWordDAO
private final JDBCWdmDAO
-
Constructor Summary
ConstructorsConstructorDescriptionGameService
(AppContext context, GameReportDAO gameReportDAO, JDBCWdmDAO wdmDAO, DocumentDAO documentDAO, StopWordDAO stopwordDAO) Costruisce un nuovo GameService. -
Method Summary
Modifier and TypeMethodDescriptionprivate Question
Genera una domandaQuestion
sulla frequenza assoluta di una parola in tutti i documenti combinati.private Question
Genera una domandaQuestion
sulla frequenza assoluta di una parola in un singolo documento.private String
generateAbsentWord
(Set<String> presentWords) Genera una parola che non è presente in alcuno dei documenti selezionati per la partita.generateDocuments
(float influence, Difficulty difficulty) Genera una lista di documenti in base all'influenza della difficoltà.private int
generateQuestionCount
(float influence, Difficulty difficulty) Genera il numero di domande per la partita in base all'influenza della difficoltà.private Duration
generateTimer
(float influence) Genera la durata della sessione in base all'influenza della difficoltà.Restituisce la difficoltà della partita corrente.Restituisce la lista dei documenti selezionati per la partita corrente.int
Restituisce il numero di domande della partita corrente.Genera la lista di domande per la sessione di gioco in base ai documenti e alla difficoltà selezionata.int
Calcola il punteggio assegnato per ogni singola domanda in base alla difficoltà della partita e al numero totale di domande.Restituisce il tempo limite della partita corrente.void
init
(Difficulty difficulty) Inizializza la partita con la difficoltà specificata.private void
Carica le matriciWDM
associate ai documenti selezionati per la partita nella mappawdmMap
.void
restoreParams
(GameParams params) void
saveGameReport
(GameReport report) Salva il report di gioco.Prepara il contenuto testuale dei documenti per la fase di lettura.private Question
Genera una domandaQuestion
che richiede di identificare quale parola tra quattro non è presente in nessun documento.private Question
Genera una domandaQuestion
che richiede di identificare in quale documento appare una determinata parola.private Question
Genera una domandaQuestion
che richiede di identificare la parola meno frequente tra un insieme di quattro, basata sui dati cumulativi di tutti i documenti.private Question
Genera una domandaQuestion
in cui si chiede quale parola appare meno frequentemente in un singolo documento.private Question
Genera una domandaQuestion
in cui si chiede quale parola appare più frequentemente tra un insieme proposto, basata su tutti i documenti.private Question
Genera una domandaQuestion
in cui si chiede quale parola appare più frequentemente in un singolo documento.
-
Field Details
-
gameReportDAO
-
wdmDAO
-
documentDAO
-
stopWordDAO
-
context
-
params
-
wdmMap
-
random
-
-
Constructor Details
-
GameService
public GameService(AppContext context, GameReportDAO gameReportDAO, JDBCWdmDAO wdmDAO, DocumentDAO documentDAO, StopWordDAO stopwordDAO) Costruisce un nuovo GameService.- Parameters:
context
- il contesto applicativo correntegameReportDAO
- DAO per i report di giocowdmDAO
- DAO per le matrici parola-documentodocumentDAO
- DAO per i documentistopwordDAO
- DAO per le stopword
-
-
Method Details
-
init
Inizializza la partita con la difficoltà specificata.- Parameters:
difficulty
- la difficoltà scelta per la partita
-
restoreParams
-
getDifficulty
Restituisce la difficoltà della partita corrente.- Returns:
- la difficoltà selezionata
- Throws:
IllegalStateException
- se la partita non è stata inizializzata
-
getTimeLimit
Restituisce il tempo limite della partita corrente.- Returns:
- la durata massima concessa per la partita
- Throws:
IllegalStateException
- se la partita non è stata inizializzata
-
getDocuments
Restituisce la lista dei documenti selezionati per la partita corrente.- Returns:
- lista dei documenti utilizzati nella partita
- Throws:
IllegalStateException
- se la partita non è stata inizializzata
-
getQuestionCount
public int getQuestionCount()Restituisce il numero di domande della partita corrente.- Returns:
- numero di domande generate per la partita
- Throws:
IllegalStateException
- se la partita non è stata inizializzata
-
getQuestions
Genera la lista di domande per la sessione di gioco in base ai documenti e alla difficoltà selezionata.Se
params
non è inizializzato, viene sollevata unaIllegalStateException
. Il metodo definisce i tipi di domanda ammessi in base al numero di documenti disponibili.- Con meno di 4 documenti: solo domande di tipo SINGLE, ossia basate su un singolo documento
- Con 4 o più documenti: include anche
Question.QuestionType.WHICH_DOCUMENT
eQuestion.QuestionType.WHICH_ABSENT
, ossia domande che chiedono una parola in che documento è presente di più o in quale è assente
- Seleziona casualmente il
Question.QuestionType
- Chiama il metodo corrispondente come
absoluteFrequencyQuestion()
owhichMoreQuestionSingle()
- Returns:
- lista di
Question
generate per la sessione attuale - Throws:
IllegalStateException
- se il gioco non è stato inizializzato correttamente
-
absoluteFrequencyQuestionSingle
Genera una domandaQuestion
sulla frequenza assoluta di una parola in un singolo documento.Seleziona casualmente un
Document
, recupera la suaWDM
associata e sceglie una parola presente. Crea quattro opzioni numeriche plausibili e identifica quella corretta in base alla frequenza della parola nel documento.- Returns:
- domanda a scelta multipla relativa alla frequenza di una parola in un singolo documento
-
absoluteFrequencyQuestion
Genera una domandaQuestion
sulla frequenza assoluta di una parola in tutti i documenti combinati.Somma le frequenze di tutte le parole attraverso i
WDM
dei documenti. Seleziona una parola casuale e genera opzioni di risposta basate sulla sua frequenza cumulata.- Returns:
- domanda relativa alla frequenza di una parola aggregata su tutti i documenti
- Throws:
IllegalStateException
- se non ci sono parole disponibili nei documenti
-
whichMoreQuestion
Genera una domandaQuestion
in cui si chiede quale parola appare più frequentemente tra un insieme proposto, basata su tutti i documenti.Accumula le frequenze totali per ogni parola e seleziona casualmente quattro parole tra quelle disponibili. Identifica quella con la frequenza più alta come risposta corretta.
- Returns:
- domanda a scelta multipla sulla parola con frequenza massima complessiva
- Throws:
IllegalStateException
- se il numero di parole disponibili è inferiore a 4
-
whichMoreQuestionSingle
Genera una domandaQuestion
in cui si chiede quale parola appare più frequentemente in un singolo documento.Seleziona casualmente un
Document
e sceglie quattro parole dalla suaWDM
. Identifica la parola con frequenza più alta come risposta corretta.- Returns:
- una Question a scelta multipla relativa alla parola più frequente nel documento selezionato
-
whichLessQuestionSingle
Genera una domandaQuestion
in cui si chiede quale parola appare meno frequentemente in un singolo documento.Seleziona un
Document
casuale e quattro parole dalla suaWDM
. Individua quella con la frequenza più bassa come risposta corretta.- Returns:
- domanda sulla parola con minore frequenza in un documento specifico
-
whichLessQuestion
Genera una domandaQuestion
che richiede di identificare la parola meno frequente tra un insieme di quattro, basata sui dati cumulativi di tutti i documenti.Combina le frequenze di tutte le parole usando le rispettive
WDM
, ne seleziona quattro casualmente e individua quella con la frequenza più bassa.- Returns:
- domanda a scelta multipla sulla parola con minore frequenza globale
- Throws:
IllegalStateException
- se non sono disponibili abbastanza dati per la generazione
-
whichDocumentQuestion
Genera una domandaQuestion
che richiede di identificare in quale documento appare una determinata parola.Seleziona un
Document
casuale e una parola presente al suo interno. Prepara un insieme di documenti tra cui scegliere, garantendo che il documento corretto sia incluso, e costruisce le opzioni di risposta in ordine casuale.- Returns:
- domanda sulla presenza di una parola in uno dei documenti disponibili
- Throws:
IllegalStateException
- se il documento selezionato non contiene parole
-
whichAbsentQuestion
Genera una domandaQuestion
che richiede di identificare quale parola tra quattro non è presente in nessun documento.Recupera tutte le parole effettivamente contenute nei documenti tramite le rispettive
WDM
. Ne seleziona tre esistenti e ne genera una quarta che non compare in alcun documento, utilizzandogenerateAbsentWord()
.- Returns:
- domanda che verifica l'assenza totale di una parola nei documenti
- Throws:
IllegalStateException
- se non ci sono abbastanza parole per generare la domanda
-
generateAbsentWord
Genera una parola che non è presente in alcuno dei documenti selezionati per la partita. Il metodo tenta di prelevare una parola da:- Documenti inutilizzati: estrae una parola dalla
WDM
associata a un documento non usato, filtrando quelle già presenti. - Vocabolario statico: se non ci sono documenti inutilizzati o nessuna parola valida, seleziona una parola casuale da
Resources.getVocabulary()
.
IllegalStateException
.- Parameters:
presentWords
- insieme di parole già presenti nei documenti usati- Returns:
- una parola assente da tutti i documenti utilizzati
- Throws:
IllegalStateException
- se non ci sono parole disponibili né nei documenti inutilizzati né nel vocabolario statico
- Documenti inutilizzati: estrae una parola dalla
-
loadWdmMap
private void loadWdmMap()Carica le matriciWDM
associate ai documenti selezionati per la partita nella mappawdmMap
. Per ciascunDocument
inparams.documents
, il metodo:- Recupera la matrice dal database tramite
wdmDAO.selectBy(Document)
- La inserisce nella mappa
wdmMap
- Se la matrice non è disponibile, viene lanciata una
IllegalStateException
- Recupera la matrice dal database tramite
-
getScorePerQuestion
public int getScorePerQuestion()Calcola il punteggio assegnato per ogni singola domanda in base alla difficoltà della partita e al numero totale di domande.- Returns:
- il punteggio per ogni domanda
-
getParams
-
setupReadingPhase
Prepara il contenuto testuale dei documenti per la fase di lettura.Per ogni
Document
restituito dagetDocuments()
, legge il contenuto del file corrispondente tramiteResources.getDocumentContent(String)
usando il nome fornito daDocument.filename()
.
In caso di errore nella lettura di un file, registra l'eccezione conSystemLogger.log()
.- Returns:
- mappa contenente ogni
Document
e il suo contenuto testuale pronto per essere visualizzato
-
saveGameReport
Salva il report di gioco.Viene chiamato dal GameController a fine partita per registrare i dati finali del giocatore utilizzando
JDBCGameReportDAO.insert(GameReport)
. Il report include informazioni su punteggio, tempo di registrazione, difficoltà, tempo massimo di gioco, tempo utilizzato, documenti utilizzati.- Parameters:
report
- oggettoGameReport
da salvare
-
generateDocuments
private List<Document> generateDocuments(float influence, Difficulty difficulty) throws IllegalArgumentException Genera una lista di documenti in base all'influenza della difficoltà.- Parameters:
influence
- valore di influenza della difficoltà- Returns:
- lista di documenti
- Throws:
IllegalArgumentException
- se non sono disponibili documenti
-
generateTimer
Genera la durata della sessione in base all'influenza della difficoltà.- Parameters:
influence
- fattore che determina la durata del timer- Returns:
Duration
impostata
-
generateQuestionCount
Genera il numero di domande per la partita in base all'influenza della difficoltà.- Parameters:
influence
- valore di influenza della difficoltà- Returns:
- numero di domande
-