Metodologie di Programmazione: Lezione 23

Riccardo Silvestri

Game

Tramite l'implementazione di un semplice gioco del tipo Find-Treasure in un labirinto, sono illustrati due importanti aspetti del linguaggio Java. Il primo riguarda la sincronizzazione di più thread in modo tale che possano eseguire delle operazioni in modo sincronizzato, ovvero attendere che una certa condizione sia verificata prima di poter procedere. Nel caso del gioco, i giocatori sono dei programmi e le loro mosse devono essere sincronizzate per garantire che a tempi prestabiliti ogni giocatore possa eseguire al più una mossa. Per garantire ciò, ogni giocatore è eseguito in un thread esclusivamente dedicato ad esso e ogni volta che vuole eseguire una mossa invoca un metodo opportuno di un oggetto di controllo. Quando questo avviene, il metodo blocca fino a che il gestore del gioco non esegue l'aggiornamento di tutte le mosse dei giocatori e sblocca l'esecuzione dei thread dei giocatori. Per questa tipo di sincronizzazione, cioè i thread dei giocatori devono attendere che il (thread del) gestore del gioco esegue l'aggiornamento, è implementato tramite i metodi wait-notifyAll di Object.

Il secondo aspetto riguarda la possibilità di caricare nella JVM, durante l'esecuzione, nuove definizioni di classi ed eseguirle. Nell'esempio del gioco, questo è usato per permettere all'utente dell'applicazione JavaFX che realizza il gioco di poter aggiungere un nuovo giocatore, durante l'esecuzione del gioco, scegliendo il class file di una classe che implementa l'interfaccia che rappresenta un giocatore. Questo è implementato usando un ClassLoader standard fornito da URLClassLoader in java.net.

Il codice commentato del gioco è sul repo di github.

Esercizi

[Players]    Aggiungere altri giocatori al gioco implementando altre classi di tipo mp.game.maze.Player.

[Package]    Modificare il meccanismo per il caricamento della classe che implementa un giocatore permettendo che possa appartenere ad un package qualsiasi. Per ottenere il package di un class file si può usare il comando javap che ovviamente deve essere eseguito come processo esterno tramite un ProcessBuilder in java.lang.

[Moves]    Aggiungere altre mosse al gioco. Ad esempio, possibilità di vedere fino ad alcune celle di distanza, distinguere le collisioni con i muri da quelle con altri giocatori.

6 Giu 2015