MokaByte Numero 15 - Gennaio 1998
 
Arkanoid
di
Michele Trainotti
 Il famoso gioco dei primi anni 80, che tutti hanno provato almeno una volta, adesso realizzato in Java



Da un po' di tempo a questa parte ogni mese  cerchiamo di proporre un semplice esempio di un qualcosa che  permetta di realizzare in maniera veloce una piccola applicazione con la quale imparare  a muoversi nella programmazione di questo linguaggio.Questo mese vediamo come si può realizzare un semplice gioco, il famoso Arkanoid, e magari divertirsi un po'. Il gioco è inserito nella pagina raggiungibile cliccando qui


Arkanoid era un gioco che andava di moda alla fine degli anni ottanta, consisteva nel far colpire ad una pallina tramite un paletta una serie di mattoncini colorati.
 Volendo realizzare il gioco in java occorre modellizzarlo secondo la logica della programmazione ad oggetti. Per far ciò dobbiamo individuare le classi fondamentali che  compongono il sistema. Queste classi sono la pallina, il mattoncino e la paletta. Una volta identificate le classi base del sistema ci si accorge che esse hanno delle proprietà in comune, ad esempio tutte occupano una particolare posizione sullo schermo, tutte avranno un colore che le distingue ecc. Da questa analisi possiamo dire che tutte le classi derivano da una classe base che chiamerò  “Figura” e che ad esempio  la classe “Paletta” non è altro che una specializzazione della classe “ Mattone”.
A questo punto lo schema di rappresentazione degli elementi che compongono il sistema diventa il seguente:





Il gioco risulta quindi essere costituito da una pallina, una paletta, una serie di mattoncini che possono essere rappresentati da una lista ed un contesto di gioco. Il sistema dovrà anche occuparsi del controllo delle interazioni tra la pallina e i vari oggetti che compongono il gioco.

 Lo schema del funzionamento del gioco può ora essere rappresentato nel modo seguente:





Analizzando lo schema di funzionamento ci si accorge che il gioco si può trovare in uno dei seguenti stati:

1. Gioco in esecuzione: per intenderci è quando il giocatore sta effettivamente manovrando la paletta mentre la pallina è in movimento
2. Gioco in pausa: il gioco è in pausa quando il giocatore può muovere la paletta ma la pallina è ferma
3. Fine vita: si è in questo stato quando il giocatore perde un vita
4. Fine partita: quando il giocatore ha perso tutte le vite a disposizione
5. Mattone colpito: quando la pallina colpisce un mattoncino
6. Mattoni finiti: quando il giocatore colpisce l’ultimo mattoncino di uno schema
 

Individuati gli stati e lo schema di funzionamento del gioco è necessario ora stabilire come mantenere il controllo di esecuzione del gioco. Nel mio caso ho deciso di sviluppare una classe controllo che contiene tutti gli elementi del gioco, si occupa della gestione delle interazioni e tramite un metodo definito Controllo individua lo stato del gioco e si comporta di conseguenza.
 Nel realizzare la classe di controllo il problema più spinoso da risolvere è stato quello di realizzare una procedura che: riuscisse a controllare l’interazione della pallina con un mattoncino; determinare la  direzione di provenienza della pallina ed il lato della figura colpito. Queste informazioni sono necessarie per riuscire a ricalcolare la direzione della pallina, ad esempio se la pallina ha direzione Nord-Est e colpisce il lato a Sud del mattone, successivamente  la direzione della pallina  sarà Sud-Est ; diversamente  se il lato colpito fosse stato quello ad Ovest, la direzione della pallina sarebbe stata Nord-Ovest.


figura 4: movimenti della pallina durante il gioco

La fase di controllo dei mattoni è così articolata

Per determinare il lato in cui il mattoncino viene colpito seguo un procedimento un po’ particolare: determino la coordinata y del lato sud (è data dalla posizione del mattoncimo + la metà della sua altezza), gli sottraggo la coordinata y della pallina, se il risultato in valore assoluto è minore o uguale al raggio della pallina significa che il lato è stato colpito. Può sembrare un ragionamento contorto ma non ho trovato di meglio!…, graficamente comunque è molto più semplice da vedere:





Alla fine abbiamo la classe Applet che si occupa del ridisegno del gioco e la classe Controllo che si occupa della gestione del gioco vero e proprio. Sarebbe stato possibile scrivere solo la classe Applet ma ai tempi in cui ho scritto il gioco ero alle mie prime esperienze con java.
 
 

Prestazioni e miglioramenti
Come ho già detto i mattoncini li gestisco con una lista e questo determina un’esecuzione dell’Applet non molto brillante se fatto girare su un browser, mentre se si fa girare con Appletviewer il gioco risulta essere molto più fluido. Il motivo principale della lentezza del programma è che il metodo di controllo deve scandire tutta la lista di mattoni per determinare se c’è stata interazione o meno. Per aumentare le performance di esecuzione si potrebbero gestire i mattoncini con una matrice vincolata alla posizione del mattoncino stesso, in questo modo risulterebbe anche semplificato il metodo che determina se un mattoncino è stato colpito o meno dato che basterebbe guardare la posizione della pallina e andare a scandire solo i mattoncini vicini.
 Invito chiunque volesse a modificare liberamente il codice sorgente per migliorare il gioco stesso, per qualsiasi problema potete scrivermi al mio indirizzo e_mail.
Mi spiace di non aver avuto il tempo di commentare adeguatamente il codice e di migliorare io stesso il gioco ma sono un po’ “incasinato”con la mia tesi.

Voglio ringraziare la direzione di MokaByte e in particolar modo Giovanni Puliti che mi ha dato man forte nell’utilizzo delle librerie JDBC e RMI. Un ciao a tutti.

Download

Scarica Arkanoid
 


 


MokaByte Web  1998 - www.mokabyte.it

MokaByte ricerca nuovi collaboratori.
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it