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 ( )

            Disegna il pezzo

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

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

 

 

 

 

 

 

 

Se j = 90° (rotazione in senso antiorario rispetto all’origine degli assi che si trova nell’angolo in alto a sinistra) si ottiene

 

                                                                                                                                               

                                                                                                             

                                                            [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 ( )

 

TRASLAZIONE VERSO DESTRA

 

                        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 ( )

TRASLAZIONE VERSO SINISTRA

                                    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.