Class GameService

java.lang.Object
it.unisa.diem.wordageddon_g16.services.GameService

public class GameService extends Object
Classe di "servizio" per la gestione della logica di gioco in Wordageddon. Fornisce tutte le funzionalità utili al GameController come per inizializzare una partita, generare domande, calcolare punteggi, gestire documenti e salvare i risultati.
  • Field Details

  • Constructor Details

    • GameService

      public GameService(AppContext context, GameReportDAO gameReportDAO, JDBCWdmDAO wdmDAO, DocumentDAO documentDAO, StopWordDAO stopwordDAO)
      Costruisce un nuovo GameService.
      Parameters:
      context - il contesto applicativo corrente
      gameReportDAO - DAO per i report di gioco
      wdmDAO - DAO per le matrici parola-documento
      documentDAO - DAO per i documenti
      stopwordDAO - DAO per le stopword
  • Method Details

    • init

      public void init(Difficulty difficulty)
      Inizializza la partita con la difficoltà specificata.
      Parameters:
      difficulty - la difficoltà scelta per la partita
    • restoreParams

      public void restoreParams(GameParams params)
    • getDifficulty

      public Difficulty getDifficulty()
      Restituisce la difficoltà della partita corrente.
      Returns:
      la difficoltà selezionata
      Throws:
      IllegalStateException - se la partita non è stata inizializzata
    • getTimeLimit

      public Duration 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

      public List<Document> 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

      public List<Question> 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 una IllegalStateException. Il metodo definisce i tipi di domanda ammessi in base al numero di documenti disponibili.

      Per ogni domanda da generare:
      • Seleziona casualmente il Question.QuestionType
      • Chiama il metodo corrispondente come absoluteFrequencyQuestion() o whichMoreQuestionSingle()
      Returns:
      lista di Question generate per la sessione attuale
      Throws:
      IllegalStateException - se il gioco non è stato inizializzato correttamente
    • absoluteFrequencyQuestionSingle

      private Question absoluteFrequencyQuestionSingle()
      Genera una domanda Question sulla frequenza assoluta di una parola in un singolo documento.

      Seleziona casualmente un Document, recupera la sua WDM 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

      private Question absoluteFrequencyQuestion()
      Genera una domanda Question 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

      private Question whichMoreQuestion()
      Genera una domanda Question 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

      private Question whichMoreQuestionSingle()
      Genera una domanda Question in cui si chiede quale parola appare più frequentemente in un singolo documento.

      Seleziona casualmente un Document e sceglie quattro parole dalla sua WDM. 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

      private Question whichLessQuestionSingle()
      Genera una domanda Question in cui si chiede quale parola appare meno frequentemente in un singolo documento.

      Seleziona un Document casuale e quattro parole dalla sua WDM. Individua quella con la frequenza più bassa come risposta corretta.

      Returns:
      domanda sulla parola con minore frequenza in un documento specifico
    • whichLessQuestion

      private Question whichLessQuestion()
      Genera una domanda Question 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

      private Question whichDocumentQuestion()
      Genera una domanda Question 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

      private Question whichAbsentQuestion()
      Genera una domanda Question 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, utilizzando generateAbsentWord().

      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

      private String generateAbsentWord(Set<String> presentWords)
      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().
      Se non trova alcuna parola valida, lancia una 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
    • loadWdmMap

      private void loadWdmMap()
      Carica le matrici WDM associate ai documenti selezionati per la partita nella mappa wdmMap. Per ciascun Document in params.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
    • 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

      public GameParams getParams()
    • setupReadingPhase

      public Map<Document,String> setupReadingPhase()
      Prepara il contenuto testuale dei documenti per la fase di lettura.

      Per ogni Document restituito da getDocuments(), legge il contenuto del file corrispondente tramite Resources.getDocumentContent(String) usando il nome fornito da Document.filename().
      In caso di errore nella lettura di un file, registra l'eccezione con SystemLogger.log().

      Returns:
      mappa contenente ogni Document e il suo contenuto testuale pronto per essere visualizzato
    • saveGameReport

      public void saveGameReport(GameReport report)
      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 - oggetto GameReport 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

      private Duration generateTimer(float influence)
      Genera la durata della sessione in base all'influenza della difficoltà.
      Parameters:
      influence - fattore che determina la durata del timer
      Returns:
      Duration impostata
    • generateQuestionCount

      private int generateQuestionCount(float influence, Difficulty difficulty)
      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