Class GameController

java.lang.Object
it.unisa.diem.wordageddon_g16.controllers.GameController
All Implemented Interfaces:
javafx.fxml.Initializable

public class GameController extends Object implements javafx.fxml.Initializable
Controller principale per la gestione di una sessione di gioco.

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

    Fields
    Modifier and Type
    Field
    Description
    private 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 javafx.scene.control.TableView<Map.Entry<Question,Integer>>
     
    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.
    private javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String>
     
    private final Map<Question,Integer>
    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 javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String>
     
    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
     
    private List<Question>
    Lista delle domande generate per la sessione corrente.
    private javafx.concurrent.Service<List<Question>>
    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.
    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
     
    private javafx.concurrent.Service<Map<Document,String>>
    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 javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String>
     
    private javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String>
     
    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

    Constructors
    Constructor
    Description
    Controller della sessione di gioco per l'applicazione Wordageddon.
  • Method Summary

    Modifier and Type
    Method
    Description
    private 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
    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 metodo populateAnswerTable.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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

      private javafx.scene.control.TableView<Map.Entry<Question,Integer>> 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

      private javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String> domandaCln
    • punteggioCln

      private javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String> punteggioCln
    • rispostaCorrettaCln

      private javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String> rispostaCorrettaCln
    • rispostaDataCln

      private javafx.scene.control.TableColumn<Map.Entry<Question,Integer>, String> rispostaDataCln
    • documentToTextMap

      private Map<Document,String> documentToTextMap
      Mappa che associa ciascun documento al rispettivo testo caricato da mostrare all'utente nella fase di lettura.
    • currentQuestionIndex

      private javafx.beans.property.SimpleIntegerProperty currentQuestionIndex
      Indice della domanda attualmente visualizzata dal quiz. Aggiornato a ogni avanzamento tra le domande.
    • currentDocumentIndex

      private final javafx.beans.property.SimpleIntegerProperty currentDocumentIndex
      Indice del documento attualmente visualizzato nella fase di lettura. Utilizzato dai pulsanti "Successivo" e "Precedente" per navigare tra i documenti.
    • gameService

      private final GameService gameService
      Servizio centrale che gestisce la logica di gioco (selezione difficoltà, generazione quiz, calcolo punteggi ecc).
    • questions

      private List<Question> questions
      Lista delle domande generate per la sessione corrente.
    • readingSetupServiceFX

      private javafx.concurrent.Service<Map<Document,String>> readingSetupServiceFX
      Servizio JavaFX asincrono per la fase di caricamento e visualizzazione dei documenti da leggere.
    • questionSetupServiceFX

      private javafx.concurrent.Service<List<Question>> questionSetupServiceFX
      Servizio JavaFX asincrono che genera in background le domande del quiz, mantenendo la UI reattiva.
    • questionTimer

      private javafx.animation.Timeline questionTimer
      Timeline per la gestione del conto alla rovescia del timer di risposta alle domande.
    • elapsedSeconds

      private final javafx.beans.property.SimpleIntegerProperty elapsedSeconds
      Conta 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 readingTimer
      Timeline per il timer di lettura dei documenti da parte dell'utente.
    • score

      private int score
      Punteggio totale ottenuto dal giocatore nella sessione corrente.
    • numeroRisposteCorrette

      private int numeroRisposteCorrette
      Numero di risposte corrette fornite dal giocatore.
    • numeroRisposteSaltate

      private int numeroRisposteSaltate
      Numero di domande a cui l'utente non ha risposto (scaduto il tempo), ovvero saltate.
    • domandaRisposte

      private final Map<Question,Integer> domandaRisposte
      Mappa che tiene traccia, per ogni domanda, dell'indice della risposta fornita dall'utente. Se l'utente ha saltato la domanda, il valore è -1.
    • appContext

      private final AppContext appContext
      Contesto applicativo corrente, che collega controller, utente, e servizi condivisi tra le varie schermate.
    • questionStartTime

      private LocalDateTime 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 questionsReady
      Indica se la generazione asincrona delle domande è stata completata ed è possibile procedere con il quiz.
    • minTimeElapsed

      private final javafx.beans.property.BooleanProperty minTimeElapsed
      Indica se è trascorso il tempo minimo richiesto per poter saltare la lettura dei documenti.
    • questionCount

      private int questionCount
      Numero totale di domande da porre nella sessione di gioco. Impostato in base alla difficoltà o alle impostazioni correnti.
    • scorePerQuestion

      private int scorePerQuestion
      Punteggio 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_SKIP
      Tempo 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

      private static final Duration 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

      public GameController(AppContext appContext)
      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

      public void initialize(URL url, ResourceBundle resourceBundle)
      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 tramite GameService.setupReadingPhase()
      • Istanzia questionSetupService per generare le domande del quiz in background tramite GameService.getQuestions()
      • Aggiorna lo stato questionsReady al completamento della generazione delle domande
      Specified by:
      initialize in interface javafx.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) tramite ObjectOutputStream. Lo stato scritto consiste in un'istanza di GameSessionState. 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

      public void restoreSession(GameSessionState state)
      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

      public String 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 il ViewLoader.
    • toggleShowAnswers

      public void toggleShowAnswers()
      Alterna la visualizzazione della sezione dei Report e della TableView popolata tramite il metodo populateAnswerTable.
    • handleGoMenu

      public void handleGoMenu()
      Gestisce il click sul pulsante "Menu" del presente nella pagina dei Risultati. Carica la schermata del Menu utilizzando il ViewLoader.
    • handlePlayAgain

      public void handlePlayAgain()
      Gestisce il click sul pulsante "Play Again" del presente nella pagina dei Risultati. Carica la schermata del Game utilizzando il ViewLoader.
    • populateAnswerTable

      private void populateAnswerTable()
      Popola la tabella delle risposte visibile a fine partita. Il metodo viene chiamato in generateReport() 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