TETRIS – MANUALE TECNICO –
Le classi contenute nel programma sono:
-
CLASSE APPLET
Metodo run ( )
Ciclicamente fino alla fine
del gioco:
·
Chiama la
procedura di creazione del pezzo (contenuta nella classe Tetrisgame)
·
Chiama la
procedura di avanzamento del pezzo in verticale (contenuta nella classe
Tetrisgame)
·
Chiama la
procedura di controllo “fine del gioco?”
·
Imposta i tempi
di discesa del pezzo a seconda del livello
Metodo update ( )
Viene
ridefinito il metodo in modo t. c. il video non venga pulito ogni volta che
viene chiamato il metodo repaint(). Non ripulendo il video, ogni volta che viene
disegnato un nuovo spostamento del pezzo bisogna cancellare solo la parte
occupata dal pezzo precedentemente disegnata.
Questa tecnica, insieme al double
buffering, viene utilizzata in questo programma per evitare lo sfarsfallio del
gioco.
Metodo
paint ( )
·
Al
raggiungimento di determinati punteggi visualizza la scritta di cambiamento
livello e ripulisce la griglia
sottostante
·
Disegna la
griglia
·
Chiama il
metodo per disegnare il pezzo (contenuto nella classe Tetrisgame)
·
Se il gioco è
finito visualizza la scritta “GameOver”
In questa classe vengono raccolti i
segnali della tastiera, se i tasti premuti sono vengono
richiamate le procedure di rotazione
(in senso orario o antiorario) e di traslazione ( a destra o a sinistra)
(contenute nella classe Base).
-
CLASSE TABELLA
Quando il pezzo viene creato, viene
disegnato come un poligono; quando però non può più avanzare perchè andrebbe ad
occupare delle zone non libere oppure perchè uscirebbe dalla griglia, il pezzo
diventa parte della griglia che contiene i pezzi già caduti precedentemente.
I pezzi che scendono possono essere
formati da 4 o 3 o 2 oppure 1 quadratino.
Questa classe contiene la struttura
di ogni quadratino: esso è formato da un intero che mi dice se il quadratino è
occupato oppure no e da 3 interi che insieme danno il colore del quadratino.
Metodo riempi ( )
Assegna il colore al quadratino e lo
setta come occupato
Metodo
libera ( )
Assegna
il colore dello sfondo dell’Applet al quadratino e lo setta come libero
-
CLASSE TETRISGAME
Crea la
griglia.
Metodo paint ( )
Metodo creaPezzo ( )
·
Sceglie un
colore in modo casuale
·
Nel livello 1
crea un pezzo scegliendolo in modo casuale tra tutti i pezzi esistenti
·
Nel livello 2
crea un pezzo scegliendolo in modo casuale tra tutti i pezzi con 4 o 3 o 2
quadratini
·
Nel livello 3
crea un pezzo scegliendolo in modo casuale tra tutti i pezzi con 4 o 3
quadratini
·
Nel livello 4
crea un pezzo scegliendolo in modo casuale tra tutti i pezzi con 4 quadratini
-
CLASSE BASE
Contiene le
procedure comuni a tutti i pezzi.
Metodo end ( )
Controlla se anche solo 1 quadratino
è occupato nella prima riga, allora vuol dire che il gioco è finito.
Metodo controlloRighe ( )
·
Per ogni riga
della matrice controlla se è piena; in caso affermativo “trasla” verso il basso
la parte di griglia sovrastante la riga piena. In particolare, se sopra trova
dei quadratini occupati setta il quadratino sotto col colore del quadratino
sopra, se invece trova un quadratino libero imposta il quadratino sotto come
libero e gli assegna il colore dello sfondo.
·
Se è stata
trovata una riga piena, la ricerca di altre righe piene ricomincia dalla prima
perchè l’eliminazione della riga e la
conseguente “traslazione” della griglia potrebbe aver fatto completare altre
righe.
Metodo ruota_antiorario ( )
·
Calcola le
coordinate di rotazione
Ogni rotazione attorno al
centro C(xc,yc) del poligono di un angolo j può essere eseguita attraverso 3
passi:
1) una traslazione dal centro C
all’origine
[x’ y’
1] = [x y 1] T –1 dove
2) una rotazione di un angolo j attorno all’origine
[x’ y’
1] = [x y 1] R0 dove
3) una traslazione dall’origine
al centro C
[x’ y’
1] = [x y 1] T
dove
Quindi la rotazione di un
angolo j attorno al centro del
poligono si ottiene facendo
[x’ y’ 1] = [x y 1] R
dove
[x’ y’ 1] = [x
y 1]
x’ = -y + yc + xc
y’
= x – xc + yc
·
Controlla se i
punti appena calcolati escono dai margini dell’applet
·
Chiama la
procedura contenuta nella classe Pezzo# (specifica per ogni pezzo) che
controlla se le coordinate di rotazione calcolate vanno ad occupare zone non
libere
·
Il vettore
oldCoord contiene le coordinate del pezzo che verrà cancellato, mentre il
vettore coordCorr contiene le coordinate del pezzo che verrà disegnato. Quindi
se i controlli precedenti vanno a buon fine, assegna al vettore oldCoord le
coordinate del pezzo precedentemente disegnato e al vettore coordCorr le
coordinate di rotazione appena calcolate.
Il metodo è synchronized per evitare
che durante l’assegnamento delle coordinate di rotazione venga richiamata
un’altra procedura (per es. attraverso un segnale da tastiera); in questo modo
rendo il metodo atomico.
Metodo ruota_orario ( )
Questa
procedura è identica alla proc. Ruota_antiorario ( ).
L’unica differenza è che j = -90°(rotazione in senso orario
rispetto all’origine degli assi che si trova nell’angolo in alto a sinistra) e
quindi nei calcoli della rotazione ottengo
[x’ y’ 1] = [x
y 1] =
x’ = y – yc + xc
y’ = -x + xc
+ yc
Metodo trasla_dx ( )
x’ = x + a
y’ = y
[x’ y’ 1] = [x
y 1]
Le operazioni di questa procedura
sono identiche a quelle della procedura
di rotazione.
Metodo
trasla_sx ( )
x’
= x – a
y’ = y
[x’ y’ 1
] = [x y 1]
Metodo scendi_veloce ( )
Continua ad incrementare le coordinate
verticali del pezzo finchè non trova delle posizioni occupate oppure finchè il
pezzo non raggiunge l’estremo inferiore
dell’applet.
Se ha trovato delle posizioni occupate, assegna come
coordinate da disegnare quelle calcolate ad un passo precedente , mentre se ha
raggiunto il limite inferiore, le coordinate calcolate sono quelle da
disegnate.
-
CLASSE PEZZO0
Crea il
pezzo, inizializzando i vertici iniziali ed il centro.
Metodo seScendi ( )
Questo
metodo controlla se il pezzo può avanzare in discesa.
·
A seconda della
posizione del pezzo, controlla se scendendo occuperà posizioni non libere
·
In caso
affermativo, chiama il metodo aggiornaGriglia( )
·
In caso
negativo, il pezzo può avanzare e quindi vengono incrementate le coordinate y
del pezzo e del centro
Metodo aggiornaGriglia ( )
·
A seconda della
posizione del pezzo riempie la griglia, chiamando la procedura riempi( ) della
classe Tabella, passandole come parametro il colore del pezzo
·
Chiama la
procedura controllaRighe( ) della classe Base per controllare, una volta che la
griglia è stata aggiornata, se qualche riga è stata completata
Metodo controllaNuoveCoord (
)
·
A seconda della
posizione del pezzo controlla se anche solo un quadratino che compone il pezzo
occupa posizione non libere
·
La procedura
restituisce true se il pezzo occupa posizioni libere, false altrimenti
Le classi relative agli altri pezzi si comportano in modo
analogo.