Class GameController
- All Implemented Interfaces:
javafx.fxml.Initializable
Gestisce la logica dell'interazione con l'utente durante la partita: selezione difficoltà, lettura dei documenti, quiz a domande multiple e resoconto finale con punteggio e tabella delle risposte date.
Utilizza servizi JavaFX asincroni per mantenere la UI reattiva durante operazioni intensive (generazione domande, caricamento testo).
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate javafx.scene.control.Button
private javafx.scene.control.Button
private javafx.scene.control.Button
private javafx.scene.control.Button
private javafx.scene.layout.VBox
private final AppContext
Contesto applicativo corrente, che collega controller, utente, e servizi condivisi tra le varie schermate.private javafx.scene.control.Label
private final javafx.beans.property.SimpleIntegerProperty
Indice del documento attualmente visualizzato nella fase di lettura.private javafx.beans.property.SimpleIntegerProperty
Indice della domanda attualmente visualizzata dal quiz.private javafx.scene.layout.AnchorPane
private javafx.scene.control.Label
Mappa che associa ciascun documento al rispettivo testo caricato da mostrare all'utente nella fase di lettura.Mappa che tiene traccia, per ogni domanda, dell'indice della risposta fornita dall'utente.private final javafx.beans.property.SimpleIntegerProperty
Conta il tempo trascorso dall'inizio della sessione, in secondi.private final GameService
Servizio centrale che gestisce la logica di gioco (selezione difficoltà, generazione quiz, calcolo punteggi ecc).private javafx.scene.layout.VBox
private static final int
Tempo minimo per skippare la lettura dei documenti.private final javafx.beans.property.BooleanProperty
Indica se è trascorso il tempo minimo richiesto per poter saltare la lettura dei documenti.private javafx.scene.control.Button
private int
Numero di risposte corrette fornite dal giocatore.private int
Numero di domande a cui l'utente non ha risposto (scaduto il tempo), ovvero saltate.private javafx.scene.control.Button
private static final Duration
Tempo limite per rispondere a una domanda del quiz.private int
Numero totale di domande da porre nella sessione di gioco.private javafx.scene.control.Label
private javafx.scene.control.Label
private javafx.scene.layout.AnchorPane
Lista delle domande generate per la sessione corrente.Servizio JavaFX asincrono che genera in background le domande del quiz, mantenendo la UI reattiva.private final javafx.beans.property.BooleanProperty
Indica se la generazione asincrona delle domande è stata completata ed è possibile procedere con il quiz.private LocalDateTime
Momento in cui è stata visualizzata la prima domanda del quiz.private javafx.scene.control.Label
private javafx.animation.Timeline
Timeline per la gestione del conto alla rovescia del timer di risposta alle domande.private javafx.scene.layout.AnchorPane
Servizio JavaFX asincrono per la fase di caricamento e visualizzazione dei documenti da leggere.private javafx.animation.Timeline
Timeline per il timer di lettura dei documenti da parte dell'utente.private javafx.scene.layout.AnchorPane
private javafx.scene.control.Label
private int
Punteggio totale ottenuto dal giocatore nella sessione corrente.private int
Punteggio assegnato per ogni risposta corretta fornita dal giocatore.private javafx.scene.text.Text
private javafx.scene.control.Button
private javafx.scene.layout.StackPane
private javafx.scene.control.TextArea
private javafx.scene.control.ProgressBar
private javafx.scene.control.ProgressBar
private javafx.scene.control.Label
private javafx.scene.control.Label
private javafx.scene.control.Label
private javafx.scene.control.Label
-
Constructor Summary
ConstructorsConstructorDescriptionGameController
(AppContext appContext) Controller della sessione di gioco per l'applicazione Wordageddon. -
Method Summary
Modifier and TypeMethodDescriptionprivate void
Genera il report di fine partita e aggiorna la UI.Ritorna l'ID del pannello attualmente visibile nello StackPane.void
Gestisce il click sul pulsante "Menu" del presente nella pagina dei Risultati.void
Gestisce il click sul pulsante "Play Again" del presente nella pagina dei Risultati.void
Gestisce il click sul pulsante "Leaderboard" del presente nella pagina dei Risultati.void
initialize
(URL url, ResourceBundle resourceBundle) Inizializza la sessione di gioco e configura i servizi asincroni.private void
loadPane
(javafx.scene.Node pane) Cambia il pannello visibile nello StackPane principale.private void
Ritorna alla schermata principale del menu.private void
onChangeDocument
(javafx.event.ActionEvent event) Cambia il documento visualizzato nella fase di lettura.void
onDifficultySelected
(javafx.event.ActionEvent event) Gestisce la selezione della difficoltà da parte dell'utente.private void
Popola la tabella delle risposte visibile a fine partita.private int
Ricalcola il punteggio totale basato sulle risposte date dall'utente.void
restoreSession
(GameSessionState state) Ripristina lo stato della sessione di gioco da un'istanza di GameSessionState.void
Salva lo stato corrente della sessione di gioco su disco per consentire all'utente di riprendere la partita successivamente.private void
setDocument
(int i) Mostra il contenuto del documento corrente nell'area di lettura.private void
showQuestion
(int index) Visualizza una domanda e le sue risposte nella UI.void
Salta la lettura dei documenti e passa direttamente alle domande.private javafx.animation.Timeline
startTimer
(Duration duration, javafx.scene.control.Label label, javafx.scene.control.ProgressBar bar, Runnable onFinished) Avvia un timer countdown con aggiornamento su barra e label.private void
Avvia la fase del quiz dopo la lettura.void
Alterna la visualizzazione della sezione dei Report e della TableView popolata tramite il metodopopulateAnswerTable
.
-
Field Details
-
stackPane
private javafx.scene.layout.StackPane stackPane -
readingPane
private javafx.scene.layout.AnchorPane readingPane -
questionPane
private javafx.scene.layout.AnchorPane questionPane -
diffSelectionPane
private javafx.scene.layout.AnchorPane diffSelectionPane -
textDisplayArea
private javafx.scene.control.TextArea textDisplayArea -
timerBar
private javafx.scene.control.ProgressBar timerBar -
timerLabelRead
private javafx.scene.control.Label timerLabelRead -
documentTitleLabel
private javafx.scene.control.Label documentTitleLabel -
nextDocumentButton
private javafx.scene.control.Button nextDocumentButton -
previousDocumentButton
private javafx.scene.control.Button previousDocumentButton -
skipReadingBtn
private javafx.scene.control.Button skipReadingBtn -
questionText
private javafx.scene.control.Label questionText -
questionCountLabel
private javafx.scene.control.Label questionCountLabel -
timerBarQuestion
private javafx.scene.control.ProgressBar timerBarQuestion -
timerLabelQuestion
private javafx.scene.control.Label timerLabelQuestion -
answer1Btn
private javafx.scene.control.Button answer1Btn -
answer2Btn
private javafx.scene.control.Button answer2Btn -
answer3Btn
private javafx.scene.control.Button answer3Btn -
answer4Btn
private javafx.scene.control.Button answer4Btn -
answersTable
-
wrongValue
private javafx.scene.control.Label wrongValue -
scoreValue
private javafx.scene.text.Text scoreValue -
heroBox
private javafx.scene.layout.VBox heroBox -
answersBox
private javafx.scene.layout.VBox answersBox -
viewAnswersBtnText
private javafx.scene.control.Label viewAnswersBtnText -
rightValue
private javafx.scene.control.Label rightValue -
completionValue
private javafx.scene.control.Label completionValue -
reportPane
private javafx.scene.layout.AnchorPane reportPane -
questionNumber
private javafx.scene.control.Label questionNumber -
domandaCln
-
punteggioCln
-
rispostaCorrettaCln
-
rispostaDataCln
-
documentToTextMap
-
currentQuestionIndex
private javafx.beans.property.SimpleIntegerProperty currentQuestionIndexIndice della domanda attualmente visualizzata dal quiz. Aggiornato a ogni avanzamento tra le domande. -
currentDocumentIndex
private final javafx.beans.property.SimpleIntegerProperty currentDocumentIndexIndice del documento attualmente visualizzato nella fase di lettura. Utilizzato dai pulsanti "Successivo" e "Precedente" per navigare tra i documenti. -
gameService
Servizio centrale che gestisce la logica di gioco (selezione difficoltà, generazione quiz, calcolo punteggi ecc). -
questions
-
readingSetupServiceFX
-
questionSetupServiceFX
-
questionTimer
private javafx.animation.Timeline questionTimerTimeline per la gestione del conto alla rovescia del timer di risposta alle domande. -
elapsedSeconds
private final javafx.beans.property.SimpleIntegerProperty elapsedSecondsConta il tempo trascorso dall'inizio della sessione, in secondi. Utilizzato per statistiche o per il timer delle domande e della lettura. -
readingTimer
private javafx.animation.Timeline readingTimerTimeline per il timer di lettura dei documenti da parte dell'utente. -
score
private int scorePunteggio totale ottenuto dal giocatore nella sessione corrente. -
numeroRisposteCorrette
private int numeroRisposteCorretteNumero di risposte corrette fornite dal giocatore. -
numeroRisposteSaltate
private int numeroRisposteSaltateNumero di domande a cui l'utente non ha risposto (scaduto il tempo), ovvero saltate. -
domandaRisposte
-
appContext
Contesto applicativo corrente, che collega controller, utente, e servizi condivisi tra le varie schermate. -
questionStartTime
Momento in cui è stata visualizzata la prima domanda del quiz. Serve per misurare il tempo impiegato dall'utente nel rispondere a tutte le domande. -
questionsReady
private final javafx.beans.property.BooleanProperty questionsReadyIndica se la generazione asincrona delle domande è stata completata ed è possibile procedere con il quiz. -
minTimeElapsed
private final javafx.beans.property.BooleanProperty minTimeElapsedIndica se è trascorso il tempo minimo richiesto per poter saltare la lettura dei documenti. -
questionCount
private int questionCountNumero totale di domande da porre nella sessione di gioco. Impostato in base alla difficoltà o alle impostazioni correnti. -
scorePerQuestion
private int scorePerQuestionPunteggio assegnato per ogni risposta corretta fornita dal giocatore. Il valore può dipendere dalla difficoltà selezionata. -
MIN_TIME_FOR_SKIP
private static final int MIN_TIME_FOR_SKIPTempo minimo per skippare la lettura dei documenti.Questo valore rappresenta il tempo minimo in secondi che deve trascorrere prima che l'utente possa saltare la lettura dei documenti. Si tiene presente che il pulsante di skipReadingBtn viene abilitato automaticamente solamente quando sono trascorsi i secondi minimi e il thread di analisi ha terminato la generazione delle domande.
- See Also:
-
QUESTION_TIME_LIMIT
Tempo limite per rispondere a una domanda del quiz.Questo valore rappresenta il tempo massimo in secondi che l'utente ha per rispondere a ciascuna domanda del quiz. Se il tempo scade, la risposta viene considerata saltata e viene mostrata la risposta corretta.
-
-
Constructor Details
-
GameController
Controller della sessione di gioco per l'applicazione Wordageddon.Gestisce l'interazione dell'utente durante la partita: selezione della difficoltà, lettura dei documenti, quiz a domande multiple e visualizzazione del report finale. Utilizza servizi JavaFX asincroni per mantenere la UI reattiva.
-
-
Method Details
-
initialize
Inizializza la sessione di gioco e configura i servizi asincroni.Questo metodo viene chiamato automaticamente da JavaFX al momento del caricamento del GameController.
- Carica la vista per la selezione della difficoltà
- Configura il pulsante di skip durante la lettura dei documenti: viene abilitato automaticamente quando questionsReady è true (ossia le domande sono state generate) e sono trascorsi almeno 15 secondi dall'inizio del timer (minTimeElapsed)
- Istanzia e avvia
readingSetupService
per leggere i documenti in modo asincrono e ottenere il testo da mostrare tramiteGameService.setupReadingPhase()
- Istanzia
questionSetupService
per generare le domande del quiz in background tramiteGameService.getQuestions()
- Aggiorna lo stato questionsReady al completamento della generazione delle domande
- Specified by:
initialize
in interfacejavafx.fxml.Initializable
-
setDocument
private void setDocument(int i) Mostra il contenuto del documento corrente nell'area di lettura.- Parameters:
i
- Indice del documento da visualizzare.
-
switchToQuestions
private void switchToQuestions()Avvia la fase del quiz dopo la lettura.Se le domande non sono ancora pronte, aspetta un secondo e riprova.
-
showQuestion
private void showQuestion(int index) Visualizza una domanda e le sue risposte nella UI.Gestisce la risposta dell'utente, il controllo correttezza, e avanza alla prossima domanda o al report finale se non ci sono piu domande.
- Parameters:
index
- Indice della domanda da mostrare.
-
saveSession
public void saveSession()Salva lo stato corrente della sessione di gioco su disco per consentire all'utente di riprendere la partita successivamente.La sessione viene serializzata in un file (il cui percorso è ottenuto da
Config.Props.INTERRUPTED_SESSION_FILE
) tramiteObjectOutputStream
. Lo stato scritto consiste in un'istanza diGameSessionState
. Uso tipico: questo metodo viene chiamato quando l'utente interrompe una partita (ad esempio chiudendo l'applicazione mentre é in fase 'quiz') per garantire che tutti i progressi siano salvati e possano essere ripristinati in un secondo momento tramite la funzionalità di "riprendi partita".In caso di errore nella scrittura del file, il metodo logga l'eccezione sia tramite
SystemLogger.log(java.lang.String, java.lang.Throwable)
che su standard output.- See Also:
-
restoreSession
Ripristina lo stato della sessione di gioco da un'istanza di GameSessionState.Viene chiamato quando l'utente decide di riprendere una sessione interrotta. Inizializza il GameService con la difficoltà e i documenti salvati, ripristina le domande e le risposte date, e carica il pannello delle domande.
- Parameters:
state
- Stato della sessione da ripristinare.
-
recalculateScore
private int recalculateScore()Ricalcola il punteggio totale basato sulle risposte date dall'utente.- Returns:
- punteggio ricalcolato
-
generateReport
private void generateReport()Genera il report di fine partita e aggiorna la UI.Calcola il tempo impiegato per rispondere alle domande, crea e salva il 'GameReport' registrato, aggiorna le statistiche della nuova vista (score, risposte corrette, risposte sbagliate, percentuale di risposte esatte su quelle date) e popola la tabella che mostra il resoconto della partita tramite il metodo populateAnswerTable() del controller.
- See Also:
-
startTimer
private javafx.animation.Timeline startTimer(Duration duration, javafx.scene.control.Label label, javafx.scene.control.ProgressBar bar, Runnable onFinished) Avvia un timer countdown con aggiornamento su barra e label.Mostra il tempo residuo, aggiorna il colore della barra in base al tempo rimasto e chiama una funzione al termine del countdown.
- Parameters:
duration
- Durata totale del timer.label
- Label da aggiornare con il tempo rimanente.bar
- ProgressBar da aggiornare.onFinished
- Callback da eseguire al termine del timer.- Returns:
- Istanza di Timeline attiva per il timer.
-
loadPane
private void loadPane(javafx.scene.Node pane) Cambia il pannello visibile nello StackPane principale.Esegue azioni specifiche a seconda del pannello mostrato (es. avvio lettura, avvia domande, mostra risultati).
- Parameters:
pane
- Nodo FXML da rendere visibile.
-
getCurrentPaneId
Ritorna l'ID del pannello attualmente visibile nello StackPane.Scorre i nodi figli dello StackPane e restituisce l'ID del primo nodo visibile.
- Returns:
- ID del pannello visibile, o null se nessun pannello è visibile.
-
onDifficultySelected
public void onDifficultySelected(javafx.event.ActionEvent event) Gestisce la selezione della difficoltà da parte dell'utente.Metodo chiamato quando l'utente seleziona un livello di difficoltà tramite pulsante. In base all'ID del pulsante cliccato inizializza il GameService con il livello di difficoltà corrispondente. Avvia la fase di lettura dei documenti caricando il relativo pannello ('readingPane').
- Parameters:
event
- Evento generato dalla selezione di difficoltà (ActionEvent su pulsante)
-
onBackPressed
private void onBackPressed()Ritorna alla schermata principale del menu. -
onChangeDocument
private void onChangeDocument(javafx.event.ActionEvent event) Cambia il documento visualizzato nella fase di lettura.- Parameters:
event
- Evento generato dai pulsanti "Successivo" o "Precedente".
-
skipReading
public void skipReading()Salta la lettura dei documenti e passa direttamente alle domande. -
handleShowLeaderboard
public void handleShowLeaderboard()Gestisce il click sul pulsante "Leaderboard" del presente nella pagina dei Risultati. Carica la schermata della leaderboard utilizzando ilViewLoader
. -
toggleShowAnswers
public void toggleShowAnswers()Alterna la visualizzazione della sezione dei Report e della TableView popolata tramite il metodopopulateAnswerTable
. -
handleGoMenu
public void handleGoMenu()Gestisce il click sul pulsante "Menu" del presente nella pagina dei Risultati. Carica la schermata del Menu utilizzando ilViewLoader
. -
handlePlayAgain
public void handlePlayAgain()Gestisce il click sul pulsante "Play Again" del presente nella pagina dei Risultati. Carica la schermata del Game utilizzando ilViewLoader
. -
populateAnswerTable
private void populateAnswerTable()Popola la tabella delle risposte visibile a fine partita. Il metodo viene chiamato ingenerateReport()
per visualizzare il riepilogo delle risposte date dall'utente. Utilizza la mappa 'domandaRisposte' per mostrare, per ogni domanda:- Il testo della domanda
- La risposta data dall'utente (o "Saltata" se assente)
- La risposta corretta
- Il punteggio ottenuto per la risposta
-