Skip to content

Nuovo client con GUI e istruzioni nel readme#26

Open
mikyll wants to merge 15 commits intoAGalassi:masterfrom
mikyll:master
Open

Nuovo client con GUI e istruzioni nel readme#26
mikyll wants to merge 15 commits intoAGalassi:masterfrom
mikyll:master

Conversation

@mikyll
Copy link

@mikyll mikyll commented Dec 30, 2022

Riassunto

Ho creato un client con grafica in JavaFX, basato su MVC. Di seguito una piccola demo:

Potrebbe essere utile per capire meglio il funzionamento e le regole del gioco, per testare un'intelligenza artificiale, oppure semplicemente per divertimento :-)

Aggiunte

Ho aggiunto i seguenti client in it.unibo.ai.didattica.competition.tablut.client:

  • TablutHumanClientGui (client principale, che parsa gli argomenti da linea di comando e, se sono incompleti o non validi, mostra una finestra di dialogo per completarli, dopodiché si connette al Server);
  • TablutHumanBlackClientGui (client con argomenti da linea di comando per un player black predefinito);
  • TablutHumanWhiteClientGui (client con argomenti da linea di comando per un player white predefinito).

Tutto il codice relativo al nuovo client è stato inserito nel package it.unibo.ai.didattica.competition.tablut.gui.client:

  • Controller, media le interazioni con la grafica e la logica di business;
  • classi varie per gli elementi della grafica (GameInfoDialog, BoardCoordinates, BoardPawn, AllowedMoves);
  • file di utilità (StringUtils, GameInfo, Coordinate);

Tutti i file di risorse sono stati inseriti in it.unibo.ai.didattica.competition.tablut.gui.resources.client:

  • file FXML;
  • file di stile;
  • immagini;
  • icone;

Funzionalità del Client

  • Richiesta dei parametri direttamente da interfaccia grafica (e validazione degli stessi);
  • 2 modalità di visualizzazione: ridotta (default) ed estesa:
    • la ridotta mostra solo la tavola da gioco, l'IP ed il timer;
    • l'estesa mostra informazioni aggiuntive quali la history delle mosse, il nome del giocatore ed il colore delle pedine, il numero del turno, la casella selezionata e quella di destinazione nel caso sia il proprio turno, ed messaggio di attesa nel caso invece sia il turno del giocatore;
  • possibilità di selezionare solo le proprie pedine, che vengono evidenziate quando ci si passa il cursore sopra;
  • highlight delle mosse possibili quando viene selezionata una pedina;
  • una volta selezionata una pedina, questa diventa trasparente e compare una pedina in "hovering" nella casella di destinazione, se l'utente ci posiziona il cursore sopra;
  • un messaggio al termine della partita, con scritto il vincitore, il numero di turni ed il tempo trascorso.

Problema

Per lanciare l'applicazione non basta aver installato openjdk in quanto JavaFX non è integrato, ma serve un JDK/JRE che contenga i componenti necessari.

Soluzione

A tal proposito ho creato un piccolo documento con qualche link per scaricare il JDK/JRE con Java 8 + supporto per JavaFX e, alternativamente, dei link per scaricare l'app standalone dal mio fork della repo. Infine ho inserito una sezione nel README in cui ho messo una GIF di demo ed il link al documento con le istruzioni.

Creato un client "umano" con la grafica (JavaFX).

- all'avvio mostra una finestra di dialogo per inserire i dati di gioco (username, squadra, timeout e indirizzo IP del server);
- mostra la tavola da gioco e una UI con qualche info (turno corrente, nome giocatore, pedina selezionata);
- permette di selezionare la pedina da spostare e successivamente la destinazione;
- ho aggiunto degli effetti per evidenziare le pedine selezionabili, quando viene spostato il mouse sopra, e quella selezionata;
- selezionata la pedina vengono evidenziate le destinazioni possibili;
- durante il turno avversario non è possibile muovere pedine, e la UI mostra un messaggio di attesa;
- la tavola di gioco si aggiorna dopo aver effettuato una mossa e quando viene ricevuto un nuovo stato dal server;
- quando la partita finisce viene mostrata una finestra di dialogo;
- usate immagini omogenee per le pedine;
- usata un'immagine senza coordinate per la tavola da gioco;
- le coordinate vengono disegnate dinamicamente;

TO-DO:
- mostrare la pedina sulla cella di destinazione, quando è stata selezionata quella di partenza e l'utente ci sposta il mouse sopra;
- sistemare il counter dei turni;
- sistemare la history delle mosse;
- spostare il codice delle mosse possibili evidenziate in una classe a parte, con metodi statici;
- sistemare risorse nelle directory;
- spostato il codice delle mosse possibili evidenziate in una classe a parte;
- sistemato il counter dei turni;
- aggiunta la durata della partita nel messaggio di Game Over;
- aggiunto bottone per enlarge/shrink della GUI;
- sistemata la history, ora funziona tutta (turno, giocatore giusto, mossa - per quella avversaria c'è una soluzione "temporanea" che dice solo la destinazione);

TO-DO:
- aggiungere timer;
- parsing parametri;
- sistemare client di default (TablutHumanWhiteClientGui & TablutHumanBlackClientGui);
- mostrare la pedina sulla cella di destinazione, quando è stata selezionata quella di partenza e l'utente ci sposta il mouse sopra;
- sistemare risorse nelle directory;
- sistemare JavaDoc;
- sistemare la history dell'avversario (?);
- pulire codice;
- ancorato il bottone per espandere/ridurre;
- sistemata la validazione dei campi di input di GameInfoDialog (ora vengono mostrati degli errori e il bottone di conferma si disabilita);
- aggiunto timer;

TO-DO:
- parsing parametri;
- sistemare client di default (TablutHumanWhiteClientGui & TablutHumanBlackClientGui);
- mostrare la pedina sulla cella di destinazione, quando è stata selezionata quella di partenza e l'utente ci sposta il mouse sopra;
- sistemare risorse nelle directory;
- sistemare JavaDoc;
- sistemare la history dell'avversario (?);
- pulire codice;
- parsing parametri;
- sistemati i client di default (TablutHumanWhiteClientGui & TablutHumanBlackClientGui);
- aggiunta classe con metodi statici di utilità per le stringhe.

TO-DO:
- mostrare la pedina sulla cella di destinazione, quando è stata selezionata quella di partenza e l'utente ci sposta il mouse sopra;
- sistemare risorse nelle directory;
- sistemare JavaDoc;
- pulire codice;
- sistemare la history dell'avversario (probabilmente no);
- sistemato bug del metodo tmpOpponentAddToHistory().

TO-DO:
- mostrare la pedina sulla cella di destinazione, quando è stata selezionata quella di partenza e l'utente ci sposta il mouse sopra;
- sistemare risorse nelle directory;
- sistemare JavaDoc;
- pulire codice;
- sistemare la history dell'avversario (probabilmente no);
- fixato bug scorrimento history azioni;
- fixato un altro piccolo bug, nell'inserimento dell'IP (il bottone OK si rimaneva disattivato anche quando non doveva)
- modificato il modo in cui i file delle immagini vengono caricati da file, perché una volta buildato il jar non erano più visibili;
- spostate le risorse del client in package organizzati meglio;

TO-DO:
- mostrare la pedina sulla cella di destinazione, quando è stata selezionata quella di partenza e l'utente ci sposta il mouse sopra;
- sistemare JavaDoc;
- sistemare la history dell'avversario (probabilmente no);
- (forse) aggiungere un'opzione per il multiplayer locale?
- ora quando l'utente seleziona una pedina e sposta il cursore su una cella raggiungibile, viene mostrata la pedina su tale cella;
- piccole modifiche: Cell -> BoardPawn (ha più senso chiamarla così, ma volevo evitare confusione con State.Pawn).

TO-DO:
- sistemare JavaDoc;
- sistemare la history dell'avversario (probabilmente no);
- (forse) aggiungere un'opzione per il multiplayer locale?
- se veniva selezionata la pedina del King, nella cella di destinazione veniva mostrata quella bianca normale.
+ aggiunto scroll automatico all'ultimo elemento nella lista delle azioni;
+ resi final alcuni membri privati del controller
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant