venerdì 9 dicembre 2011

GoTetris: la mia versione di Tetris scritta in Java


NOME: GoTetris
LINGUAGGIO: Java
PIATTAFORMA: Indipendente
LIBRERIE: N/D
PERIODO DI SVILUPPO: 19-20 Nov, 8-9 Dic 2011

Stavo iniziando già a lavorare per un altro programma, ma visto che proprio oggi ho completato Tetris dopo 4 giorni, ho deciso di illustrare qui come ho fatto a crearlo.
Il gioco è più che altro un esercizio personale per capire meglio i Task, gli oggetti Graphics e comunque per implementare un'approccio ludico; proprio per questo, una volta scritto, non l'ho affatto curato, l'interfaccia è scarna e si limita all'essenziale, ho risolto solo i bug più invasivi tralasciando quelli che si presentano più raramente.

Per accorciare: potete scaricare da qui il file .jar (ovviamente dovete avere installata la java virtual machine sul vostro sistema).I tasti per giocare sono A(sinistra), D(destra), S(ruota), Z(avanzamento veloce).

Il gioco, lo dico subito, contiene alcuni bug noti. Il più lampante è che ogni tanto scompaiono le cornici, o non si disegna lo sfondo, ma almeno è giocabile.  Per realizzarlo ho utilizzato le primitive grafiche di java, ovvero ho fatto un uso massiccio dell'oggetto Graphics della classe Canvas (da me riscritta).

La parte principale del gioco è stata realizzata creando un TimerTask, che grazie a un oggetto di tipo Timer ho invocato il metodo public void schedule(TimerTask task, long delay, long period) che mi permette di eseguire continuamente il TimerTask con un ritardo (periodo) di period millisecondi, variabili in base al livello del gioco (500 ms livello 1, 50 ms livello 10, 0 ms >10). Non ho messo un controllo su questa variabile...teoricamente se si supera il livello 10 dovrebbe diventare ingiocabile visto che non c'è alcun ritardo.

L'interfaccia viene curata continuamente dalla classe MyCanvas che eredita da java.awt.Canvas, mentre tutto il contenuto dell'area di gioco (quella coi quadratini) viene curato dalla classe Grid (griglia) che ho creato interamente io, servendomi di altre classi "satelliti" come BlockCollection o Block, per dirne due.
Ogni blocco non è altro che un array bidimensionale 4x4 di boolean e il suo colore è passato all'oggetto Graphics prima di disegnarlo.
Così per esempio, i famosi blocchi di tetris sono stati definiti così:

public static final boolean[][] I = {{false,true,false,false},{false,true,false,false},{false,true,false,false},{false,true,false,false}};
public static final boolean[][] O = {{false,false,false,false},{true,true,false,false},{true,true,false,false},{false,false,false,false}};
public static final boolean[][] J = {{true,true,true,false},{true,false,false,false},{false,false,false,false},{false,false,false,false}};
public static final boolean[][] L = {{true,true,true,false},{false,false,true,false},{false,false,false,false},{false,false,false,false}};
public static final boolean[][] S = {{true,true,false,false},{false,true,true,false},{false,false,false,false},{false,false,false,false}};
public static final boolean[][] T = {{true,true,true,false},{false,true,false,false},{false,false,false,false},{false,false,false,false}};
public static final boolean[][] Z = {{false,true,true,false},{true,true,false,false},{false,false,false,false},{false,false,false,false}};


Il sistema dei punteggi è un po' strambo...beh almeno è originale.
Il livello è dato da questa espressione: level = (punteggio/1000)+1; mentre il punteggio viene dato ogni volta che si scala una riga con l'espressione: punteggio+=level*100;




Ultima cosa, nel programma prima di istanziare l'oggetto grid è possibile modificare il numero delle righe e il numero nelle colonne a piacimento, nonché la spaziatura in pixel fra i quadratini e la grandezza in pixel di ogni singolo quadratino.

Il codice beh...sopra c'è il file jar quindi con un disassemblatore si potrebbe leggere tutto....bye!

Nessun commento:

Posta un commento