Tetris-like 1 ou 2 joueurs en Java

Description


Partie à un joueur
Règles du jeu
Une partie à un joueur est une course au score, c?est-à-dire au plus grand nombre de lignes constituées. De façon générale, un Tetris est une forme de casse-brique se déroulant dans une zone de jeu rectangulaire. La taille de cette zone est déterminée en nombre de briques, objet élémentaire de forme carrée. La figure ci-contre représente l?aire de jeu, généralement une matrice rectangulaire de 10 briques de largeur par 22 briques de hauteur.
La zone est initialement vide. Le jeu consiste à empiler des pièces composées de 4 briques dont les différentes formes géométriques sont les suivantes :
Les pièces arrivent une par une par le haut de la zone et chutent progressivement vers le bas de la zone. La forme de la pièce est choisie aléatoirement parmi les sept possibles. Les possibilités d?interaction pour déplacer la pièce en cours sont décrites dans la section Gameplay (notez que le point noir figurant sur chaque pièce montre le centre de la rotation). La pièce cesse de chuter si l?une de ses briques constituantes rencontre une brique déjà présente dans la zone ou le bas de la zone ; une nouvelle pièce apparaît en haut de la zone. La vitesse de descente des pièces correspond à la difficulté ; on considérera 10 niveaux de difficulté tels que pour une difficulté i, les pièces tombent à la vitesse de i briques par seconde. Lorsqu?une ligne de briques (c?est-à-dire lorsqu?une rangée est couverte de briques sur toute la largeur de la zone), le score est incrémenté de i points (i étant la difficulté courante) et la ligne disparaît ; ces disparitions occasionnent alors la chute de toutes les briques situées au-dessus d?un cran vers le bas.
Si quatre lignes superposées sont supprimées d?un coup, il s?agit alors d?un Tetris, et le score s?incrémente de 10*i points supplémentaires. Une fois la barre des 100 lignes passée, la difficulté augmente de 1. Pour terminer, le joueur perd s?il n?y a plus de place dans la zone pour faire apparaître la pièce suivante.
Interface graphique
L?interface du joueur est composée de quatre éléments :
1. la zone de jeu rectangulaire
2. la pièce suivante
3. le niveau de difficulté courant
4. le score actuel
On pourra par exemple respecter la convention graphique ci-contre.
Gameplay
Le joueur a la possibilité de faire déplacer la pièce courante d?un cran vers la droite (bouton RIGHT), d?un cran vers la gauche (bouton LEFT), d?effectuer une rotation vers la droite (bouton ROTATE) ou d?accélérer la descente (bouton DOWN). Concrètement, à chaque pression du bouton RIGHT (resp. LEFT), la pièce se déplace d?une brique sur la droite (resp. sur la gauche). Lorsque le bouton DOWN est enfoncé, la vitesse de chute passe momentanément à 40 briques par seconde ; lorsque le bouton est relâché, la vitesse de chute revient à la normale. Les touches du clavier associées aux différents boutons LEFT, RIGHT, ROTATE et DOWN sont paramétrables par le menu d?option (cf. le paragraphe Gestion des options).
En appuyant sur la touche Échap du clavier, le jeu est mis en pause et 3 fonctionnalités sont proposées :
1. Reprendre le jeu
2. Gérer les options du jeu (cf. le paragraphe Gestion des options)
3. Revenir à l?écran titre (c?est-à-dire quitter la partie courante)
Partie à deux joueurs
Règles du jeu
A deux joueurs, l?objectif n?est plus une course au score mais de tenir le plus longtemps possible face à l?adversaire. La séquence de pièces est évidemment la même pour les deux joueurs pour préserver une certaine équité. Cependant, pour corser un peu l?intérêt du jeu, un système de couleurs sera utilisé pour les briques. Ainsi si une ligne construite par l?un des joueurs contient 5 briques consécutives de même couleur, cette ligne réapparaîtra en bas de la zone de jeu de l?autre joueur causant la montée de l?ensemble des constructions de ce joueur. Cette pénalisation se fera au moment du changement de pièce courante. Le jeu de couleurs des briques est composé de 5 couleurs paramétrables (cf. le paragraphe Gestion des options). Voici un exemple de séquence de jeu possible :

Source / Exemple :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;

import javax.swing.JPanel;

/**
 *
 * @author zero
 */
public class Barre extends Figure {
    private Case []cases_;
    public Barre() {
    cases_=new Case[4];
    cases_[0]=new Case(-1,-1);
    cases_[1]=new Case(-1,-1);
    cases_[2]=new Case(-1,-1);
    cases_[3]=new Case(-1,-1);
    }
    public JPanel afficheFigure(){    
      
        PanneauFigure pan= new PanneauFigure(this);
        return pan;    
  }
    public Case getCases(int i){
      return cases_[i];
  }
  public  void descendre(Grille g) throws Exception{
      if(this.getEtat()==0){
            int ni=4; int nj=0;
            if(cases_[3].getX()!=-1){
                ni=cases_[3].getX();
                nj=cases_[3].getY()+1;
            }
            if(nj==22) throw new Exception();
      
            if(g.lireGrille(ni, nj)!=null) throw new Exception();
            if(g.lireGrille(ni, nj)==null){
                if(nj==0){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                }
                if(nj==1){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                }
                if(nj==2){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni, nj-2);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-2);
                }
                if(nj==3){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni, nj-2);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-2);
                    g.setGrille(cases_[0], ni, nj-3);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-3);
                }
                if(nj>=4){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni, nj-2);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-2);
                    g.setGrille(cases_[0], ni, nj-3);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-3);
                    g.setGrille(null, ni, nj-4);
                }
            }
              
        }
      if(this.getEtat()==1){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY()+1;
          }
          if(nj==22) throw new Exception();
          if((g.lireGrille(ni, nj)!=null)
                  ||(g.lireGrille(ni-1, nj)!=null)
                  ||(g.lireGrille(ni+1, nj)!=null)
                  ||(g.lireGrille(ni+2, nj)!=null)) throw new Exception();
          if((g.lireGrille(ni, nj)==null)
                  &&(g.lireGrille(ni-1, nj)==null)
                  &&(g.lireGrille(ni+1, nj)==null)
                  &&(g.lireGrille(ni+2, nj)==null)){
              if(nj==0){
                  g.setGrille(cases_[2], ni, nj);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[3], ni-1, nj);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj);
                  g.setGrille(cases_[1], ni+1, nj);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni+2, nj);
                  cases_[0].setX(ni+2);
                  cases_[0].setY(nj);
              }
              if(nj>=1){
                  g.setGrille(cases_[2], ni, nj);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[3], ni-1, nj);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj);
                  g.setGrille(cases_[1], ni+1, nj);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni+2, nj);
                  cases_[0].setX(ni+2);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(null, ni-1, nj-1);
                  g.setGrille(null, ni+1, nj-1);
                  g.setGrille(null, ni+2, nj-1);
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4; int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY()+1;
          }
          if(nj==22) throw new Exception();
          if(g.lireGrille(ni, nj)!=null) throw new Exception();
          if(g.lireGrille(ni, nj)==null){
               if(nj==0){
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
              }
              if(nj==1){
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
              }
              if(nj==2){
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
                  g.setGrille(cases_[2], ni, nj-2);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj-2);
              }
              if(nj==3){
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
                  g.setGrille(cases_[2], ni, nj-2);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj-2);
                  g.setGrille(cases_[3], ni, nj-3);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj-3);
                }
              if(nj>=4){
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
                  g.setGrille(cases_[2], ni, nj-2);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj-2);
                  g.setGrille(cases_[3], ni, nj-3);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj-3);
                  g.setGrille(null, ni, nj-4);
                }
            }
              
        }
      if(this.getEtat()==3){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY()+1;
          }
          if(nj==22) throw new Exception();
          if((g.lireGrille(ni, nj)!=null)
                  ||(g.lireGrille(ni+1, nj)!=null)
                  ||(g.lireGrille(ni-1, nj)!=null)
                  ||(g.lireGrille(ni-2, nj)!=null)) throw new Exception();
          if((g.lireGrille(ni, nj)==null)
                  &&(g.lireGrille(ni+1, nj)==null)
                  &&(g.lireGrille(ni-1, nj)==null)
                  &&(g.lireGrille(ni-2, nj)==null)){
              if(nj==0){
                  g.setGrille(cases_[2], ni, nj);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[3], ni+1, nj);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj);
                  g.setGrille(cases_[1], ni-1, nj);
                  cases_[1].setX(ni-1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni-2, nj);
                  cases_[0].setX(ni-2);
                  cases_[0].setY(nj);
              }
              if(nj>=1){
                  g.setGrille(cases_[2], ni, nj);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[3], ni+1, nj);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj);
                  g.setGrille(cases_[1], ni-1, nj);
                  cases_[1].setX(ni-1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni-2, nj);
                  cases_[0].setX(ni-2);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(null, ni+1, nj-1);
                  g.setGrille(null, ni-1, nj-1);
                  g.setGrille(null, ni-2, nj-1);
              }
          }
      }
  } 
  public  void deplacerGauche(Grille g){
      if(this.getEtat()==0){
          int ni=4; int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if(ni>0){
            if(nj==0){
              if(g.lireGrille(ni-1, nj)==null){
                  g.setGrille(cases_[3], ni-1, nj);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
              }
            }
            if(nj==1){
              if((g.lireGrille(ni-1, nj)==null)
                      &&(g.lireGrille(ni-1, nj-1)==null)){
                  g.setGrille(cases_[3], ni-1, nj);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[2], ni-1, nj-1);
                  cases_[2].setX(ni-1);
                  cases_[2].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
              }
            }
            if(nj==2){
              if((g.lireGrille(ni-1, nj)==null)
                      &&(g.lireGrille(ni-1, nj-1)==null)
                      &&(g.lireGrille(ni-1, nj-2)==null)){
                  g.setGrille(cases_[3], ni-1, nj);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[2], ni-1, nj-1);
                  cases_[2].setX(ni-1);
                  cases_[2].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(cases_[1], ni-1, nj-2);
                  cases_[1].setX(ni-1);
                  cases_[1].setY(nj-2);
                  g.setGrille(null, ni, nj-2);
              }
            }
            if(nj>=3){
              if((g.lireGrille(ni-1, nj)==null)
                      &&(g.lireGrille(ni-1, nj-1)==null)
                      &&(g.lireGrille(ni-1, nj-2)==null)
                      &&(g.lireGrille(ni-1, nj-3)==null)){
                  g.setGrille(cases_[3], ni-1, nj);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[2], ni-1, nj-1);
                  cases_[2].setX(ni-1);
                  cases_[2].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(cases_[1], ni-1, nj-2);
                  cases_[1].setX(ni-1);
                  cases_[1].setY(nj-2);
                  g.setGrille(null, ni, nj-2);
                  g.setGrille(cases_[0], ni-1, nj-3);
                  cases_[0].setX(ni-1);
                  cases_[0].setY(nj-3);
                  g.setGrille(null, ni, nj-3);
              }
            }
          }
      }
      if(this.getEtat()==1){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni>1){
              if(g.lireGrille(ni-2, nj)==null){
                  g.setGrille(cases_[3], ni-2, nj);
                  cases_[3].setX(ni-2);
                  cases_[3].setY(nj);
                  g.setGrille(cases_[2], ni-1, nj);
                  cases_[2].setX(ni-1);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni+1, nj);
                  cases_[0].setX(ni+1);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni+2, nj);                  
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4; int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if(ni>0){
              if(nj==0){
                  if(g.lireGrille(ni-1, nj)==null){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni-1, nj-1)==null)){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni-1, nj-1);
                      cases_[1].setX(ni-1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                  }
              }
              if(nj==2){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni-1, nj-1)==null)
                          &&(g.lireGrille(ni-1, nj-2)==null)){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni-1, nj-1);
                      cases_[1].setX(ni-1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(cases_[2], ni-1, nj-2);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj-2);
                      g.setGrille(null, ni, nj-2);
                  }
              }
              if(nj>=3){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni-1, nj-1)==null)
                          &&(g.lireGrille(ni-1, nj-2)==null)
                          &&(g.lireGrille(ni-1, nj-3)==null)){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni-1, nj-1);
                      cases_[1].setX(ni-1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(cases_[2], ni-1, nj-2);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj-2);
                      g.setGrille(null, ni, nj-2);
                      g.setGrille(cases_[3], ni-1, nj-3);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj-3);
                      g.setGrille(null, ni, nj-3);
                  }
              }
          }
      }
      if(this.getEtat()==3){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni>2){
              if(g.lireGrille(ni-3, nj)==null){
                  g.setGrille(cases_[0], ni-3, nj);
                  cases_[0].setX(ni-3);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni-2, nj);
                  cases_[1].setX(ni-2);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[2], ni-1, nj);
                  cases_[2].setX(ni-1);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[3], ni, nj);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni+1, nj);                  
              }
          }
      }
  }
  public  void deplacerDroite(Grille g){
      if(this.getEtat()==0){
          int ni=4; int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if(ni<9){
            if(nj==0){
              if(g.lireGrille(ni+1, nj)==null){
                  g.setGrille(cases_[3], ni+1, nj);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
              }
            }
            if(nj==1){
              if((g.lireGrille(ni+1, nj)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)){
                  g.setGrille(cases_[3], ni+1, nj);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[2], ni+1, nj-1);
                  cases_[2].setX(ni+1);
                  cases_[2].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
              }
            }
            if(nj==2){
              if((g.lireGrille(ni+1, nj)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)
                      &&(g.lireGrille(ni+1, nj-2)==null)){
                  g.setGrille(cases_[3], ni+1, nj);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[2], ni+1, nj-1);
                  cases_[2].setX(ni+1);
                  cases_[2].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(cases_[1], ni+1, nj-2);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj-2);
                  g.setGrille(null, ni, nj-2);
              }
            }
            if(nj>=3){
              if((g.lireGrille(ni+1, nj)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)
                      &&(g.lireGrille(ni+1, nj-2)==null)
                      &&(g.lireGrille(ni+1, nj-3)==null)){
                  g.setGrille(cases_[3], ni+1, nj);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[2], ni+1, nj-1);
                  cases_[2].setX(ni+1);
                  cases_[2].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(cases_[1], ni+1, nj-2);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj-2);
                  g.setGrille(null, ni, nj-2);
                  g.setGrille(cases_[0], ni+1, nj-3);
                  cases_[0].setX(ni+1);
                  cases_[0].setY(nj-3);
                  g.setGrille(null, ni, nj-3);
              }
            }
          }
      }
      if(this.getEtat()==1){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni<7){
              if(g.lireGrille(ni+3, nj)==null){
                  g.setGrille(cases_[0], ni+3, nj);
                  cases_[0].setX(ni+3);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni+2, nj);
                  cases_[1].setX(ni+2);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[2], ni+1, nj);
                  cases_[2].setX(ni+1);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[3], ni, nj);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj);
                  g.setGrille(null, ni-1, nj);                  
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4; int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if(ni<9){
              if(nj==0){
                  if(g.lireGrille(ni+1, nj)==null){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni+1, nj-1)==null)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                  }
              }
              if(nj==2){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni+1, nj-1)==null)
                          &&(g.lireGrille(ni+1, nj-2)==null)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(cases_[2], ni+1, nj-2);
                      cases_[2].setX(ni+1);
                      cases_[2].setY(nj-2);
                      g.setGrille(null, ni, nj-2);
                  }
              }
              if(nj>=3){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni+1, nj-1)==null)
                          &&(g.lireGrille(ni+1, nj-2)==null)
                          &&(g.lireGrille(ni+1, nj-3)==null)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(cases_[2], ni+1, nj-2);
                      cases_[2].setX(ni+1);
                      cases_[2].setY(nj-2);
                      g.setGrille(null, ni, nj-2);
                      g.setGrille(cases_[3], ni+1, nj-3);
                      cases_[3].setX(ni+1);
                      cases_[3].setY(nj-3);
                      g.setGrille(null, ni, nj-3);
                  }
              }
          }
      }
      if(this.getEtat()==3){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni<8){
              if(g.lireGrille(ni+2, nj)==null){
                  g.setGrille(cases_[3], ni+2, nj);
                  cases_[3].setX(ni+2);
                  cases_[3].setY(nj);
                  g.setGrille(cases_[2], ni+1, nj);
                  cases_[2].setX(ni+1);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni-1, nj);
                  cases_[0].setX(ni-1);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni-2, nj);                  
              }
          }
      }
  }
  public  void rotate(Grille g){ 
      if(this.getEtat()==0){
          int ni=4;
          int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if((ni>0) && (ni<8)){
              if(nj==1){
                  if((g.lireGrille(ni-1, nj-1)==null) 
                          && (g.lireGrille(ni+1, nj-1)==null) 
                          &&  (g.lireGrille(ni+2, nj-1)==null)){
                      g.setGrille(cases_[3], ni-1, nj-1);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj-1);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[0], ni+2, nj-1);
                      cases_[0].setX(ni+2);
                      cases_[0].setY(nj-1);
                      this.setEtat(1);
                      return;
                  }
              }
              if(nj==2){
                  if((g.lireGrille(ni-1, nj-1)==null) 
                          && (g.lireGrille(ni+1, nj-1)==null) 
                          &&  (g.lireGrille(ni+2, nj-1)==null)){
                      g.setGrille(cases_[3], ni-1, nj-1);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj-1);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[0], ni+2, nj-1);
                      cases_[0].setX(ni+2);
                      cases_[0].setY(nj-1);
                      g.setGrille(null, ni, nj-2);
                      this.setEtat(1);
                      return;
                  }
              }
              if(nj>=3){
                  if((g.lireGrille(ni-1, nj-1)==null) 
                          && (g.lireGrille(ni+1, nj-1)==null) 
                          &&  (g.lireGrille(ni+2, nj-1)==null)){
                      g.setGrille(cases_[3], ni-1, nj-1);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj-1);
                      g.setGrille(null, ni, nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[0], ni+2, nj-1);
                      cases_[0].setX(ni+2);
                      cases_[0].setY(nj-1);
                      g.setGrille(null, ni, nj-2);
                      g.setGrille(null, ni, nj-3);
                      this.setEtat(1);
                      return;
                  }
              }
          }
      }
      if(this.getEtat()==1){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(nj==0){
              if((g.lireGrille(ni, nj+1)==null)
                      &&(g.lireGrille(ni, nj+2)==null)){
                  cases_[3].setX(-1);
                  cases_[3].setY(-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(cases_[1], ni, nj+1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj+1);
                  g.setGrille(null, ni+1, nj);
                  g.setGrille(cases_[0], ni, nj+2);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj+2);
                  g.setGrille(null, ni+2, nj);
                  this.setEtat(2);
                  return;
              }
          }
          if(nj>=1){
              if((g.lireGrille(ni, nj+1)==null)
                      &&(g.lireGrille(ni, nj+2)==null)){
                  g.setGrille(cases_[3], ni, nj-1);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(cases_[1], ni, nj+1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj+1);
                  g.setGrille(null, ni+1, nj);
                  g.setGrille(cases_[0], ni, nj+2);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj+2);
                  g.setGrille(null, ni+2, nj);
                  this.setEtat(2);
                  return;
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4; int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if((ni>1)&&(ni<9)){
              if(nj==2){
                  if((g.lireGrille(ni+1, nj-2)==null) 
                          &&(g.lireGrille(ni-1, nj-2)==null)
                          &&(g.lireGrille(ni-2, nj-2)==null)){
                          g.setGrille(cases_[3], ni+1, nj-2);
                          cases_[3].setX(ni+1);
                          cases_[3].setY(nj-2);
                          g.setGrille(cases_[1], ni-1, nj-2);
                          cases_[1].setX(ni-1);
                          cases_[1].setY(nj-2);
                          g.setGrille(cases_[0], ni-2, nj-2);
                          cases_[0].setX(ni-2);
                          cases_[0].setY(nj-2);
                          g.setGrille(null, ni, nj-1);
                          g.setGrille(null, ni, nj);
                          this.setEtat(3);
                          return;
                  }
              }
              if(nj>=3){
                  if((g.lireGrille(ni+1, nj-2)==null) 
                          &&(g.lireGrille(ni-1, nj-2)==null)
                          &&(g.lireGrille(ni-2, nj-2)==null)){
                          g.setGrille(cases_[3], ni+1, nj-2);
                          cases_[3].setX(ni+1);
                          cases_[3].setY(nj-2);
                          g.setGrille(null, ni, nj-3);
                          g.setGrille(cases_[1], ni-1, nj-2);
                          cases_[1].setX(ni-1);
                          cases_[1].setY(nj-2);
                          g.setGrille(cases_[0], ni-2, nj-2);
                          cases_[0].setX(ni-2);
                          cases_[0].setY(nj-2);
                          g.setGrille(null, ni, nj-1);
                          g.setGrille(null, ni, nj);
                          this.setEtat(3);
                          return;
                  }
              }
          }
      }
      if(this.getEtat()==3){
          int ni=4; int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(nj==0){
              if(g.lireGrille(ni, nj+1)==null){
                  cases_[0].setX(-1);
                  cases_[0].setY(-1);
                  g.setGrille(null, ni-2, nj);
                  cases_[1].setX(-1);
                  cases_[1].setY(-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(cases_[3], ni, nj+1);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj+1);
                  g.setGrille(null, ni+1, nj);
                  this.setEtat(0);
                  return;
              }
          }
          if(nj==1){
              if((g.lireGrille(ni, nj+1)==null)
                      && (g.lireGrille(ni, nj-1)==null)){
                  cases_[0].setX(-1);
                  cases_[0].setY(-1);
                  g.setGrille(null, ni-2, nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(cases_[3], ni, nj+1);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj+1);
                  g.setGrille(null, ni+1, nj);
                  this.setEtat(0);
                  return;
              }
          }
          if(nj>=2){
              if((g.lireGrille(ni, nj+1)==null)
                      && (g.lireGrille(ni, nj-1)==null)
                      && (g.lireGrille(ni, nj-2)==null)){
                  g.setGrille(cases_[0], ni, nj-2);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj-2);
                  g.setGrille(null, ni-2, nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(cases_[3], ni, nj+1);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj+1);
                  g.setGrille(null, ni+1, nj);
                  this.setEtat(0);
                  return;
              }
          }
      }
  }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;

import java.awt.Color;

/**
 *
 * @author zero
 */
public class Case {
    private int x_;
    private int y_;
    private Color couleur_;
    public Case(int x, int y){
        x_=x;
        y_=y;
       //Min + (int)(Math.random() * ((Max - Min) + 1))
        int n=  (int)(Math.random()*5);
        if(Controle.couleure_dalt==0){
        if(n==0) couleur_=Color.green;
        //if(n==1) couleur_=Color.blue;
        if(n==1) couleur_=Color.green;
        //if(n==2) couleur_=Color.red;
        if(n==2) couleur_=Color.green;
        //if(n==3) couleur_=Color.yellow;
        if(n==3) couleur_=Color.green;
        //if(n==4) couleur_=new Color(200, 30, 240);//violet
        if(n==4) couleur_=Color.green;
        }
        else if(Controle.couleure_dalt==1){
            if(n==0) couleur_=Color.green;
            if(n==1) couleur_=new Color(95,158,160);// Cadet Blue
            if(n==2) couleur_=new Color(105,105,105);//Dim Gray
            if(n==3) couleur_=Color.yellow;
            if(n==4) couleur_=new Color(205,200,177);//Cornsilk 3
        }
    }
    public int getX(){
        return x_;
    }
    public int getY(){
        return y_;
    }
    public Color getCouleur(){
        return couleur_;
    }
    public void setCouleur(Color r){
        couleur_=r;
    }
    public void setX(int x){
        x_=x;
    }
    public void setY(int y){
        y_=y;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Controle {
    static int couleure_dalt=0;   
    
    public static void simul(Grille g){
        int nb_supp=g.getNbr_ligneSup();
        g.mise_ajourGrille();
        nb_supp=g.getNbr_ligneSup()-nb_supp;
        if((nb_supp<4)&&(nb_supp>=0)){
            //score= score + nbr de lignes supp * difficulté
            g.setScore(g.getScore()+nb_supp*g.getDifficulté());            
        }
        if(nb_supp>=4){
            //score= score + nbr de lignes supp * 10 * difficulté
            g.setScore(g.getScore()+10*nb_supp*g.getDifficulté());
        }
        if(g.getDifficulté()<=10){
        //difficulté= (|(difficulté+100)/100|)
        g.setDifficulté((int)((g.getNbr_ligneSup()+100)/100));
        }        
    }
   
    public static void simul_2(Grille g1,Grille g2){        
        g1.mise_ajour2(g2);
    }   
    
    public static Figure newFigure(){
        Figure f;//=new L();
        int n=(int)(Math.random()*7);
       
         switch (n) {
            case 0:  f= new S();
                    break;
            case 1:  f = new L_retourné();
                     break;
            case 2:  f = new T();
                     break;
            case 3:  f = new Z();
                     break;
            case 4:  f = new Cube();
                     break;
            case 5:  f = new Barre();
                     break;
            default: f=new L();
                     break;
         }
       
        return f;
    } 
    
    public static int delay(Grille g){
        int delay;
        int diff =g.getDifficulté();
        switch (diff) {
            case 1:   delay=1000 ;
                    break;
            case 2:  delay =900 ;
                     break;
            case 3:  delay = 800;
                     break;
            case 4:  delay = 700;
                     break;
            case 5:  delay = 600;
                     break;
            case 6:  delay = 500;
                     break;
            case 7:  delay = 400;
                     break;
            case 8:  delay = 300;
                     break;
            case 9:  delay = 200;
                     break;
            default: delay= 100;
                     break;
         }
        return delay;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Cube extends Figure {
    private Case [] cases_;
    public Cube() {
    cases_=new Case[4];
    cases_[0]=new Case(-1,-1);
    cases_[1]=new Case(-1,-1);
    cases_[2]=new Case(-1,-1);
    cases_[3]=new Case(-1,-1);
    }
 public Case getCases(int i){
      return cases_[i];
  }
 public JPanel afficheFigure(){    
        PanneauFigure pan= new PanneauFigure(this);
        return pan;    
  }
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */    
    public  void descendre(Grille g) throws Exception{
        if(this.getEtat()==0){
            int ni=4; int nj=0;
            if(cases_[1].getX()!=-1){
                ni=cases_[1].getX();
                nj=cases_[1].getY()+1;
            }
            //cas du bas de la grille
            if (nj==22) throw new Exception();
            //cas verif case en dessous occupé
            if((g.lireGrille(ni, nj)!=null) ||  (g.lireGrille(ni+1, nj)!=null))
                throw new Exception();
            if((g.lireGrille(ni, nj)==null) && (g.lireGrille(ni+1, nj)==null)){
                if(nj==0){
                    g.setGrille(cases_[1], ni, nj);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj);
                }
                if(nj==1){
                    g.setGrille(cases_[1], ni, nj);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[0], ni, nj-1);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-1);
                    g.setGrille(cases_[3], ni+1, nj-1);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj-1);
                }
                if(nj>=2){
                    g.setGrille(cases_[1], ni, nj);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[0], ni, nj-1);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-1);
                    g.setGrille(cases_[3], ni+1, nj-1);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni, nj-2);
                    g.setGrille(null, ni+1, nj-2);
                }
            } 
        }
        if(this.getEtat()==1){            
            int ni=4; int nj=0;
            if(cases_[2].getX()!=-1){
                ni=cases_[2].getX();
                nj=cases_[2].getY()+1;
            }
            //cas du bas de la grille
            if (nj==22) throw new Exception();
            //cas verif case en dessous occupé
            if((g.lireGrille(ni, nj)!=null) ||  (g.lireGrille(ni+1, nj)!=null))
                throw new Exception();
            if((g.lireGrille(ni, nj)==null) && (g.lireGrille(ni+1, nj)==null)){
                if(nj==0){
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[3], ni+1, nj);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj);
                }
                if(nj==1){
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[3], ni+1, nj);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[1], ni, nj-1);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[0], ni+1, nj-1);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj-1);
                }
                if(nj>=2){
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[3], ni+1, nj);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[1], ni, nj-1);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[0], ni+1, nj-1);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj-1);
                    g.setGrille(null, ni, nj-2);
                    g.setGrille(null, ni+1, nj-2);
                }
                
            } 
        }
        if(this.getEtat()==2){
            int ni=4; int nj=0;
            if(cases_[3].getX()!=-1){
                ni=cases_[3].getX();
                nj=cases_[3].getY()+1;
            }
            //cas du bas de la grille
            if (nj==22) throw new Exception();
            //cas verif case en dessous occupé
            if((g.lireGrille(ni, nj)!=null) ||  (g.lireGrille(ni+1, nj)!=null))
                throw new Exception();
            if((g.lireGrille(ni, nj)==null) && (g.lireGrille(ni+1, nj)==null)){
                if(nj==0){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[0], ni+1, nj);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj);
                }
                if(nj==1){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[0], ni+1, nj);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni+1, nj-1);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj-1);
                }
                if(nj>=2){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[0], ni+1, nj);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni+1, nj-1);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj-1);
                    g.setGrille(null, ni, nj-2);
                    g.setGrille(null, ni+1, nj-2);
                }                
            } 
        }
        if(this.getEtat()==3){
            int ni=4; int nj=0;
            if(cases_[0].getX()!=-1){
                ni=cases_[0].getX();
                nj=cases_[0].getY()+1;
            }
            //cas du bas de la grille
            if (nj==22) throw new Exception();
            //cas verif case en dessous occupé
            if((g.lireGrille(ni, nj)!=null) ||  (g.lireGrille(ni+1, nj)!=null))
                throw new Exception();
            
            if((g.lireGrille(ni, nj)==null) 
                    && (g.lireGrille(ni+1, nj)==null)){
                if(nj==0){
                    g.setGrille(cases_[0], ni, nj);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                }
                if(nj==1){
                    g.setGrille(cases_[0], ni, nj);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                }
                if(nj>=2){
                    g.setGrille(cases_[0], ni, nj);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                    g.setGrille(null, ni, nj-2);
                    g.setGrille(null, ni+1, nj-2);
                }                
            } 
        }
    
    } 
    public  void deplacerGauche(Grille g){
        if(this.getEtat()==0){
            int ni=4; int nj=0;
            if(this.cases_[1].getX()!=-1){
                ni=cases_[1].getX();
                nj=cases_[1].getY();
            }
            if(ni>0){
                if(nj==0){
                    if(this.cases_[1].getX()!=-1){
                        if(g.lireGrille(ni-1, nj)==null){
                            g.setGrille(cases_[1], ni-1, nj);
                            cases_[1].setX(ni-1);
                            cases_[1].setY(nj);
                            g.setGrille(cases_[2], ni, nj);
                            cases_[2].setX(ni);
                            cases_[2].setY(nj);
                            g.setGrille(null, ni+1, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni-1, nj)==null) 
                            && (g.lireGrille(ni-1, nj-1)==null)){
                            g.setGrille(cases_[1], ni-1, nj);
                            cases_[1].setX(ni-1);
                            cases_[1].setY(nj);
                            g.setGrille(cases_[2], ni, nj);
                            cases_[2].setX(ni);
                            cases_[2].setY(nj);
                            g.setGrille(null, ni+1, nj);
                            g.setGrille(cases_[0], ni-1, nj-1);
                            cases_[0].setX(ni-1);
                            cases_[0].setY(nj-1);
                            g.setGrille(cases_[3], ni, nj-1);
                            cases_[3].setX(ni);
                            cases_[3].setY(nj-1);
                            g.setGrille(null, ni+1, nj-1);
                    }
                }
            }
        }
        if(this.getEtat()==1){
            int ni=4; int nj=0;
            if(this.cases_[2].getX()!=-1){
                ni=cases_[2].getX();
                nj=cases_[2].getY();
            }
            if(ni>0){
                if(nj==0){
                    if(this.cases_[2].getX()!=-1){
                        if(g.lireGrille(ni-1, nj)==null){
                            g.setGrille(cases_[2], ni-1, nj);
                            cases_[2].setX(ni-1);
                            cases_[2].setY(nj);
                            g.setGrille(cases_[3], ni, nj);
                            cases_[3].setX(ni);
                            cases_[3].setY(nj);
                            g.setGrille(null, ni+1, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni-1, nj)==null) 
                            && (g.lireGrille(ni-1, nj-1)==null)){
                            g.setGrille(cases_[2], ni-1, nj);
                            cases_[2].setX(ni-1);
                            cases_[2].setY(nj);
                            g.setGrille(cases_[3], ni, nj);
                            cases_[3].setX(ni);
                            cases_[3].setY(nj);
                            g.setGrille(null, ni+1, nj);
                            g.setGrille(cases_[1], ni-1, nj-1);
                            cases_[1].setX(ni-1);
                            cases_[1].setY(nj-1);
                            g.setGrille(cases_[0], ni, nj-1);
                            cases_[0].setX(ni);
                            cases_[0].setY(nj-1);
                            g.setGrille(null, ni+1, nj-1);
                    }
                }
            }
        }
        if(this.getEtat()==2){
            int ni=4; int nj=0;
            if(this.cases_[3].getX()!=-1){
                ni=cases_[3].getX();
                nj=cases_[3].getY();
            }
            if(ni>0){
                if(nj==0){
                    if(this.cases_[3].getX()!=-1){
                        if(g.lireGrille(ni-1, nj)==null){
                            g.setGrille(cases_[3], ni-1, nj);
                            cases_[3].setX(ni-1);
                            cases_[3].setY(nj);
                            g.setGrille(cases_[0], ni, nj);
                            cases_[0].setX(ni);
                            cases_[0].setY(nj);
                            g.setGrille(null, ni+1, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni-1, nj)==null) 
                            && (g.lireGrille(ni-1, nj-1)==null)){
                            g.setGrille(cases_[3], ni-1, nj);
                            cases_[3].setX(ni-1);
                            cases_[3].setY(nj);
                            g.setGrille(cases_[0], ni, nj);
                            cases_[0].setX(ni);
                            cases_[0].setY(nj);
                            g.setGrille(null, ni+1, nj);
                            g.setGrille(cases_[2], ni-1, nj-1);
                            cases_[2].setX(ni-1);
                            cases_[2].setY(nj-1);
                            g.setGrille(cases_[1], ni, nj-1);
                            cases_[1].setX(ni);
                            cases_[1].setY(nj-1);
                            g.setGrille(null, ni+1, nj-1);
                    }
                }
            }
        }
        if(this.getEtat()==3){
            int ni=4; int nj=0;
            if(this.cases_[0].getX()!=-1){
                ni=cases_[0].getX();
                nj=cases_[0].getY();
            }
            if(ni>0){
                if(nj==0){
                    if(this.cases_[0].getX()!=-1){
                        if(g.lireGrille(ni-1, nj)==null){
                            g.setGrille(cases_[0], ni-1, nj);
                            cases_[0].setX(ni-1);
                            cases_[0].setY(nj);
                            g.setGrille(cases_[1], ni, nj);
                            cases_[1].setX(ni);
                            cases_[1].setY(nj);
                            g.setGrille(null, ni+1, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni-1, nj)==null) 
                            && (g.lireGrille(ni-1, nj-1)==null)){
                            g.setGrille(cases_[0], ni-1, nj);
                            cases_[0].setX(ni-1);
                            cases_[0].setY(nj);
                            g.setGrille(cases_[1], ni, nj);
                            cases_[1].setX(ni);
                            cases_[1].setY(nj);
                            g.setGrille(null, ni+1, nj);
                            g.setGrille(cases_[3], ni-1, nj-1);
                            cases_[3].setX(ni-1);
                            cases_[3].setY(nj-1);
                            g.setGrille(cases_[2], ni, nj-1);
                            cases_[2].setX(ni);
                            cases_[2].setY(nj-1);
                            g.setGrille(null, ni+1, nj-1);
                    }
                }
            }
        }
    }
    public  void deplacerDroite(Grille g){ 
        if(this.getEtat()==0){
            int ni=4; int nj=0;
            if(cases_[1].getX()!=-1){
                ni=cases_[1].getX();
                nj=cases_[1].getY();
            }        
            if(ni<8){
                if(nj==0){
                    if(cases_[1].getX()!=-1){
                        if(g.lireGrille(ni+2, nj)==null){
                            g.setGrille(this.cases_[2], ni+2, nj);
                            cases_[2].setX(ni+2);
                            cases_[2].setY(nj);
                            g.setGrille(this.cases_[1], ni+1, nj);
                            cases_[1].setX(ni+1);
                            cases_[1].setY(nj);
                            g.setGrille(null, ni, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni+2, nj)==null) 
                            && (g.lireGrille(ni+2, nj-1)==null)){
                        g.setGrille(this.cases_[2], ni+2, nj);
                        cases_[2].setX(ni+2);
                        cases_[2].setY(nj);
                        g.setGrille(this.cases_[1], ni+1, nj);
                        cases_[1].setX(ni+1);
                        cases_[1].setY(nj); 
                        g.setGrille(null, ni, nj);
                        g.setGrille(cases_[3], ni+2, nj-1);
                        cases_[3].setX(ni+2);
                        cases_[3].setY(nj-1);
                        g.setGrille(cases_[0], ni+1, nj-1);
                        cases_[0].setX(ni+1);
                        cases_[0].setY(nj-1);
                        g.setGrille(null, ni, nj-1);
                    }
                }
            }
        }
        if(this.getEtat()==1){
            int ni=4; int nj=0;
            if(cases_[2].getX()!=-1){
                ni=cases_[2].getX();
                nj=cases_[2].getY();
            }        
            if(ni<8){
                if(nj==0){
                    if(cases_[2].getX()!=-1){
                        if(g.lireGrille(ni+2, nj)==null){
                            g.setGrille(this.cases_[3], ni+2, nj);
                            cases_[3].setX(ni+2);
                            cases_[3].setY(nj);
                            g.setGrille(this.cases_[2], ni+1, nj);
                            cases_[2].setX(ni+1);
                            cases_[2].setY(nj);
                            g.setGrille(null, ni, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni+2, nj)==null)
                            && (g.lireGrille(ni+2, nj-1)==null)){
                        g.setGrille(this.cases_[3], ni+2, nj);
                        cases_[3].setX(ni+2);
                        cases_[3].setY(nj);
                        g.setGrille(this.cases_[2], ni+1, nj);
                        cases_[2].setX(ni+1);
                        cases_[2].setY(nj); 
                        g.setGrille(null, ni, nj);
                        g.setGrille(cases_[0], ni+2, nj-1);
                        cases_[0].setX(ni+2);
                        cases_[0].setY(nj-1);
                        g.setGrille(cases_[1], ni+1, nj-1);
                        cases_[1].setX(ni+1);
                        cases_[1].setY(nj-1);
                        g.setGrille(null, ni, nj-1);
                    }
                }
            }
        }
        if(this.getEtat()==2){
            int ni=4; int nj=0;
            if(cases_[3].getX()!=-1){
                ni=cases_[3].getX();
                nj=cases_[3].getY();
            }        
            if(ni<8){
                if(nj==0){
                    if(cases_[3].getX()!=-1){
                        if(g.lireGrille(ni+2, nj)==null){
                            g.setGrille(this.cases_[0], ni+2, nj);
                            cases_[0].setX(ni+2);
                            cases_[0].setY(nj);
                            g.setGrille(this.cases_[3], ni+1, nj);
                            cases_[3].setX(ni+1);
                            cases_[3].setY(nj);
                            g.setGrille(null, ni, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni+2, nj)==null) 
                            && (g.lireGrille(ni+2, nj-1)==null)){
                        g.setGrille(this.cases_[0], ni+2, nj);
                        cases_[0].setX(ni+2);
                        cases_[0].setY(nj);
                        g.setGrille(this.cases_[3], ni+1, nj);
                        cases_[3].setX(ni+1);
                        cases_[3].setY(nj); 
                        g.setGrille(null, ni, nj);
                        g.setGrille(cases_[1], ni+2, nj-1);
                        cases_[1].setX(ni+2);
                        cases_[1].setY(nj-1);
                        g.setGrille(cases_[2], ni+1, nj-1);
                        cases_[2].setX(ni+1);
                        cases_[2].setY(nj-1);
                        g.setGrille(null, ni, nj-1);
                    }
                }
            }
        }
        if(this.getEtat()==3){
            int ni=4; int nj=0;
            if(cases_[0].getX()!=-1){
                ni=cases_[0].getX();
                nj=cases_[0].getY();
            }        
            if(ni<8){
                if(nj==0){
                    if(cases_[0].getX()!=-1){
                        if(g.lireGrille(ni+2, nj)==null){
                            g.setGrille(this.cases_[1], ni+2, nj);
                            cases_[1].setX(ni+2);
                            cases_[1].setY(nj);
                            g.setGrille(this.cases_[0], ni+1, nj);
                            cases_[0].setX(ni+1);
                            cases_[0].setY(nj);
                            g.setGrille(null, ni, nj);
                        }
                    }
                }
                if(nj>=1){
                    if((g.lireGrille(ni+2, nj)==null) 
                            && (g.lireGrille(ni+2, nj-1)==null)){
                        g.setGrille(this.cases_[1], ni+2, nj);
                        cases_[1].setX(ni+2);
                        cases_[1].setY(nj);
                        g.setGrille(this.cases_[0], ni+1, nj);
                        cases_[0].setX(ni+1);
                        cases_[0].setY(nj); 
                        g.setGrille(null, ni, nj);
                        g.setGrille(cases_[2], ni+2, nj-1);
                        cases_[2].setX(ni+2);
                        cases_[2].setY(nj-1);
                        g.setGrille(cases_[3], ni+1, nj-1);
                        cases_[3].setX(ni+1);
                        cases_[3].setY(nj-1);
                        g.setGrille(null, ni, nj-1);
                    }
                }
            }
        }        
    }
    public  void rotate(Grille g){ 
        if(this.getEtat()==0){
            int ni=4; int nj=0;
            if(cases_[1].getX()!=-1){
                ni=cases_[1].getX();
                nj=cases_[1].getY();
            }        
            if((nj==0) && (cases_[1].getX()!=-1)){
                cases_[1].setX(-1);
                cases_[1].setY(-1);
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni+1, nj);
                cases_[3].setX(ni+1);
                cases_[3].setY(nj);
                this.setEtat(1);
            return;
            }
            if((nj>=1) && (cases_[1].getX()!=-1)){
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni+1, nj);
                cases_[3].setX(ni+1);
                cases_[3].setY(nj);
                g.setGrille(cases_[0], ni+1, nj-1);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj-1);
                g.setGrille(cases_[1], ni, nj-1);
                cases_[1].setX(ni);
                cases_[1].setY(nj-1);
                this.setEtat(1);
            return;
            }
            
        }
        if(this.getEtat()==1){
            int ni=4; int nj=0;
            if(cases_[2].getX()!=-1){
                ni=cases_[2].getX();
                nj=cases_[2].getY();
            }
            if((nj==0) && (cases_[2].getX()!=-1)){
                cases_[2].setX(-1);
                cases_[2].setY(-1);
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(cases_[0], ni+1, nj);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj);
                this.setEtat(2);
            return;
            }
            if((nj>=1) && (cases_[2].getX()!=-1)){
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(cases_[0], ni+1, nj);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj);
                g.setGrille(cases_[1], ni+1, nj-1);
                cases_[1].setX(ni+1);
                cases_[1].setY(nj-1);
                g.setGrille(cases_[2], ni, nj-1);
                cases_[2].setX(ni);
                cases_[2].setY(nj-1);
                this.setEtat(2);
            return;
            }
            
        }        
        if(this.getEtat()==2){
            int ni=4; int nj=0;
            if(cases_[3].getX()!=-1){
                ni=cases_[3].getX();
                nj=cases_[3].getY();
            }
            if((nj==0) && (cases_[3].getX()!=-1)){
                cases_[3].setX(-1);
                cases_[3].setY(-1);
                g.setGrille(cases_[0], ni, nj);
                cases_[0].setX(ni);
                cases_[0].setY(nj);
                g.setGrille(cases_[1], ni+1, nj);
                cases_[1].setX(ni+1);
                cases_[1].setY(nj);
                this.setEtat(3);
                return;
            }
            if((nj>=1) && (cases_[3].getX()!=-1)){
                g.setGrille(cases_[0], ni, nj);
                cases_[0].setX(ni);
                cases_[0].setY(nj);
                g.setGrille(cases_[1], ni+1, nj);
                cases_[1].setX(ni+1);
                cases_[1].setY(nj);
                g.setGrille(cases_[2], ni+1, nj-1);
                cases_[2].setX(ni+1);
                cases_[2].setY(nj-1);
                g.setGrille(cases_[3], ni, nj-1);
                cases_[3].setX(ni);
                cases_[3].setY(nj-1);
                this.setEtat(3);
                return;
            }
            
        }
        if(this.getEtat()==3){
            int ni=4; int nj=0;
            if(cases_[0].getX()!=-1){
                ni=cases_[0].getX();
                nj=cases_[0].getY();
            }
            if((nj==0) && (cases_[0].getX()!=-1)){
                cases_[0].setX(-1);
                cases_[0].setY(-1);
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[2], ni+1, nj);
                cases_[2].setX(ni+1);
                cases_[2].setY(nj);
                this.setEtat(0);
                return;
            }
            if((nj>=1) && (cases_[0].getX()!=-1)){                
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[2], ni+1, nj);
                cases_[2].setX(ni+1);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni+1, nj-1);
                cases_[3].setX(ni+1);
                cases_[3].setY(nj-1);
                g.setGrille(cases_[0], ni, nj-1);
                cases_[0].setX(ni);
                cases_[0].setY(nj-1);
                this.setEtat(0);
                return;
            }
            
        }            
    }
}


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Fenetre.java
 *
 * Created on 21 déc. 2012, 11:55:17
 */
package tetris;


import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Fenetre extends javax.swing.JFrame implements KeyListener {
    private Figure fig_;
    private Figure fig_next_;
    private int delai_=1000;
    private Grille grille_;
    private JPanel affichage_;
    private JPanel affichage_fig;    

    /** Creates new form Fenetre */
    public Fenetre(Grille g) {
        
        initComponents();        
        //new AddKeyListener(this);
        jLabel3.setVisible(false);        
        jTextPane2.setEditable(false);
        grille_=g;
        affichage_=grille_.afficheGrille();
        affichage_.setBounds(0,0,251,551);
        jPanel2.setBackground(Color.black);
        jPanel2.add(affichage_);       
        affichage_.setBackground(Color.black);
        jLabel1.setText(""+grille_.getScore());
        jLabel2.setText(""+grille_.getDifficulté());
        
        //next figure                   
        fig_next_=Controle.newFigure();//new L();
        
       
        fig_=fig_next_;
        //
        addKeyListener(this); 
        addWindowListener(new WindowAdapter() {
 public void windowOpened(WindowEvent e) { 
 requestFocus(); 
 }
 });
        jCheckBox1.addActionListener(new JCheckBoxListener());
    }
    
    
private Timer timer = new Timer(delai_, new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Inserer ici le code a repeter
    try{
    fig_.descendre(grille_);
    //System.out.println("try      :"+test++);
    }
    catch (Exception ex) {
        
        if((grille_.lireGrille(4, 0)!=null)
                    ||(grille_.lireGrille(5, 0)!=null)){
            
                jLabel3.setVisible(true);                
                //affichage_.setVisible(false);
                affichage_.add(jLabel3);
                affichage_.repaint();
                //affichage_.setEnabled(true);
                timer.stop();
                //System.out.println("je suis là");
                return;
                }           
            //timer.stop();
            Controle.simul(grille_);
            delai_=Controle.delay(grille_);
            timer.setDelay(delai_);
            jLabel1.setText(""+grille_.getScore());
            jLabel2.setText(""+grille_.getDifficulté());            
            affichage_.repaint();            
            fig_=fig_next_;
            fig_next_=Controle.newFigure();           
            //timer.start();          
                affichage_fig=fig_next_.afficheFigure();                
                jPanel3.add(affichage_fig);
                affichage_fig.repaint();
                affichage_fig.setBounds(0,0,101,101);
                affichage_fig.setBackground(Color.black);
                //System.out.println("fig"+fig_+"   "+test);
               // System.out.println("fig next "+fig_next_);
                
            }
    finally{        
        affichage_.repaint();
        //System.out.println("finaly:   "+fig_+"   "+test);
        }    
    }
}
);
public void simulatoin(){        
    fig_next_=Controle.newFigure();//new Z();/new L();
    affichage_fig=fig_next_.afficheFigure();
    jPanel3.add(affichage_fig);
    affichage_fig.repaint();
    affichage_fig.setBounds(0,0,101,101);
    affichage_fig.setBackground(Color.black);    
    timer.start();
    
    }
    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel5 = new javax.swing.JPanel();
        jCheckBox1 = new javax.swing.JCheckBox();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextPane2 = new javax.swing.JTextPane();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();

        jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Option"));

        jCheckBox1.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jCheckBox1.setText("couleurs Daltonien");

        jTextPane2.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Touches", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, java.awt.Color.black));
        jTextPane2.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jTextPane2.setText("Boutons de Gameplay du joueur 1 :n n? LEFT : touche directionnelle gauche n? RIGHT : touche directionnelle droite n? ROTATE : touche directionnelle hautn? DOWN : touche directionnelle bas");
        jTextPane2.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        jScrollPane2.setViewportView(jTextPane2);

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addGap(24, 24, 24)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 297, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addGap(84, 84, 84)
                        .addComponent(jCheckBox1)))
                .addContainerGap(23, Short.MAX_VALUE))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jCheckBox1)
                .addContainerGap(60, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel2.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jPanel2.setPreferredSize(new java.awt.Dimension(251, 551));

        jLabel3.setBackground(new java.awt.Color(204, 255, 0));
        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 30));
        jLabel3.setForeground(new java.awt.Color(255, 0, 0));
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("!!GAME OVER!!");
        jLabel3.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jLabel3.setOpaque(true);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 207, Short.MAX_VALUE)
                .addGap(22, 22, 22))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(194, 194, 194)
                .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)
                .addGap(245, 245, 245))
        );

        jLabel1.setBackground(new java.awt.Color(255, 255, 255));
        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("jLabel1");
        jLabel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Score:"));
        jLabel1.setOpaque(true);

        jLabel2.setBackground(new java.awt.Color(255, 255, 255));
        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("jLabel2");
        jLabel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Difficulté:"));
        jLabel2.setOpaque(true);

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Next figure "));
        jPanel3.setPreferredSize(new java.awt.Dimension(101, 101));

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 89, Short.MAX_VALUE)
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 78, Short.MAX_VALUE)
        );

        jLabel4.setText("Echap: pour aller dans Option");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 105, Short.MAX_VALUE)
                    .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(64, 64, 64))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(60, 60, 60)
                .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE)
                .addGap(229, 229, 229))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 15, Short.MAX_VALUE)
                        .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(40, 40, 40)
                        .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(51, 51, 51)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(56, 56, 56)
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        jLabel1.getAccessibleContext().setAccessibleDescription("");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        
 


    

  

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Fenetre.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Fenetre.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Fenetre.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Fenetre.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Fenetre f=new Fenetre(new Grille());
                f.setVisible(true);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setLocationRelativeTo(null);
                f.setResizable(false);
                f.setTitle("Tetris_like");                
                f.simulatoin();
                
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextPane jTextPane2;
    // End of variables declaration                   

    @Override
    public void keyTyped(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {timer.setDelay(25);}
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
         if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {timer.setDelay(50);}
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(timer.isRunning()){
         if(e.getKeyCode()==KeyEvent.VK_LEFT)
        {fig_.deplacerGauche(grille_);
             affichage_.repaint();}
         else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
        {
          fig_.deplacerDroite(grille_);
            affichage_.repaint();
        }
         else if(e.getKeyCode()==KeyEvent.VK_UP)
        {
          fig_.rotate(grille_);
            affichage_.repaint();
        }
         else if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {timer.setDelay(delai_);}
         
        }
        if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
            if(timer.isRunning()){
            timer.stop();
            JFrame j= new JFrame();
            j.add(jPanel5);
            j.setVisible(true);            
            // taille et position
            j.setSize(380,300);
            j.setLocationRelativeTo(j.getParent());
            j.setResizable(false);
            jPanel5.setVisible(true);
            j.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e){ 
                timer.start();
                    requestFocus(); 
                }
                }); 
            }    
        }
         
        //throw new UnsupportedOperationException("Not supported yet.");
    }
    private class JCheckBoxListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        Color violet=new Color(200, 30, 240);
        Color blueCadet= new Color(95,158,160);// Cadet Blue
        Color gryDim=new Color(105,105,105);//Dim Gray
        Color cornsilk=new Color(205,200,177);//Cornsilk 3
       if(jCheckBox1.isSelected()){
    Controle.couleure_dalt=1;
    for(int i=0;i<10;i++){
        for(int j=0;j<22;j++){
            if(grille_.lireGrille(i, j)==Color.BLUE){
               grille_.lire_case_Grille(i, j).setCouleur(new Color(95,158,160));
            }
            if(grille_.lireGrille(i, j)==Color.RED){
              grille_.lire_case_Grille(i, j).setCouleur(new Color(105,105,105));
            }
            if(grille_.lireGrille(i, j)==violet){
              grille_.lire_case_Grille(i, j).setCouleur(new Color(205,200,177));
            }
        }        
            //repaint les figures
        
        /* for(i=0;i<4;i++){
               /*if(fig_.getCases(i).getCouleur()==Color.BLUE){
                   fig_.getCases(i).setCouleur(new Color(95,158,160));
                }
                if(fig_.getCases(i).getCouleur()==Color.RED){
                  fig_.getCases(i).setCouleur(new Color(105,105,105));
                }
                if(fig_.getCases(i).getCouleur()==violet){
                  fig_.getCases(i).setCouleur(new Color(205,200,177));
                }
                if(fig_next_.getCases(i).getCouleur()==Color.BLUE){
                   fig_next_.getCases(i).setCouleur(new Color(95,158,160));
                }
                if(fig_next_.getCases(i).getCouleur()==Color.RED){
                  fig_next_.getCases(i).setCouleur(new Color(105,105,105));
                }
                if(fig_next_.getCases(i).getCouleur()==violet){
                  fig_next_.getCases(i).setCouleur(new Color(205,200,177));
                }
            }*/
    //affichage_fig.repaint();
    affichage_.repaint();
    }
       } 
    else{
        Controle.couleure_dalt=0;
    for(int i=0;i<10;i++){
        for(int j=0;j<22;j++){
            if(grille_.lireGrille(i, j)==blueCadet){
               grille_.lire_case_Grille(i, j).setCouleur(Color.BLUE);
            }
            if(grille_.lireGrille(i, j)==gryDim){
              grille_.lire_case_Grille(i, j).setCouleur(Color.RED);
            }
            if(grille_.lireGrille(i, j)==cornsilk){
              grille_.lire_case_Grille(i, j).setCouleur(new Color(200, 30, 240));
            }
        }
    }
    affichage_.repaint();
    }
    }
}
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Fenetre2.java
 *
 * Created on 4 janv. 2013, 17:54:21
 */
package tetris;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Fenetre2 extends javax.swing.JFrame implements KeyListener {    
    private Thread1 thread_1;
    private Thread2 thread_2;
    private Grille grille_1;
    private Grille grille_2;
    
    
    /** Creates new form Fenetre2 */
    public Fenetre2() {
        initComponents();        
        
        addKeyListener(this); 
        addWindowListener(new WindowAdapter() {
 public void windowOpened(WindowEvent e) { 
 requestFocus(); 
 }
 });
        grille_1=new Grille();
        grille_2=new Grille();
        jLabel1.setVisible(false);
        
        thread_2=new Thread2(jPanel3,jPanel7,jLabel2,thread_1,grille_2,grille_1);
        addKeyListener(thread_2); 
        thread_1=new Thread1(jPanel2,jPanel4,jLabel1,thread_2,grille_1,grille_2);
        addKeyListener(thread_1);
        
        jLabel2.setVisible(false);       
           
    }
public  Thread1 getThread1(){
    return thread_1;
}
public  Thread2 getThread2(){
    return thread_2;
}


public void simulatoin(){ 
     thread_2.start();
    thread_1.start();
   
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel5 = new javax.swing.JPanel();
        jPanel6 = new javax.swing.JPanel();
        jCheckBox1 = new javax.swing.JCheckBox();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextPane2 = new javax.swing.JTextPane();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        jPanel4 = new javax.swing.JPanel();
        jPanel7 = new javax.swing.JPanel();

        jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder("Option"));

        jCheckBox1.setFont(new java.awt.Font("Tahoma", 1, 12));
        jCheckBox1.setText("couleurs Daltonien");

        jTextPane2.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Touches", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, java.awt.Color.black));
        jTextPane2.setEditable(false);
        jTextPane2.setFont(new java.awt.Font("Tahoma", 1, 12));
        jTextPane2.setText("Boutons de Gameplay du joueur 1 :n n? LEFT : touche directionnelle gauche n? RIGHT : touche directionnelle droite n? ROTATE : touche directionnelle hautn? DOWN : touche directionnelle basnnBoutons de Gameplay du joueur 2 :nn? LEFT : touche « S »n? RIGHT : touche « F »n? ROTATE : touche « E »n? DOWN : touche « D »");
        jTextPane2.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        jScrollPane2.setViewportView(jTextPane2);

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addGap(24, 24, 24)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 297, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addGap(81, 81, 81)
                        .addComponent(jCheckBox1)))
                .addContainerGap(51, Short.MAX_VALUE))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE)
                .addGap(41, 41, 41)
                .addComponent(jCheckBox1)
                .addContainerGap())
        );

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 404, Short.MAX_VALUE)
            .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel5Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addContainerGap()))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 385, Short.MAX_VALUE)
            .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel5Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(24, Short.MAX_VALUE)))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel2.setPreferredSize(new java.awt.Dimension(251, 551));

        jLabel1.setBackground(new java.awt.Color(0, 255, 51));
        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel1.setForeground(new java.awt.Color(204, 0, 0));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("jLabel1");
        jLabel1.setOpaque(true);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(33, 33, 33)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(38, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(37, 37, 37)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(443, Short.MAX_VALUE))
        );

        jPanel3.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel3.setPreferredSize(new java.awt.Dimension(251, 551));

        jLabel2.setBackground(new java.awt.Color(0, 255, 0));
        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel2.setForeground(new java.awt.Color(204, 0, 0));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("jLabel2");
        jLabel2.setOpaque(true);

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGap(45, 45, 45)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(40, Short.MAX_VALUE))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(444, Short.MAX_VALUE))
        );

        jPanel4.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel4.setPreferredSize(new java.awt.Dimension(101, 101));

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 99, Short.MAX_VALUE)
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 99, Short.MAX_VALUE)
        );

        jPanel7.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel7.setPreferredSize(new java.awt.Dimension(101, 101));

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 99, Short.MAX_VALUE)
        );
        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 99, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(21, 21, 21)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 48, Short.MAX_VALUE)
                .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(37, 37, 37)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(23, 23, 23))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(320, 320, 320)
                .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(311, 311, 311))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(34, 34, 34)
                        .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(34, 34, 34)
                        .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(19, 19, 19)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, 541, Short.MAX_VALUE)
                            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 541, Short.MAX_VALUE))))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Fenetre2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Fenetre2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Fenetre2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Fenetre2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Fenetre2 f= new Fenetre2();
                f.setVisible(true);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setLocationRelativeTo(null);
                f.setResizable(false);
                f.setTitle("Tetris_like");                
                f.simulatoin();
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextPane jTextPane2;
    // End of variables declaration                   

    @Override
    public void keyTyped(KeyEvent e) {
       
    }

    @Override
    public void keyPressed(KeyEvent e) {
       
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
         if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
            if(thread_1.isAlive()){            
            JFrame j= new JFrame();
            while(j.isActive()){
                    try {
                        thread_1.sleep(1);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Fenetre2.class.getName()).log(Level.SEVERE, null, ex);
                    }
            j.add(jPanel5);
            j.setVisible(true);            
            // taille et position
            j.setSize(380,300);
            j.setLocationRelativeTo(j.getParent());
            j.setResizable(false);
            jPanel5.setVisible(true);
            j.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e){ 
                thread_1.start();
                    requestFocus(); 
                }
                }); 
            }
            }               
        }
    }
    
    private class JCheckBoxListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        Color violet=new Color(200, 30, 240);
        Color blueCadet= new Color(95,158,160);// Cadet Blue
        Color gryDim=new Color(105,105,105);//Dim Gray
        Color cornsilk=new Color(205,200,177);//Cornsilk 3
       if(jCheckBox1.isSelected()){
    Controle.couleure_dalt=1;
       }
         
    else{
        Controle.couleure_dalt=0;    
    }

}
    }
}
    
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public  abstract class Figure /*implements FigureInter*/  {
  private Figure fig_;
  private int etat_;
  
  public Figure(){
     //fig_=new L();
       etat_=0;
  }
  public int getEtat(){
      return etat_;
  }
  public void setEtat(int e){
      etat_=e;
  }
  public abstract JPanel afficheFigure();
    
  public abstract void deplacerGauche(Grille g);
  public abstract void deplacerDroite(Grille g);
  
  public abstract void descendre(Grille g) throws Exception;
  
  public abstract void rotate(Grille g);
  public abstract Case getCases(int i);   
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;

import java.awt.Color;
import javax.swing.JPanel;

/**
 *
 * @author zero
 */
public class Grille {
    private int score_;
    private int taille_;
    private int difficulté_;
    private int nbr_ligneSup;
    private Case [][]grille_;
    
    public Grille(){
        difficulté_=1;
        nbr_ligneSup=0;
        score_=0;
        taille_=22;
        grille_= new Case [10][22];       
    }
    public Case lire_case_Grille(int i, int j){
        return grille_[i][j];
    }
    
    public Color lireGrille(int i, int j){
        if(grille_[i][j]==null) return null;
        else return grille_[i][j].getCouleur();
    }
    public JPanel afficheGrille(){
        PanneauGrille pan= new PanneauGrille(this);
        return pan;
    }
    
    
    public void setGrille(Case c, int i,int j){
        grille_[i][j]=c;
    }
    public void setScore(int n){
        score_=n;
    }
    public int getScore(){
        return score_;
    }
    public void setDifficulté(int n){
        difficulté_=n;
    }
    public int getDifficulté(){
        return difficulté_;
    }
    public void setTaille(int t){
        taille_=t;
    }
    public int getTaille(){
        return taille_;
    }
    public void setNbr_ligneSup(int t){
        nbr_ligneSup=t;
    }
    public int getNbr_ligneSup(){
        return nbr_ligneSup;
    }
    
    public void mise_ajourGrille(){        
        for(int j=0; j<22; j++){
            int n=0;
            for(int i=0; i<10; i++){                
                if(this.lireGrille(i, j)!=null) n++;
                if(n==10){
                    this.supp_ligne(j);
                    nbr_ligneSup++;
                    this.mise_ajourGrille();
                }               
            }            
        }
    }
    public void supp_ligne(int j){
        for(int i=0; i<10; i++){
            this.setGrille(null, i, j);
        }
        if(j>0){
            for(int i=0; i<10; i++){
                for(int k=j; k>0; k--){
                this.setGrille(this.lire_case_Grille(i, k-1), i, k);
                }
            }
        }
    }
    
    public void mise_ajour2(Grille g2){        
        for(int j=0; j<taille_; j++){
            int n=0;
            int nc=0;
            boolean mm_c=false;
            Color c=null;
            for(int i=0; i<10; i++){
                c=this.lireGrille(i, j);
                if(i<9){
                    if((c!=null)&&(c==this.lireGrille(i+1, j))){
                        nc++;
                        if(nc==4)mm_c=true;
                    }
                }
                if(this.lireGrille(i, j)!=null) n++;
                if(n==10){
                    if(mm_c){
                        for(int ii=0;ii<10;ii++){
                            for(int jj=0;jj<g2.taille_-2;jj++){
                                g2.setGrille(g2.lire_case_Grille(ii, jj+1), ii, jj);                                
                            }
                        }
                        for(int ii=0;ii<10;ii++){
                            g2.setGrille(this.lire_case_Grille(ii, j), ii, g2.taille_-1);
                        }
                        g2.taille_=g2.taille_-1;
                    }
                    this.supp_ligne(j);                    
                    this.mise_ajour2(g2);
                }               
            }            
        }
    }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class L extends Figure {
  private Case [] cases_;
  public L(){
      cases_=new Case[4];
      cases_[0]=new Case(-1,-1);
      cases_[1]=new Case(-1,-1);
      cases_[2]=new Case(-1,-1);
      cases_[3]=new Case(-1,-1);      
  }
  public Case getCases(int i){
      return cases_[i];
  }
  public JPanel afficheFigure(){
        PanneauFigure pan= new PanneauFigure(this);
        return pan;
  }
  
  public void descendre(Grille g) throws Exception{
    if(this.getEtat()==0){
    int nj=0; int ni=4;  
    if(this.cases_[2].getX()!=-1) {
                nj=this.cases_[2].getY()+1; 
                ni=this.cases_[2].getX();
    }
    //si on est en bas de la grille
    if (nj==22) throw new Exception();
    //si les cases suivantes sont occupée 
    if((g.lireGrille(ni,nj)!=null)||(g.lireGrille(ni+1, nj)!=null))
                throw new Exception();
    
    if((g.lireGrille(ni,nj)==null)&&(g.lireGrille(ni+1, nj)==null)){        
            g.setGrille(this.cases_[2],ni,nj);
            this.cases_[2].setX(ni);
            this.cases_[2].setY(nj);            
            g.setGrille(this.cases_[3], ni+1, nj);
            this.cases_[3].setX(ni+1);
            this.cases_[3].setY(nj);
        if(nj==1){
            g.setGrille(this.cases_[1],ni,nj-1);
            this.cases_[1].setX(ni);
            this.cases_[1].setY(nj-1);
            g.setGrille(null,ni+1,nj-1);
            
        }
        if(nj==2){
            g.setGrille(this.cases_[1],ni,nj-1);
            this.cases_[1].setX(ni);
            this.cases_[1].setY(nj-1);
            g.setGrille(this.cases_[0],ni,nj-2);
            this.cases_[0].setX(ni);
            this.cases_[0].setY(nj-2);
            g.setGrille(null, ni+1, nj-1);
        }
        if(nj>=3){
            g.setGrille(this.cases_[1],ni,nj-1);
            this.cases_[1].setX(ni);
            this.cases_[1].setY(nj-1);
            g.setGrille(this.cases_[0],ni,nj-2);
            this.cases_[0].setX(ni);
            this.cases_[0].setY(nj-2);
            g.setGrille(null, ni, nj-3);
            g.setGrille(null, ni+1, nj-1);
        }
      }
  }
  // etat ==1 (alangé)
  if(this.getEtat()==1){
      int ni=4;
      int nj=0;
      if(cases_[3].getY()!=-1){
            ni= cases_[3].getX();
            nj= cases_[3].getY()+1;
       }
    //si on est en bas de la grille
    if (nj==22) throw new Exception();
    //si les cases suivantes sont occupée 
    if((g.lireGrille(ni,nj)!=null)||(g.lireGrille(ni+1, nj-1)!=null)
            ||(g.lireGrille(ni+2, nj-1)!=null))
                throw new Exception();
    
    
        if(nj==0){
            if((g.lireGrille(ni,nj)==null)){
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                /*
                g.setGrille(null, ni, nj-2);
                g.setGrille(null, ni+1, nj-2);
                g.setGrille(null, ni+2, nj-2);
                 */
            }
        }
        if(nj==1){
            if((g.lireGrille(ni,nj)==null)&&(g.lireGrille(ni+1, nj-1)==null)
                    &&(g.lireGrille(ni+2, nj-1)==null)){
            g.setGrille(cases_[3], ni, nj);
            cases_[3].setX(ni);
            cases_[3].setY(nj);
            g.setGrille(cases_[2], ni, nj-1);
            cases_[2].setX(ni);
            cases_[2].setY(nj-1);
            g.setGrille(cases_[1], ni+1, nj-1);
            cases_[1].setX(ni+1);
            cases_[1].setY(nj-1);
            g.setGrille(cases_[0], ni+2, nj-1);
            cases_[0].setX(ni+2);
            cases_[0].setY(nj-1);
            /*
            g.setGrille(null, ni, nj-2);
            g.setGrille(null, ni+1, nj-2);
            g.setGrille(null, ni+2, nj-2);
             */
            }
            
        }
        if(nj>=2){
            if((g.lireGrille(ni,nj)==null)&&(g.lireGrille(ni+1, nj-1)==null)
                    &&(g.lireGrille(ni+2, nj-1)==null)){
                 g.setGrille(cases_[3], ni, nj);
                 cases_[3].setX(ni);
                 cases_[3].setY(nj);
                 g.setGrille(cases_[2], ni, nj-1);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj-1);
                 g.setGrille(cases_[1], ni+1, nj-1);
                 cases_[1].setX(ni+1);
                 cases_[1].setY(nj-1);
                 g.setGrille(cases_[0], ni+2, nj-1);
                 cases_[0].setX(ni+2);
                 cases_[0].setY(nj-1);
            
                 g.setGrille(null, ni, nj-2);
                 g.setGrille(null, ni+1, nj-2);
                 g.setGrille(null, ni+2, nj-2);
             
            }
        }    
  }
  //etat vers le bas
  if(this.getEtat()==2){
      int ni=4;
      int nj=0;
      if(cases_[0].getY()!=-1){
          ni=cases_[0].getX();
          nj=cases_[0].getY();
      }
      //si on est en bas de la grille
    if (nj==21) throw new Exception();
    //si les cases suivantes sont occupée 
    if((g.lireGrille(ni,nj+1)!=null)||((nj!=0)&&
            g.lireGrille(ni-1, nj-1)!=null)) throw new Exception();
    
    if(nj==0){
        if(g.lireGrille(ni, nj+1)==null){
            g.setGrille(cases_[0], ni, nj+1);
            cases_[0].setX(ni);
            cases_[0].setY(nj+1);
            g.setGrille(cases_[1], ni, nj);
            cases_[1].setX(ni);
            cases_[1].setY(nj);
        }
    }
    if(nj==1){
        if((g.lireGrille(ni, nj+1)==null)&&(g.lireGrille(ni-1, nj-1)==null)){
            g.setGrille(cases_[0], ni, nj+1);
            cases_[0].setX(ni);
            cases_[0].setY(nj+1);
            g.setGrille(cases_[1], ni, nj);
            cases_[1].setX(ni);
            cases_[1].setY(nj);
            g.setGrille(cases_[2], ni, nj-1);
            cases_[2].setX(ni);
            cases_[2].setY(nj-1);
            g.setGrille(cases_[3], ni-1, nj-1);
            cases_[3].setX(ni-1);
            cases_[3].setY(nj-1);
        }
    }
    if(nj>=2){
        if((g.lireGrille(ni, nj+1)==null)&&(g.lireGrille(ni-1, nj-1)==null)){
            g.setGrille(cases_[0], ni, nj+1);
            cases_[0].setX(ni);
            cases_[0].setY(nj+1);
            g.setGrille(cases_[1], ni, nj);
            cases_[1].setX(ni);
            cases_[1].setY(nj);
            g.setGrille(cases_[2], ni, nj-1);
            cases_[2].setX(ni);
            cases_[2].setY(nj-1);
            g.setGrille(cases_[3], ni-1, nj-1);
            cases_[3].setX(ni-1);
            cases_[3].setY(nj-1);
            g.setGrille(null, ni, nj-2);
            g.setGrille(null, ni-1, nj-2);
        }
    }
      
  }
  //etat 3
  if(this.getEtat()==3){
      int ni=4;
      int nj=0;
      if(cases_[1].getX()!=-1){
          ni=cases_[1].getX();
          nj=cases_[1].getY();
      }
      //si on est en bas de la grille
      if (nj==21) throw new Exception();
    //si les cases suivantes sont occupée 
      if((g.lireGrille(ni,nj+1)!=null)
              ||(g.lireGrille(ni+1, nj+1)!=null)
              ||(g.lireGrille(ni-1, nj+1)!=null)) throw new Exception();
      if(nj==0){
          if((g.lireGrille(ni, nj+1)==null)
                  &&(g.lireGrille(ni+1, nj+1)==null)
                  &&(g.lireGrille(ni-1, nj+1)==null)){
              g.setGrille(cases_[0], ni-1, nj+1);
              cases_[0].setX(ni-1);
              cases_[0].setY(nj+1);
              g.setGrille(cases_[1], ni, nj+1);
              cases_[1].setX(ni);
              cases_[1].setY(nj+1);
              g.setGrille(cases_[2], ni+1, nj+1);
              cases_[2].setX(ni+1);
              cases_[2].setY(nj+1);
              g.setGrille(cases_[3], ni+1, nj);
              cases_[3].setX(ni+1);
              cases_[3].setY(nj);
              g.setGrille(null, ni-1, nj);
              g.setGrille(null, ni, nj);
          }
      }
      if(nj>=1){
          if((g.lireGrille(ni, nj+1)==null)
                  &&(g.lireGrille(ni+1, nj+1)==null)
                  &&(g.lireGrille(ni-1, nj+1)==null)){
              g.setGrille(cases_[0], ni-1, nj+1);
              cases_[0].setX(ni-1);
              cases_[0].setY(nj+1);
              g.setGrille(cases_[1], ni, nj+1);
              cases_[1].setX(ni);
              cases_[1].setY(nj+1);
              g.setGrille(cases_[2], ni+1, nj+1);
              cases_[2].setX(ni+1);
              cases_[2].setY(nj+1);
              g.setGrille(cases_[3], ni+1, nj);
              cases_[3].setX(ni+1);
              cases_[3].setY(nj);
              g.setGrille(null, ni-1, nj);
              g.setGrille(null, ni, nj);
              g.setGrille(null, ni+1, nj-1);
          }
      }
      
  }
  }
  
  public  void deplacerGauche(Grille g){
    if(this.getEtat()==0){
    int ni=4, nj=0;
    if(cases_[2].getX()!=-1){
        ni= cases_[2].getX();
        nj= cases_[2].getY();
    }
    if(ni>0){
        if(nj==0)
            if(cases_[2].getX()!=-1){
            if(g.lireGrille(ni-1, nj)==null){
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(null, ni+1, nj);
            }
            }
        if(nj==1){
            if((g.lireGrille(ni-1, nj-1)==null)
                    &&(g.lireGrille(ni-1, nj)==null)){
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(null, ni+1, nj);
                g.setGrille(cases_[1], ni-1, nj-1);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj-1);
                g.setGrille(null, ni, nj-1);
                } 
        }
        if(nj>=2){
            if((g.lireGrille(ni-1, nj-2)==null)
                    &&(g.lireGrille(ni-1, nj-1)==null)
                    &&(g.lireGrille(ni-1, nj)==null)){
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(null, ni+1, nj);
                g.setGrille(cases_[1], ni-1, nj-1);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj-1);
                g.setGrille(null, ni, nj-1);
                g.setGrille(cases_[0], ni-1, nj-2);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj-2);
                g.setGrille(null, ni, nj-2);          
            }
        }   
    }
    }
    if(this.getEtat()==1){
        int ni=4;
        int nj=0;
        if(cases_[3].getX()!=-1){
            ni=cases_[3].getX();
            nj=cases_[3].getY();
        }
        if(ni>0){
            if(nj==0){
                if(cases_[3].getX()!=-1){
                if(g.lireGrille(ni-1, nj)==null){
                    g.setGrille(cases_[3], ni-1, nj);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj);
                    g.setGrille(null, ni, nj);
                }
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)){
                    g.setGrille(cases_[3], ni-1, nj);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni-1, nj-1);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni, nj-1);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[0], ni+1, nj-1);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj-1);
                    g.setGrille(null, ni+2, nj-1);
                    g.setGrille(null, ni, nj);
                }
            }
        }
    }
    if(this.getEtat()==2){
        int ni=4;
        int nj=0;
        if(cases_[0].getY()!=-1){
            ni=cases_[0].getX();
            nj=cases_[0].getY();
        }
        if(ni>1){
            if(nj==0){
                if(cases_[0].getX()!=-1){
                if(g.lireGrille(ni-1, nj)==null){
                    g.setGrille(cases_[0], ni-1, nj);
                    cases_[0].setX(ni-1);
                    cases_[0].setY(nj);
                    g.setGrille(null, ni, nj);
                }
                }
            }           
            if(nj==1){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)){
                    g.setGrille(cases_[0], ni-1, nj);
                    cases_[0].setX(ni-1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj-1);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-1);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)
                        &&(g.lireGrille(ni-2, nj-2)==null)){
                    g.setGrille(cases_[0], ni-1, nj);
                    cases_[0].setX(ni-1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj-1);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-1);
                    g.setGrille(cases_[3], ni-2, nj-2);
                    g.setGrille(cases_[2], ni-1, nj-2);
                    g.setGrille(null, ni, nj-2);
                }
            }
        }
    }
    if(this.getEtat()==3){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();
        }
        if(ni>1){
            if(nj==0){
                if(cases_[1].getX()!=-1){
                if(g.lireGrille(ni-2, nj)==null){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(null, ni+1, nj);
                }
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni-2, nj)==null)
                        &&(g.lireGrille(ni, nj-1)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni+1, nj);
                    g.setGrille(null, ni+1, nj-1);
                }
            }
        }
    }
  }
  public  void deplacerDroite(Grille g){
      if(this.getEtat()==0){
      int ni=4;
      int nj=0;
      if(cases_[2].getX()!=-1){
            ni= cases_[2].getX();
            nj= cases_[2].getY();
        }
      if(ni<8){
                if(nj==0){
                    if(cases_[2].getX()!=-1){
                    if(g.lireGrille(ni+2, nj)==null){
                        g.setGrille(cases_[3], ni+2, nj);
                        cases_[3].setX(ni+2);
                        cases_[3].setY(nj);
                        g.setGrille(cases_[2], ni+1, nj);
                        cases_[2].setX(ni+1);
                        cases_[2].setY(nj);                
                        g.setGrille(null, ni, nj); 
                    }
                    }
                }
                if(nj==1){
                  if((g.lireGrille(ni+1, nj-1)==null)&&
                          (g.lireGrille(ni+2, nj)==null)){
                     g.setGrille(cases_[3], ni+2, nj);
                     cases_[3].setX(ni+2);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);                
                     g.setGrille(null, ni, nj); 
                     g.setGrille(cases_[1], ni+1, nj-1);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj-1);
                     g.setGrille(null, ni, nj-1); 
                  }  
                 }
                if(nj>=2){
                   if((g.lireGrille(ni+1, nj-2)==null)&&
                           (g.lireGrille(ni+1, nj-1)==null)&&
                          (g.lireGrille(ni+2, nj)==null)){
                      g.setGrille(cases_[3], ni+2, nj);
                      cases_[3].setX(ni+2);
                      cases_[3].setY(nj);
                      g.setGrille(cases_[2], ni+1, nj);
                      cases_[2].setX(ni+1);
                      cases_[2].setY(nj);                
                      g.setGrille(null, ni, nj); 
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1); 
                      g.setGrille(cases_[0], ni+1, nj-2);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj-2);
                      g.setGrille(null, ni, nj-2);          
                    }
                  }       
      }
      
  }
  //etat = 1 (alangé)
  if (this.getEtat()==1){
    int ni=4;
    int nj=0;
    if(cases_[3].getX()!=-1){
        ni=cases_[3].getX();
        nj=cases_[3].getY();
    }
    if(ni<7){
        if(nj==0){
            if(cases_[3].getX()!=-1){
            g.setGrille(cases_[3], ni+1, nj);
            cases_[3].setX(ni+1);
            cases_[3].setY(nj);
            g.setGrille(null, ni, nj);              
        }
        }
        if(nj>=1){
            if((g.lireGrille(ni+3, nj-1)==null)&&
                    (g.lireGrille(ni+1, nj)==null)){
            g.setGrille(cases_[0], ni+3, nj-1);
            cases_[0].setX(ni+3);
            cases_[0].setY(nj-1);
            g.setGrille(cases_[1], ni+2, nj-1);
            cases_[1].setX(ni+2);
            cases_[1].setY(nj-1);
            g.setGrille(cases_[2], ni+1, nj-1);
            cases_[2].setX(ni+1);
            cases_[2].setY(nj-1);
            g.setGrille(cases_[3], ni+1, nj);
            cases_[3].setX(ni+1);
            cases_[3].setY(nj);
            g.setGrille(null, ni, nj);
            g.setGrille(null, ni, nj-1);
            }
        }
    }
  }
  if(this.getEtat()==2){
      int ni=4;
      int nj=0;
      if(cases_[0].getX()!=-1){
          ni=cases_[0].getX();
          nj=cases_[0].getY();
      }
      if(ni<9){
          if(nj==0){
              if(cases_[0].getX()!=-1){
              if(g.lireGrille(ni+1, nj)==null){
                  g.setGrille(cases_[0], ni+1, nj);
                  cases_[0].setX(ni+1);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni, nj);
              }
              }
          }
          if(nj==1){
              if((g.lireGrille(ni+1, nj)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)){
                  g.setGrille(cases_[0], ni+1, nj);
                  cases_[0].setX(ni+1);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[1], ni+1, nj-1);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
              }
          }
          if(nj>=2){
              if((g.lireGrille(ni+1, nj)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)
                      &&(g.lireGrille(ni+1, nj-2)==null)){
                  g.setGrille(cases_[0], ni+1, nj);
                  cases_[0].setX(ni+1);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni, nj);
                  g.setGrille(cases_[1], ni+1, nj-1);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj-1);
                  g.setGrille(null, ni, nj-1);
                  g.setGrille(cases_[2], ni+1, nj-2);
                  cases_[2].setX(ni+1);
                  cases_[2].setY(nj-2);
                  g.setGrille(cases_[3], ni, nj-2);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj-2);
                  g.setGrille(null, ni-1, nj-2);
              }
          }
      }
  }
  if(this.getEtat()==3){
      int ni=4;
      int nj=0;
      if(cases_[1].getX()!=-1){
          ni=cases_[1].getX();
          nj=cases_[1].getY();
      }
      if(ni<8){
          if(nj==0){
              if(cases_[1].getX()!=-1){
              if(g.lireGrille(ni+2, nj)==null){
                  g.setGrille(cases_[2], ni+2, nj);
                  cases_[2].setX(ni+2);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[1], ni+1, nj);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni-1, nj);                  
              }
              }
          }
          if(nj>=1){
              if((g.lireGrille(ni+2, nj)==null)
                      &&(g.lireGrille(ni+2, nj-1)==null)){
                  g.setGrille(cases_[2], ni+2, nj);
                  cases_[2].setX(ni+2);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[1], ni+1, nj);
                  cases_[1].setX(ni+1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[3], ni+2, nj-1);
                  cases_[3].setX(ni+2);
                  cases_[3].setY(nj-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(null, ni+1, nj-1);
              }
          }
      }
  }
  }
  public  void rotate(Grille g){
    if(this.getEtat()==0){ 
      int ni=4;
      int nj=0;
      if(cases_[2].getX()!=-1){
            ni= cases_[2].getX();
            nj= cases_[2].getY();
        }
      if(ni<8){
      /*if(nj==0){
          g.setGrille(null, ni, nj);
          g.setGrille(null, ni+1, nj);
          cases_[3].setX(-1);
          cases_[3].setY(-1);
          cases_[2].setX(-1);
          cases_[2].setY(-1);
      }*/
      if(nj==1){
          g.setGrille(cases_[3], ni, nj-1);
          cases_[3].setX(ni);
          cases_[3].setY(nj-1);
          cases_[2].setX(-1);
          cases_[2].setY(-1);
          cases_[1].setX(-1);
          cases_[1].setY(-1);
          g.setGrille(null, ni+1, nj);
          g.setGrille(null, ni, nj);
          this.setEtat(1);
          return;
      }
      if(nj>=2){
          if((g.lireGrille(ni+1, nj-2)==null)
                  &&(g.lireGrille(ni+2, nj-2)==null)){
             g.setGrille(cases_[0], ni+2, nj-2);
             cases_[0].setX(ni+2);
             cases_[0].setY(nj-2);
             g.setGrille(cases_[1], ni+1, nj-2);
             cases_[1].setX(ni+1);
             cases_[1].setY(nj-2);
             g.setGrille(cases_[2], ni, nj-2);
             cases_[2].setX(ni);
             cases_[2].setY(nj-2);
             g.setGrille(cases_[3], ni, nj-1);
             cases_[3].setX(ni);
             cases_[3].setY(nj-1);
             g.setGrille(null, ni, nj);
             g.setGrille(null, ni+1, nj);
             this.setEtat(1);
             return;
          }
      }
            
    }
      
    }
    if(this.getEtat()==1){
        int ni=4;
        int nj=0;
        if(cases_[3].getY()!=-1){
            ni=cases_[3].getX();
            nj=cases_[3].getY();
        }
        if(ni<=7){
            if(nj==0){
                if((g.lireGrille(ni+2, nj)==null)&&
                        (g.lireGrille(ni+2, nj+1)==null)){
                    g.setGrille(cases_[0], ni+2, nj+1);
                    cases_[0].setX(ni+2);
                    cases_[0].setY(nj+1);
                    g.setGrille(cases_[1], ni+2, nj);
                    cases_[1].setX(ni+2);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                    cases_[3].setX(-1);
                    cases_[3].setY(-1);
                    this.setEtat(2);
                    return;
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni+2, nj)==null)&&
                        (g.lireGrille(ni+2, nj+1)==null)){
                    g.setGrille(cases_[0], ni+2, nj+1);
                    cases_[0].setX(ni+2);
                    cases_[0].setY(nj+1);
                    g.setGrille(cases_[1], ni+2, nj);
                    cases_[1].setX(ni+2);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni+2, nj-1);
                    cases_[2].setX(ni+2);
                    cases_[2].setY(nj-11);
                    g.setGrille(cases_[3], ni+1, nj-1);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni, nj-1);
                    g.setGrille(null, ni, nj);
                    this.setEtat(2);
                    return;
                }
            }
            
        }
    }
    if(this.getEtat()==2){
        int ni=4;
        int nj=0;
        if(cases_[0].getY()!=-1){
            ni=cases_[0].getX();
            nj=cases_[0].getY();
        }
        if(ni>1){
            if(nj==0){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    this.setEtat(3);
                    return;
                }
            }
            if(nj==1){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    this.setEtat(3);
                    return;
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni, nj);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni, nj-2);
                    g.setGrille(null, ni-1, nj-2);
                    this.setEtat(3);
                    return;
                }
            }            
        }
    }
    if(this.getEtat()==3){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();
        }
        if(nj==0){
            g.setGrille(cases_[2], ni-1, nj);
            cases_[2].setX(ni-1);
            cases_[2].setY(nj);
            cases_[0].setX(-1);
            cases_[0].setY(-1);
            g.setGrille(cases_[3], ni, nj);
            cases_[3].setX(ni);
            cases_[3].setY(nj);
            cases_[1].setX(-1);
            cases_[1].setY(-1);
            g.setGrille(null, ni+1, nj);
            this.setEtat(0);
            return;
        }
        if(nj==1){
            if(g.lireGrille(ni-1, nj-1)==null){
                g.setGrille(cases_[1], ni-1, nj-1);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj-1);
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
                cases_[0].setX(-1);
                cases_[0].setY(-1);
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(null, ni+1, nj);
                g.setGrille(null, ni+1, nj-1);
                this.setEtat(0);
                return;
            }
        }
        if(nj>=2){
            if((g.lireGrille(ni-1, nj-2)==null)
                    &&(g.lireGrille(ni-1, nj-1)==null)){
                g.setGrille(cases_[0], ni-1, nj-2);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj-2);
                g.setGrille(cases_[1], ni-1, nj-1);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj-1);
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);                
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(null, ni+1, nj);
                g.setGrille(null, ni+1, nj-1);
                this.setEtat(0);
                return;
            }
        }
    }
  }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class L_retourné extends Figure {
    private Case cases_[];
    public L_retourné(){
        cases_=new Case[4];
        cases_[0]=new Case(-1,-1);
        cases_[1]=new Case(-1,-1);
        cases_[2]=new Case(-1,-1);
        cases_[3]=new Case(-1,-1);
    }
  public Case getCases(int i){
      return cases_[i];
  }  
  public JPanel afficheFigure(){    
        PanneauFigure pan= new PanneauFigure(this);
        return pan;    
  }
  public  void descendre(Grille g) throws Exception{
      if(this.getEtat()==0){
          int ni=5;
          int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          //System.out.println("nj  ="+nj);
          //si on est en bas de la grille
          if (nj==21) throw new Exception();
          //si les cases suivantes sont occupée 
          if((g.lireGrille(ni,nj+1)!=null)
                  ||(g.lireGrille(ni-1,nj+1)!=null)){
              //System.out.println("nj  ="+nj);
                throw new Exception();}
          
          
              if(nj==0){
                  if((cases_[2].getY()!=-1)
                          &&(g.lireGrille(ni, nj+1)==null)
                          &&(g.lireGrille(ni-1, nj+1)==null)){
                  g.setGrille(cases_[2], ni, nj+1);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj+1);
                  g.setGrille(cases_[3], ni-1, nj+1);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj+1);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(null, ni-1, nj);
                  return;
                  }
                  if((cases_[2].getY()==-1)
                          &&(g.lireGrille(ni, nj)==null)
                          &&(g.lireGrille(ni-1, nj)==null)){
                      g.setGrille(cases_[2], ni, nj);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj);
                      g.setGrille(cases_[3], ni-1, nj);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj);
                      return;
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni, nj+1)==null)
                  &&(g.lireGrille(ni-1, nj+1)==null)){
                  g.setGrille(cases_[2], ni, nj+1);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj+1);
                  g.setGrille(cases_[3], ni-1, nj+1);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj+1);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni, nj-1);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj-1);
                  g.setGrille(null, ni-1, nj);
                  return;
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni, nj+1)==null)
                  &&(g.lireGrille(ni-1, nj+1)==null)){
                  g.setGrille(cases_[2], ni, nj+1);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj+1);
                  g.setGrille(cases_[3], ni-1, nj+1);
                  cases_[3].setX(ni-1);
                  cases_[3].setY(nj+1);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni, nj-1);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj-1);
                  g.setGrille(null, ni-1, nj);
                  g.setGrille(null, ni, nj-2);
                  return;                  
                  }
              }             
          
      }
      if(this.getEtat()==1){
          int ni=4;
          int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          //la fin de la grille 
          if (nj==21) throw new Exception();
          //si les cases suivantes sont occupée 
          if((g.lireGrille(ni,nj+1)!=null)||(g.lireGrille(ni+1,nj+1)!=null)
                  ||(g.lireGrille(ni+2, nj+1)!=null))
                throw new Exception();
          
          if((g.lireGrille(ni,nj+1)==null)&&(g.lireGrille(ni+1,nj+1)==null)
                  &&(g.lireGrille(ni+2, nj+1)==null)){
              if(nj==0){
                  if(cases_[2].getX()!=-1){
                      g.setGrille(cases_[0], ni+2, nj+1);
                      cases_[0].setX(ni+2);
                      cases_[0].setY(nj+1);
                      g.setGrille(cases_[1], ni+1, nj+1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj+1);
                      g.setGrille(cases_[2], ni, nj+1);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj+1);
                      g.setGrille(cases_[3], ni, nj);
                      cases_[3].setX(ni);
                      cases_[3].setY(nj);
                      g.setGrille(null, ni+1, nj);
                      g.setGrille(null, ni+2, nj);
                  }
              }
              if(nj>=1){
                      g.setGrille(cases_[0], ni+2, nj+1);
                      cases_[0].setX(ni+2);
                      cases_[0].setY(nj+1);
                      g.setGrille(cases_[1], ni+1, nj+1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj+1);
                      g.setGrille(cases_[2], ni, nj+1);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj+1);
                      g.setGrille(cases_[3], ni, nj);
                      cases_[3].setX(ni);
                      cases_[3].setY(nj);
                      g.setGrille(null, ni+1, nj);
                      g.setGrille(null, ni+2, nj);
                      g.setGrille(null, ni, nj-1);
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4;
          int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          //a la fin de la grille
          if(nj==21) throw new Exception();
          //cases suivantes occupées 
          if(g.lireGrille(ni, nj+1)!=null) throw new Exception();
          if((nj>0)&&(g.lireGrille(ni+1, nj-1)!=null)) throw new Exception();
          
          if(nj==0){
              if(g.lireGrille(ni, nj+1)==null){
                  g.setGrille(cases_[0], ni, nj+1);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj+1);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
              }
          }
          if(nj==1){
              if((g.lireGrille(ni, nj+1)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)){
                  g.setGrille(cases_[0], ni, nj+1);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj+1);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[2], ni, nj-1);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj-1);
                  g.setGrille(cases_[3], ni+1, nj-1);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj-1);
              }
          }
          if(nj>=2){
              if((g.lireGrille(ni, nj+1)==null)
                      &&(g.lireGrille(ni+1, nj-1)==null)){
                  g.setGrille(cases_[0], ni, nj+1);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj+1);
                  g.setGrille(cases_[1], ni, nj);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[2], ni, nj-1);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj-1);
                  g.setGrille(cases_[3], ni+1, nj-1);
                  cases_[3].setX(ni+1);
                  cases_[3].setY(nj-1);
                  g.setGrille(null, ni, nj-2);
                  g.setGrille(null, ni+1, nj-2);
              }
          }
          
      }
      if(this.getEtat()==3){
          int ni=4;
          int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          //en bas de la grille
          if(nj==21) throw new Exception();
          //les cases suivante occupées
          if((g.lireGrille(ni, nj+1)!=null)
                  ||(g.lireGrille(ni-1, nj)!=null)
                  ||(g.lireGrille(ni-2, nj)!=null))throw new Exception();
          
          if((g.lireGrille(ni, nj+1)==null)
                  &&(g.lireGrille(ni-1, nj)==null)
                  &&(g.lireGrille(ni-2, nj)==null)){
              if(nj==0){
                  g.setGrille(cases_[3], ni, nj+1);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj+1);
                  g.setGrille(cases_[2], ni, nj);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[1], ni-1, nj);
                  cases_[1].setX(ni-1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni-2, nj);
                  cases_[0].setX(ni-2);
                  cases_[0].setY(nj);
              }
              if(nj>=1){
                  g.setGrille(cases_[3], ni, nj+1);
                  cases_[3].setX(ni);
                  cases_[3].setY(nj+1);
                  g.setGrille(cases_[2], ni, nj);
                  cases_[2].setX(ni);
                  cases_[2].setY(nj);
                  g.setGrille(cases_[1], ni-1, nj);
                  cases_[1].setX(ni-1);
                  cases_[1].setY(nj);
                  g.setGrille(cases_[0], ni-2, nj);
                  cases_[0].setX(ni-2);
                  cases_[0].setY(nj);
                  g.setGrille(null, ni-2, nj-1);
                  g.setGrille(null, ni-1, nj-1);
                  g.setGrille(null, ni, nj-1);
              }              
          }
          
      }
  } 
  public  void deplacerGauche(Grille g){
      if(this.getEtat()==0){
          int ni=4;
          int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if(ni>0){
              if(nj==0){
                  if(g.lireGrille(ni-1, nj)==null){
                  if(cases_[3].getX()!=-1){
                      g.setGrille(cases_[3], ni-1, nj);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj);
                      g.setGrille(cases_[2], ni, nj);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj);
                      g.setGrille(null, ni+1, nj);
                  }
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni, nj-1)==null)){
                      g.setGrille(cases_[3], ni-1, nj);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj);
                      g.setGrille(cases_[2], ni, nj);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj);
                      g.setGrille(cases_[1], ni, nj-1);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni+1, nj-1);
                      g.setGrille(null, ni+1, nj);
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni, nj-1)==null)
                          &&(g.lireGrille(ni, nj-2)==null)){
                      g.setGrille(cases_[3], ni-1, nj);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj);
                      g.setGrille(cases_[2], ni, nj);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj);
                      g.setGrille(cases_[1], ni, nj-1);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[0], ni, nj-2);
                      cases_[0].setX(ni);
                      cases_[0].setY(nj-2);
                      g.setGrille(null, ni+1, nj-2);
                      g.setGrille(null, ni+1, nj-1);
                      g.setGrille(null, ni+1, nj);
                  }
              }
          }
      }
      if(this.getEtat()==1){
          int ni=4;
          int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni>0){
              if(nj==0){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(cases_[2].getX()!=-1)){
                      g.setGrille(cases_[2], ni-1, nj);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj);
                      g.setGrille(cases_[1], ni, nj);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj);
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni+2, nj);
                  }
              }
              if(nj>=1){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni-1, nj-1)==null)){
                      g.setGrille(cases_[3], ni-1, nj-1);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj-1);
                      g.setGrille(cases_[2], ni-1, nj);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj);
                      g.setGrille(cases_[1], ni, nj);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj);
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni+2, nj);
                      g.setGrille(null, ni, nj-1);
                  }
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4;
          int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if(ni>0){
              if(nj==0){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(cases_[3].getX()!=-1)){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni-1, nj-1)==null)
                          &&(g.lireGrille(ni-1, nj)==null)){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni-1, nj-1);
                      cases_[1].setX(ni-1);
                      cases_[1].setY(nj);
                      g.setGrille(null, ni, nj);
                      g.setGrille(null, ni, nj-1);
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni-1, nj-1)==null)
                          &&(g.lireGrille(ni-1, nj)==null)
                          &&(g.lireGrille(ni-1, nj-2)==null)){
                      g.setGrille(cases_[0], ni-1, nj);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni-1, nj-1);
                      cases_[1].setX(ni-1);
                      cases_[1].setY(nj);
                      g.setGrille(cases_[2], ni-1, nj-2);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj-2);
                      g.setGrille(cases_[3], ni, nj-2);
                      cases_[3].setX(ni);
                      cases_[3].setY(nj-2);
                      g.setGrille(null, ni, nj);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(null, ni+1, nj-2);
                  }
              }
          }
      }
      if(this.getEtat()==3){
          int ni=4;
          int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if(ni>2){
              if(nj==0){
                  if((g.lireGrille(ni-1, nj)==null)
                          &&(cases_[3].getX()!=-1)){
                      g.setGrille(cases_[3], ni-1, nj);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj>=1){
                  if((g.lireGrille(ni-3, nj-1)==null)
                          &&(g.lireGrille(ni-1, nj)==null)){
                      g.setGrille(cases_[3], ni-1, nj);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj);
                      g.setGrille(cases_[2], ni-1, nj-1);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj-1);
                      g.setGrille(cases_[1], ni-2, nj-1);
                      cases_[1].setX(ni-2);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[0], ni-3, nj-1);
                      cases_[0].setX(ni-3);
                      cases_[0].setY(nj-1);
                      g.setGrille(null, ni, nj);
                      g.setGrille(null, ni, nj-1);
                  }
              }
          }
      }
  }
  public  void deplacerDroite(Grille g){
      if(this.getEtat()==0){
          int ni=4;
          int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni<9){
              if(nj==0){
                  if(cases_[2].getX()!=-1){
                      if(g.lireGrille(ni+1, nj)==null){
                          g.setGrille(cases_[2], ni+1, nj);
                          cases_[2].setX(ni+1);
                          cases_[2].setY(nj);
                          g.setGrille(cases_[3], ni, nj);
                          cases_[3].setX(ni);
                          cases_[3].setY(nj);
                          g.setGrille(null, ni-1, nj);
                      }
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni+1, nj-1)==null)){
                          g.setGrille(cases_[1], ni+1, nj-1);
                          cases_[1].setX(ni+1);
                          cases_[1].setY(nj-1);
                          g.setGrille(cases_[2], ni+1, nj);
                          cases_[2].setX(ni+1);
                          cases_[2].setY(nj);
                          g.setGrille(cases_[3], ni, nj);
                          cases_[3].setX(ni);
                          cases_[3].setY(nj);
                          g.setGrille(null, ni-1, nj);
                          g.setGrille(null, ni, nj-1);
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni+1, nj-1)==null)
                          &&(g.lireGrille(ni+1, nj-2)==null)){
                          g.setGrille(cases_[0], ni+1, nj-2);
                          cases_[0].setX(ni+1);
                          cases_[0].setY(nj-2);
                          g.setGrille(cases_[1], ni+1, nj-1);
                          cases_[1].setX(ni+1);
                          cases_[1].setY(nj-1);
                          g.setGrille(cases_[2], ni+1, nj);
                          cases_[2].setX(ni+1);
                          cases_[2].setY(nj);
                          g.setGrille(cases_[3], ni, nj);
                          cases_[3].setX(ni);
                          cases_[3].setY(nj);
                          g.setGrille(null, ni-1, nj);
                          g.setGrille(null, ni, nj-1);
                          g.setGrille(null, ni, nj-2);
                  }
              }
          }
      }
      if(this.getEtat()==1){
          int ni=4;
          int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if(ni<9){
              if(nj==0){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(cases_[0].getX()!=-1)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni, nj);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj);
                      g.setGrille(cases_[2], ni-1, nj);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj);
                      g.setGrille(null, ni-2, nj);
                  }
              }
              if(nj>=1){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni-1, nj-1)==null)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni, nj);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj);
                      g.setGrille(cases_[2], ni-1, nj);
                      cases_[2].setX(ni-1);
                      cases_[2].setY(nj);
                      g.setGrille(cases_[3], ni-1, nj-1);
                      cases_[3].setX(ni-1);
                      cases_[3].setY(nj-1);
                      g.setGrille(null, ni-2, nj);
                      g.setGrille(null, ni-2, nj-1);
                  }
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4;
          int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if(ni<8){
              if(nj==0){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(cases_[0].getX()!=-1)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni+1, nj-1)==null)
                          &&(g.lireGrille(ni+1, nj)==null)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni+1, nj-1)==null)
                          &&(g.lireGrille(ni+1, nj)==null)
                          &&(g.lireGrille(ni+2, nj-2)==null)){
                      g.setGrille(cases_[0], ni+1, nj);
                      cases_[0].setX(ni+1);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni+1, nj-1);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[2], ni+1, nj-2);
                      cases_[2].setX(ni+1);
                      cases_[2].setY(nj-2);
                      g.setGrille(cases_[3], ni+2, nj-2);
                      cases_[3].setX(ni+2);
                      cases_[3].setY(nj-2);
                      g.setGrille(null, ni, nj-2);
                      g.setGrille(null, ni, nj-1);
                      g.setGrille(null, ni, nj);
                  }
              }
          }
      }
      if(this.getEtat()==3){
          int ni=4;
          int nj=0;
          if (cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if(ni<9){
              if(nj==0){
                  if((g.lireGrille(ni+1, nj)==null)
                          &&(cases_[3].getX()!=-1)){
                      g.setGrille(cases_[3], ni+1, nj);
                      cases_[3].setX(ni+1);
                      cases_[3].setY(nj);
                      g.setGrille(null, ni, nj);
                  }
              }
              if(nj>=1){
                  if((g.lireGrille(ni+1, nj-1)==null)
                          &&(g.lireGrille(ni+1, nj)==null)){
                      g.setGrille(cases_[3], ni+1, nj);
                      cases_[3].setX(ni+1);
                      cases_[3].setY(nj);
                      g.setGrille(cases_[2], ni+1, nj-1);
                      cases_[2].setX(ni+1);
                      cases_[2].setY(nj-1);
                      g.setGrille(cases_[1], ni, nj-1);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[0], ni-1, nj-1);
                      cases_[0].setX(ni-1);
                      cases_[0].setY(nj-1);
                      g.setGrille(null, ni, nj);
                      g.setGrille(null, ni-2, nj-1);
                  }
              }
          }
      }
  }
  public  void rotate(Grille g){
      if(this.getEtat()==0){
          int ni=4;
          int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni>1){
              if(nj==0){
                  if(cases_[2].getX()!=-1){
                      if(g.lireGrille(ni-2, nj)==null){
                          g.setGrille(cases_[2], ni-2, nj);
                          cases_[2].setX(ni-2);
                          cases_[2].setY(nj);
                          g.setGrille(cases_[1], ni-1, nj);
                          cases_[1].setX(ni-1);
                          cases_[1].setY(nj);
                          g.setGrille(cases_[0], ni, nj);
                          cases_[0].setX(ni);
                          cases_[0].setY(nj);
                          cases_[3].setX(-1);
                          cases_[3].setY(-1);
                          this.setEtat(1);
                          return;
                      }
                  }
              }
              if(nj==1){
                  if((g.lireGrille(ni-2, nj-1)==null)
                          &&(g.lireGrille(ni-2, nj)==null)){
                          g.setGrille(cases_[2], ni-2, nj);
                          cases_[2].setX(ni-2);
                          cases_[2].setY(nj);
                          g.setGrille(cases_[1], ni-1, nj);
                          cases_[1].setX(ni-1);
                          cases_[1].setY(nj);
                          g.setGrille(cases_[0], ni, nj);
                          cases_[0].setX(ni);
                          cases_[0].setY(nj);
                          g.setGrille(cases_[3], ni-2, nj-1);
                          cases_[3].setX(ni-2);
                          cases_[3].setY(nj-1);
                          g.setGrille(null, ni, nj-1);
                          this.setEtat(1);
                          return;
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni-2, nj-1)==null)
                          &&(g.lireGrille(ni-2, nj)==null)){
                          g.setGrille(cases_[2], ni-2, nj);
                          cases_[2].setX(ni-2);
                          cases_[2].setY(nj);
                          g.setGrille(cases_[1], ni-1, nj);
                          cases_[1].setX(ni-1);
                          cases_[1].setY(nj);
                          g.setGrille(cases_[0], ni, nj);
                          cases_[0].setX(ni);
                          cases_[0].setY(nj);
                          g.setGrille(cases_[3], ni-2, nj-1);
                          cases_[3].setX(ni-2);
                          cases_[3].setY(nj-1);
                          g.setGrille(null, ni, nj-1);
                          g.setGrille(null, ni, nj-2);
                          this.setEtat(1);
                          return;
                  }
              }
          }
      }
      if(this.getEtat()==1){
          int ni=4;
          int nj=0;
          if(cases_[2].getX()!=-1){
              ni=cases_[2].getX();
              nj=cases_[2].getY();
          }
          if(ni>=0){
              if(nj==0){
                  if(cases_[2].getX()!=-1){
                      g.setGrille(cases_[0], ni, nj);
                      cases_[0].setX(ni);
                      cases_[0].setY(nj);
                      cases_[1].setX(-1);
                      cases_[1].setY(-1);
                      cases_[2].setX(-1);
                      cases_[2].setY(-1);
                      g.setGrille(null, ni+1, nj);
                      g.setGrille(null, ni+2, nj);
                      this.setEtat(2);
                      return;
                  }
              }
              if(nj==1){
                  g.setGrille(cases_[0], ni, nj);
                  cases_[0].setX(ni);
                  cases_[0].setY(nj);
                  g.setGrille(cases_[1], ni, nj-1);
                  cases_[1].setX(ni);
                  cases_[1].setY(nj-1);
                  cases_[2].setX(-1);
                  cases_[2].setY(-1);
                  cases_[3].setX(-1);
                  cases_[3].setY(-1);
                  g.setGrille(null, ni+1, nj);
                  g.setGrille(null, ni+2, nj);
                  this.setEtat(2);
                  return;
              }
              if(nj>=2){
                  if((g.lireGrille(ni, nj-2)==null)
                          &&(g.lireGrille(ni+1, nj-2)==null)){
                      g.setGrille(cases_[0], ni, nj);
                      cases_[0].setX(ni);
                      cases_[0].setY(nj);
                      g.setGrille(cases_[1], ni, nj-1);
                      cases_[1].setX(ni);
                      cases_[1].setY(nj-1);
                      g.setGrille(cases_[2], ni, nj-2);
                      cases_[2].setX(ni);
                      cases_[2].setY(nj-2);
                      g.setGrille(cases_[3], ni+1, nj-2);
                      cases_[3].setX(ni+1);
                      cases_[3].setY(nj-2);
                      g.setGrille(null, ni+1, nj);
                      g.setGrille(null, ni+2, nj);
                      this.setEtat(2);
                      return;
                  }
              }
          }
      }
      if(this.getEtat()==2){
          int ni=4;
          int nj=0;
          if(cases_[0].getX()!=-1){
              ni=cases_[0].getX();
              nj=cases_[0].getY();
          }
          if(ni<8){
              if(nj==1){
                  if(g.lireGrille(ni+2, nj-1)==null){
                      g.setGrille(cases_[3], ni+2, nj-1);
                      cases_[3].setX(ni+2);
                      cases_[3].setY(nj-1);
                      cases_[0].setX(-1);
                      cases_[0].setY(-1);
                      cases_[1].setX(-1);
                      cases_[1].setY(-1);
                      g.setGrille(null, ni, nj);
                      g.setGrille(null, ni, nj-1);
                      this.setEtat(3);
                      return;
                  }
              }
              if(nj>=2){
                  if((g.lireGrille(ni+2, nj-1)==null)
                          &&(g.lireGrille(ni+2, nj-2)==null)){
                      g.setGrille(cases_[3], ni+2, nj-1);
                      cases_[3].setX(ni+2);
                      cases_[3].setY(nj-1);
                      g.setGrille(cases_[2], ni+2, nj-2);
                      cases_[2].setX(ni+2);
                      cases_[2].setY(nj-2);
                      g.setGrille(cases_[0], ni, nj-2);
                      cases_[0].setX(ni);
                      cases_[0].setY(nj-2);
                      g.setGrille(cases_[1], ni+1, nj-2);
                      cases_[1].setX(ni+1);
                      cases_[1].setY(nj-2);
                      g.setGrille(null, ni, nj);
                      g.setGrille(null, ni, nj-1);
                      this.setEtat(3);
                      return;                     
                  }
              }
          }
      }
      if(this.getEtat()==3){
          int ni=4;
          int nj=0;
          if(cases_[3].getX()!=-1){
              ni=cases_[3].getX();
              nj=cases_[3].getY();
          }
          if(ni>1){
              if(nj==0){
                  if(cases_[3].getX()!=-1){
                      if((g.lireGrille(ni, nj+1)==null)
                              &&(g.lireGrille(ni-1, nj+1)==null)){
                          g.setGrille(cases_[3], ni-1, nj+1);
                          cases_[3].setX(ni-1);
                          cases_[3].setY(nj+1);
                          g.setGrille(cases_[2], ni, nj+1);
                          cases_[2].setX(ni);
                          cases_[2].setY(nj+1);
                          g.setGrille(cases_[1], ni, nj);
                          cases_[1].setX(ni);
                          cases_[1].setY(nj);
                          this.setEtat(0);
                          return;
                      }
                  }
              }
              if((nj>=1)&&(nj<21)){
                  if((g.lireGrille(ni, nj+1)==null)
                              &&(g.lireGrille(ni-1, nj+1)==null)){
                          g.setGrille(cases_[3], ni-1, nj+1);
                          cases_[3].setX(ni-1);
                          cases_[3].setY(nj+1);
                          g.setGrille(cases_[2], ni, nj+1);
                          cases_[2].setX(ni);
                          cases_[2].setY(nj+1);
                          g.setGrille(cases_[1], ni, nj);
                          cases_[1].setX(ni);
                          cases_[1].setY(nj);
                          g.setGrille(cases_[0], ni, nj-1);
                          g.setGrille(null, ni-1, nj-1);
                          g.setGrille(null, ni-2, nj-1);
                          this.setEtat(0);
                          return;
                  }
              }
          }
      }
  } 
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class PanneauFigure extends JPanel {
    private Figure figure_;
    
    public PanneauFigure(L f){
        figure_=f;
    }
    public PanneauFigure(L_retourné f){
        figure_=f;
    }
    public PanneauFigure(S f){
        figure_=f;
    }
    public PanneauFigure(Z f){
        figure_=f;
    }
    public PanneauFigure(T f){
        figure_=f;
    }
    public PanneauFigure(Barre f){
        figure_=f;
    }
    public PanneauFigure(Cube f){
        figure_=f;
    }
      
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //Dimension taille =new Dimension(463,463);
        
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                    g.setColor(Color.white);
                    g.drawRect(i*25,j*25,25,25);           
                    g.setColor(Color.black);
                    g.fillRect(25*i+3,25*j+3,20,20);                                   
            }
        }
        
        if(figure_ instanceof L){
            g.setColor(((L)figure_).getCases(0).getCouleur());
            int i=1; int j=0;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((L)figure_).getCases(1).getCouleur());
            i=1;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((L)figure_).getCases(2).getCouleur());
             i=1;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((L)figure_).getCases(3).getCouleur());
             i=2;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);            
        }
        
        if(figure_ instanceof L_retourné){
            g.setColor(((L_retourné)figure_).getCases(0).getCouleur());
            int i=2; int j=0;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((L_retourné)figure_).getCases(1).getCouleur());
            i=2;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((L_retourné)figure_).getCases(2).getCouleur());
             i=2;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((L_retourné)figure_).getCases(3).getCouleur());
             i=1;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20); 
        }
        if(figure_ instanceof T){
            g.setColor(((T)figure_).getCases(3).getCouleur());
            int i=1; int j=0;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((T)figure_).getCases(2).getCouleur());
            i=1;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((T)figure_).getCases(1).getCouleur());
             i=1;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((T)figure_).getCases(0).getCouleur());
             i=2;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20); 
        }
        if(figure_ instanceof Z){
            g.setColor(((Z)figure_).getCases(3).getCouleur());
            int i=2; int j=0;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Z)figure_).getCases(2).getCouleur());
            i=2;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Z)figure_).getCases(1).getCouleur());
             i=1;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Z)figure_).getCases(0).getCouleur());
             i=1;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20); 
        }
        if(figure_ instanceof S){
            g.setColor(((S)figure_).getCases(3).getCouleur());
            int i=1; int j=0;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((S)figure_).getCases(2).getCouleur());
            i=1;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((S)figure_).getCases(1).getCouleur());
             i=2;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((S)figure_).getCases(0).getCouleur());
             i=2;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20); 
        }
        if(figure_ instanceof Barre){
            g.setColor(((Barre)figure_).getCases(3).getCouleur());
            int i=1; int j=3;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Barre)figure_).getCases(2).getCouleur());
            i=1;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Barre)figure_).getCases(1).getCouleur());
             i=1;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Barre)figure_).getCases(0).getCouleur());
             i=1;  j=0;
            g.fillRect(25*i+3,25*j+3,20,20); 
        }
        if(figure_ instanceof Cube){
            g.setColor(((Cube)figure_).getCases(3).getCouleur());
            int i=2; int j=1;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Cube)figure_).getCases(2).getCouleur());
            i=2;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Cube)figure_).getCases(1).getCouleur());
             i=1;  j=2;
            g.fillRect(25*i+3,25*j+3,20,20);
            g.setColor(((Cube)figure_).getCases(0).getCouleur());
             i=1;  j=1;
            g.fillRect(25*i+3,25*j+3,20,20); 
        }
        
        
        
        
                    
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;

import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class PanneauGrille extends JPanel {
    private Grille grille_;
    PanneauGrille(Grille g){
        grille_=g;
    }
     
    @Override    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //Dimension taille =new Dimension(463,463);
        
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 22; j++) {
                    g.setColor(Color.white);
                    g.drawRect(i*25,j*25,25,25);
                    //g.setColor(Color.red);
                    //g.fillRect(25*i+3,25*j+3,20,20);
                    if(grille_.lireGrille(i,j)==null){
                      g.setColor(Color.black);
                      g.fillRect(25*i+3,25*j+3,20,20); 
                    }
                    else{
                      g.setColor(grille_.lireGrille(i,j));
                      g.fillRect(25*i+3,25*j+3,20,20);
                    }
                    
                           
            }
        }
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class S  extends Figure {
    private Case [] cases_;
    public S(){
        cases_=new Case[4];
        cases_[0]=new Case(-1,-1);
        cases_[1]=new Case(-1,-1);
        cases_[2]=new Case(-1,-1);
        cases_[3]=new Case(-1,-1);
    }
public Case getCases(int i){
      return cases_[i];
  }
public JPanel afficheFigure(){
    
        PanneauFigure pan= new PanneauFigure(this);
        return pan;
    
  }
public  void descendre(Grille g) throws Exception{
    if(this.getEtat()==0){
        int ni=4;
        int nj=0;
        if(cases_[0].getX()!=-1){
            ni=cases_[0].getX();
            nj=cases_[0].getY();
        }
        //si on est en bas de la grille
        if(nj==21)throw new Exception();
        //si les cases suisvantes sont ocupées
        if(((cases_[0].getX()==-1)
                &&(g.lireGrille(ni+1, nj)!=null))
                ||((cases_[0].getX()!=-1)
                &&((g.lireGrille(ni, nj+1)!=null)
                ||(g.lireGrille(ni-1, nj)!=null))))
                throw new Exception();
        if(nj==0){         
            if((cases_[0].getY()!=-1)
                    &&(g.lireGrille(ni-1, nj)==null)
                    &&(g.lireGrille(ni, nj+1)==null)){
                g.setGrille(cases_[0], ni, nj+1);
                cases_[0].setX(ni);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
            }
            if((cases_[0].getY()==-1)
                    &&(g.lireGrille(ni+1, nj)==null)){
                g.setGrille(cases_[0], ni+1, nj);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj);
            }
        }
        if(nj==1){
            if((g.lireGrille(ni-1, nj)==null)
                    &&(g.lireGrille(ni, nj+1)==null)){
                g.setGrille(cases_[0], ni, nj+1);
                cases_[0].setX(ni);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni-1, nj-1);
                cases_[3].setX(ni-1);
                cases_[3].setY(nj-1);
                g.setGrille(null, ni, nj-1);
            }
        }
        if(nj>=2){
            if((g.lireGrille(ni-1, nj)==null)
                    &&(g.lireGrille(ni, nj+1)==null)){
                g.setGrille(cases_[0], ni, nj+1);
                cases_[0].setX(ni);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[2], ni-1, nj);
                cases_[2].setX(ni-1);
                cases_[2].setY(nj);
                g.setGrille(cases_[3], ni-1, nj-1);
                cases_[3].setX(ni-1);
                cases_[3].setY(nj-1);
                g.setGrille(null, ni, nj-1);
                g.setGrille(null, ni-1, nj-2);
            }
        }
    }
    if(this.getEtat()==1){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();
        }
        //si on est en bas de la grille
        if(nj==21)throw new Exception();
        //si les cases suivantes sont occupées 
        if((g.lireGrille(ni, nj+1)!=null)
                ||(g.lireGrille(ni-1, nj+1)!=null)
                ||(g.lireGrille(ni+1, nj)!=null))
            throw new Exception();
        if((g.lireGrille(ni, nj+1)==null)
                &&(g.lireGrille(ni-1, nj+1)==null)
                &&(g.lireGrille(ni+1, nj)==null)){
            if(nj==0){
                g.setGrille(cases_[0], ni-1, nj+1);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni, nj+1);
                cases_[1].setX(ni);
                cases_[1].setY(nj+1);
                g.setGrille(cases_[3], ni+1, nj);
                cases_[3].setX(ni+1);
                cases_[3].setY(nj);
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(null, ni-1, nj);
            }
            if(nj>=1){
                g.setGrille(cases_[0], ni-1, nj+1);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni, nj+1);
                cases_[1].setX(ni);
                cases_[1].setY(nj+1);
                g.setGrille(cases_[3], ni+1, nj);
                cases_[3].setX(ni+1);
                cases_[3].setY(nj);
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(null, ni-1, nj);
                g.setGrille(null, ni, nj-1);
                g.setGrille(null, ni+1, nj-1);
            }
        }
        
    }
    if(this.getEtat()==2){
        int ni=4;
        int nj=0;
        if(cases_[3].getX()!=-1){
            ni=cases_[3].getX();
            nj=cases_[3].getY();
        }
        //si on est en bas de la grille
        if(nj==21) throw new Exception();
        //si les cases suivantes sont occupées
        if((g.lireGrille(ni, nj+1)!=null)
                ||(g.lireGrille(ni-1, nj)!=null))
            throw new Exception();
        
        if((g.lireGrille(ni, nj+1)==null)
                &&(g.lireGrille(ni-1, nj)==null)){
            if(nj==0){
                g.setGrille(cases_[3], ni, nj+1);
                cases_[3].setX(ni);
                cases_[3].setY(nj+1);
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(cases_[1], ni-1, nj);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj);
            }
            if(nj==1){
                g.setGrille(cases_[3], ni, nj+1);
                cases_[3].setX(ni);
                cases_[3].setY(nj+1);
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(cases_[1], ni-1, nj);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj);
                g.setGrille(cases_[0], ni-1, nj-1);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj-1);
                g.setGrille(null, ni, nj-1);
            }
            if(nj>=2){
                g.setGrille(cases_[3], ni, nj+1);
                cases_[3].setX(ni);
                cases_[3].setY(nj+1);
                g.setGrille(cases_[2], ni, nj);
                cases_[2].setX(ni);
                cases_[2].setY(nj);
                g.setGrille(cases_[1], ni-1, nj);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj);
                g.setGrille(cases_[0], ni-1, nj-1);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj-1);
                g.setGrille(null, ni, nj-1);
                g.setGrille(null, ni-1, nj-2);
            }
        }
    }
    if(this.getEtat()==3){
        int ni=4;
        int nj=0;
        if(cases_[2].getX()!=-1){
            ni=cases_[2].getX();
            nj=cases_[2].getY();
        }
        //si on est en bas de la grille
        if(nj==21) throw new Exception();
        //si les cases suivantes sont occupées 
        if((g.lireGrille(ni, nj+1)!=null)
                ||(g.lireGrille(ni-1, nj+1)!=null)
                ||(g.lireGrille(ni+1, nj)!=null))
            throw new Exception();
        if((g.lireGrille(ni, nj+1)==null)
                &&(g.lireGrille(ni-1, nj+1)==null)
                &&(g.lireGrille(ni+1, nj)==null)){
            if(nj==0){
                g.setGrille(cases_[2], ni, nj+1);
                cases_[2].setX(ni);
                cases_[2].setY(nj+1);
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[3], ni-1, nj+1);
                cases_[3].setX(ni-1);
                cases_[3].setY(nj+1);
                g.setGrille(cases_[0], ni+1, nj);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj);
                g.setGrille(null, ni-1, nj);
            }
            if(nj>=1){
                g.setGrille(cases_[2], ni, nj+1);
                cases_[2].setX(ni);
                cases_[2].setY(nj+1);
                g.setGrille(cases_[1], ni, nj);
                cases_[1].setX(ni);
                cases_[1].setY(nj);
                g.setGrille(cases_[3], ni-1, nj+1);
                cases_[3].setX(ni-1);
                cases_[3].setY(nj+1);
                g.setGrille(cases_[0], ni+1, nj);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj);
                g.setGrille(null, ni-1, nj);
                g.setGrille(null, ni, nj-1);
                g.setGrille(null, ni+1, nj-1);
            }
        }
    }
} 
public  void deplacerGauche(Grille g){
    if(this.getEtat()==0){
        int ni=4;
        int nj=0;
        if(cases_[0].getX()!=-1){
            ni=cases_[0].getX();
            nj=cases_[0].getY();
        }
        if(ni>1){
            if(nj==0){
                if(g.lireGrille(ni-1, nj)==null){
                    g.setGrille(cases_[0], ni-1, nj);
                    cases_[0].setX(ni-1);
                    cases_[0].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj==1){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj-1)==null)){
                    g.setGrille(cases_[0], ni-1, nj);
                    cases_[0].setX(ni-1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[2], ni-2, nj-1);
                    cases_[2].setX(ni-2);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni-1, nj-1);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-1);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj-1)==null)
                        &&(g.lireGrille(ni-2, nj-2)==null)){
                    g.setGrille(cases_[0], ni-1, nj);
                    cases_[0].setX(ni-1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[2], ni-2, nj-1);
                    cases_[2].setX(ni-2);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni-1, nj-1);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[3], ni-2, nj-2);
                    cases_[3].setX(ni-2);
                    cases_[3].setY(nj-2);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-1);
                    g.setGrille(null, ni-1, nj-2);
                }
            }
        }
    }
    if(this.getEtat()==1){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();
        }
        if(ni>1){
            if(nj==0){
                if(g.lireGrille(ni-2, nj)==null){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni-2, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                    g.setGrille(cases_[2], ni-1, nj-1);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni+1, nj-1);
                }
            }
        }
    }
    if(this.getEtat()==2){
        int ni=4;
        int nj=0;
        if(cases_[3].getX()!=-1){
            ni=cases_[3].getX();
            nj=cases_[3].getY();
        }
        if(ni>1){
            if(nj==0){
                if(g.lireGrille(ni-1, nj)==null){
                    g.setGrille(cases_[3], ni-1, nj);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj==1){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj-1)==null)){
                    g.setGrille(cases_[3], ni-1, nj);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[1], ni-2, nj-1);
                    cases_[1].setX(ni-2);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[2], ni-1, nj-1);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-1);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-2, nj-1)==null)
                        &&(g.lireGrille(ni-2, nj-2)==null)){
                    g.setGrille(cases_[3], ni-1, nj);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[1], ni-2, nj-1);
                    cases_[1].setX(ni-2);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[2], ni-1, nj-1);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[0], ni-2, nj-2);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj-2);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-1);
                    g.setGrille(null, ni-1, nj-2);
                }
            }
        }
    }
    if(this.getEtat()==3){
        int ni=4;
        int nj=0;
        if(cases_[2].getX()!=-1){
            ni=cases_[2].getX();
            nj=cases_[2].getY();
        }
        if(ni>1){
            if(nj==0){
                if(g.lireGrille(ni-2, nj)==null){
                    g.setGrille(cases_[3], ni-2, nj);
                    cases_[3].setX(ni-2);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni-1, nj);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni-2, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)){
                    g.setGrille(cases_[3], ni-2, nj);
                    cases_[3].setX(ni-2);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni-1, nj);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj);
                    g.setGrille(null, ni, nj);
                    g.setGrille(cases_[1], ni-1, nj-1);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[0], ni, nj-1);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-1);
                    g.setGrille(null, ni+1, nj-1);
                }
            }
        }
    }
}
public  void deplacerDroite(Grille g){ 
    if(this.getEtat()==0){
        int ni=4;
        int nj=0;
        if(cases_[0].getX()!=-1){
            ni=cases_[0].getX();
            nj=cases_[0].getY();
        }
        if(ni<9){
            if(nj==0){
                if(g.lireGrille(ni+1, nj)==null){
                    g.setGrille(cases_[0], ni+1, nj);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj==1){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+1, nj-1)==null)){
                    g.setGrille(cases_[0], ni+1, nj);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni+1, nj-1);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni-1, nj-1);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+1, nj-1)==null)
                        &&(g.lireGrille(ni, nj-2)==null)){
                    g.setGrille(cases_[0], ni+1, nj);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[2], ni, nj-1);
                    cases_[2].setX(ni);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[1], ni+1, nj-1);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[3], ni, nj-2);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-2);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni-1, nj-1);
                    g.setGrille(null, ni-1, nj-2);
                }
            }
        }
    }
    if(this.getEtat()==1){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();
        }
        if(ni<8){
            if(nj==0){
                if(g.lireGrille(ni+1, nj)==null){
                    g.setGrille(cases_[0], ni, nj);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni-1, nj);
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+2, nj-1)==null)){
                    g.setGrille(cases_[0], ni, nj);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni-1, nj);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[3], ni+2, nj-1);
                    cases_[3].setX(ni+2);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni, nj-1);
                }
            }
        }
    }
    if(this.getEtat()==2){
        int ni=4;
        int nj=0;
        if(cases_[3].getX()!=-1){
            ni=cases_[3].getX();
            nj=cases_[3].getY();
        }
        if(ni<9){
            if(nj==0){
                if(g.lireGrille(ni+1, nj)==null){
                    g.setGrille(cases_[3], ni+1, nj);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj==1){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+1, nj-1)==null)){
                    g.setGrille(cases_[3], ni+1, nj);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[1], ni, nj-1);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni-1, nj-1);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+1, nj-1)==null)
                        &&(g.lireGrille(ni, nj-2)==null)){
                    g.setGrille(cases_[3], ni+1, nj);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[1], ni, nj-1);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[0], ni, nj-2);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-2);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni-1, nj-1);
                    g.setGrille(null, ni-1, nj-2);
                }
            }
        }
    }
    if(this.getEtat()==3){
        int ni=4;
        int nj=0;
        if(cases_[2].getX()!=-1){
            ni=cases_[2].getX();
            nj=cases_[2].getY();
        }
        if(ni<8){
            if(nj==0){
                if(g.lireGrille(ni+1, nj)==null){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj);
                    g.setGrille(null, ni-1, nj);
                }
            }
            if(nj>=1){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+2, nj-1)==null)){
                    g.setGrille(cases_[3], ni, nj);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj);
                    g.setGrille(null, ni-1, nj);
                    g.setGrille(cases_[1], ni+1, nj-1);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj-1);
                    g.setGrille(cases_[0], ni+2, nj-1);
                    cases_[0].setX(ni+2);
                    cases_[0].setY(nj-1);
                    g.setGrille(null, ni, nj-1);
                }
            }
        }
    }
}
public  void rotate(Grille g){
    if(this.getEtat()==0){
        int ni=4;
        int nj=0;
        if(cases_[0].getX()!=-1){
            ni=cases_[0].getX();
            nj=cases_[0].getY();
        }
        if(ni>1){
            if(nj==0){
                if((cases_[0].getX()!=-1)
                        &&(g.lireGrille(ni-2, nj)==null)
                        &&(g.lireGrille(ni-1, nj)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                    this.setEtat(1);
                    return;
                }
            }
            if(nj==1){
                if((cases_[0].getX()!=-1)
                        &&(g.lireGrille(ni-2, nj)==null)
                        &&(g.lireGrille(ni-1, nj)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    this.setEtat(1);
                    return;
                }
            }
            if(nj>=2){
                if((cases_[0].getX()!=-1)
                        &&(g.lireGrille(ni-2, nj)==null)
                        &&(g.lireGrille(ni-1, nj)==null)){
                    g.setGrille(cases_[0], ni-2, nj);
                    cases_[0].setX(ni-2);
                    cases_[0].setY(nj);
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                    g.setGrille(cases_[3], ni, nj-1);
                    cases_[3].setX(ni);
                    cases_[3].setY(nj-1);
                    g.setGrille(null, ni-1, nj-2);
                    this.setEtat(1);
                    return;
                }
            }
        }
    }
    if(this.getEtat()==1){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();
        }
        if(nj==0){
            if(cases_[1].getX()!=-1){
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                cases_[1].setX(-1);
                cases_[1].setY(-1);
                cases_[0].setX(-1);
                cases_[0].setY(-1);
                g.setGrille(null, ni-1, nj);
                this.setEtat(2);
                return;
            }
        }
        if(nj==1){
            if(g.lireGrille(ni-1, nj-1)==null){
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(cases_[1], ni-1, nj-1);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj-1);
                cases_[0].setX(-1);
                cases_[0].setY(-1);
                g.setGrille(null, ni-1, nj);
                g.setGrille(null, ni+1, nj-1);
                this.setEtat(2);
                return;
            }
        }
        if(nj>=2){
            if((g.lireGrille(ni-1, nj-1)==null)
                    &&(g.lireGrille(ni-1, nj-2)==null)){
                g.setGrille(cases_[3], ni, nj);
                cases_[3].setX(ni);
                cases_[3].setY(nj);
                g.setGrille(cases_[1], ni-1, nj-1);
                cases_[1].setX(ni-1);
                cases_[1].setY(nj-1);
                g.setGrille(cases_[0], ni-1, nj-2);
                cases_[0].setX(ni-1);
                cases_[0].setY(nj-2);
                g.setGrille(null, ni-1, nj);
                g.setGrille(null, ni+1, nj-1);
                this.setEtat(2);
                return;
            }
        }
    }
    if(this.getEtat()==2){
        int ni=4;
        int nj=0;
        if(cases_[3].getX()!=-1){
            ni=cases_[3].getX();
            nj=cases_[3].getY();
        }
        if(ni<9){
            if(nj==1){
                g.setGrille(cases_[3], ni-1, nj-1);
                cases_[3].setX(ni-1);
                cases_[3].setY(nj-1);
                cases_[1].setX(-1);
                cases_[1].setY(-1);
                g.setGrille(null, ni, nj);
                this.setEtat(3);
                return;
            }
            if(nj>=2){
                if((g.lireGrille(ni+1, nj-2)==null)
                        &&(g.lireGrille(ni, nj-2)==null)){
                    g.setGrille(cases_[3], ni-1, nj-1);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj-1);
                    g.setGrille(cases_[1], ni, nj-2);
                    cases_[1].setX(ni);
                    cases_[1].setY(nj-2);
                    g.setGrille(cases_[0], ni+1, nj-2);
                    cases_[0].setX(ni+1);
                    cases_[0].setY(nj-2);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni-1, nj-2);
                    this.setEtat(3);
                    return;
                }
            }
        }
    }
    if(this.getEtat()==3){
        int ni=4;
        int nj=0;
        if(cases_[2].getX()!=-1){
            ni=cases_[2].getX();
            nj=cases_[2].getY();
        }
        if(nj==0){
            if((cases_[2].getX()!=-1)
                    &&(g.lireGrille(ni+1, nj)==null)
                    &&(g.lireGrille(ni+1, nj+1)==null)){
                g.setGrille(cases_[0], ni+1, nj+1);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni+1, nj);
                cases_[1].setX(ni+1);
                cases_[1].setY(nj);
                g.setGrille(null, ni-1, nj);
                cases_[3].setX(-1);
                cases_[3].setY(-1);
                this.setEtat(0);
                return;
            }
        }
        if(nj>=1){
            if((g.lireGrille(ni+1, nj)==null)
                    &&(g.lireGrille(ni+1, nj+1)==null)){
                g.setGrille(cases_[0], ni+1, nj+1);
                cases_[0].setX(ni+1);
                cases_[0].setY(nj+1);
                g.setGrille(cases_[1], ni+1, nj);
                cases_[1].setX(ni+1);
                cases_[1].setY(nj);
                g.setGrille(null, ni-1, nj);
                g.setGrille(cases_[3], ni, nj-1);
                cases_[3].setX(ni);
                cases_[3].setY(nj-1);
                g.setGrille(null, ni+1, nj-1);
                this.setEtat(0);
                return;
            }
        }
    }
}
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class T extends Figure{
    private Case [] cases_;
    public T(){
        cases_=new Case[4];
        cases_[0]=new Case(-1,-1);
        cases_[1]=new Case(-1,-1);
        cases_[2]=new Case(-1,-1);
        cases_[3]=new Case(-1,-1);
    }
    public Case getCases(int i){
      return cases_[i];
  }
    public JPanel afficheFigure(){
    
        PanneauFigure pan= new PanneauFigure(this);
        return pan;
    
  }
 public  void descendre(Grille g) throws Exception{
     if(this.getEtat()==0){
         int ni=4;
         int nj=0;
         if(cases_[1].getX()!=-1){
             ni=cases_[1].getX();
             nj=cases_[1].getY();
         }
         //si on est en bas de la grille
         if(nj==21) throw new Exception();
         //si les cases suivantes sont ocupées
         if((cases_[1].getY()!=-1)&&(g.lireGrille(ni, nj+1)!=null))
             throw new Exception();
         if((cases_[1].getY()==-1)&&(g.lireGrille(ni, nj)!=null))
             throw new Exception();
         if((cases_[1].getY()==0)&&(g.lireGrille(ni+1, nj)!=null))
             throw new Exception();
         if(nj==0){
             if(cases_[1].getY()==0){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni, nj+1)==null)){
                     g.setGrille(cases_[1], ni, nj+1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj+1);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     return;
                 }
             }
             if((cases_[1].getY()==-1)
                     &&(g.lireGrille(ni, nj)==null)){
                 g.setGrille(cases_[1], ni, nj);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj);
                 return;
             }
         }
         if(nj==1){
             if((g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[1], ni, nj+1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj+1);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[3], ni, nj-1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     return;
             }
         }
         if(nj>=2){
             if((g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[1], ni, nj+1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj+1);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[3], ni, nj-1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni, nj-2);
                     return;
             }
         }
         throw new Exception();
     }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
             ni=cases_[0].getX();
             nj=cases_[0].getY();
         }
         //si on est en bas 
         if(nj==21) throw new Exception();
         //si les cases suivantes sont occupées 
         if((g.lireGrille(ni, nj+1)!=null)
                 ||(g.lireGrille(ni+1, nj)!=null)
                 ||(g.lireGrille(ni-1, nj)!=null))
             throw new Exception();
         if((g.lireGrille(ni, nj+1)==null)
                 &&(g.lireGrille(ni+1, nj)==null)
                 &&(g.lireGrille(ni-1, nj)==null)){
             if(nj==0){
                 if(cases_[0].getX()!=-1){
                     g.setGrille(cases_[0], ni, nj+1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj+1);
                     g.setGrille(cases_[1], ni-1, nj);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                 }
             }
             if(nj>=1){
                 g.setGrille(cases_[0], ni, nj+1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj+1);
                     g.setGrille(cases_[1], ni-1, nj);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni-1, nj-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni+1, nj-1);
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         //si en est en bas de la grille
         if(nj==21) throw new Exception();
         //si les cases suivantes sont occuppées
         if((g.lireGrille(ni-1, nj)!=null)
                 ||(g.lireGrille(ni, nj+1)!=null))
             throw new Exception();
         if((g.lireGrille(ni-1, nj)==null)
                 &&(g.lireGrille(ni, nj+1)==null)){
             if(nj==0){
                 if(cases_[3].getX()!=-1){
                     g.setGrille(cases_[3], ni, nj+1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj+1);
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                 }
             }
             if(nj==1){
                     g.setGrille(cases_[3], ni, nj+1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj+1);
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[1], ni, nj-1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj-1);
                     g.setGrille(null, ni-1, nj-1);
             }
             if(nj>=2){
                 g.setGrille(cases_[3], ni, nj+1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj+1);
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[1], ni, nj-1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj-1);
                     g.setGrille(null, ni-1, nj-1);
                     g.setGrille(null, ni, nj-2);
             }
         }
           
         
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[2].getX()!=-1){
             ni=cases_[2].getX();
             nj=cases_[2].getY();
         }
         //si on est en bas de la grille
         if(nj==21)throw new Exception();
         //si les cases suivantes sont occupées 
         if((g.lireGrille(ni, nj+1)!=null)
                 ||(g.lireGrille(ni-1, nj+1)!=null)
                 ||(g.lireGrille(ni+1, nj+1)!=null))
             throw new Exception();
         
         if((g.lireGrille(ni, nj+1)==null)
                 &&(g.lireGrille(ni-1, nj+1)==null)
                 &&(g.lireGrille(ni+1, nj+1)==null)){
             if(nj==0){
                 if(cases_[2].getX()!=-1){
                     g.setGrille(cases_[2], ni, nj+1);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj+1);
                     g.setGrille(cases_[1], ni+1, nj+1);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj+1);
                     g.setGrille(cases_[3], ni-1, nj+1);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj+1);
                     g.setGrille(cases_[0], ni, nj);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni-1, nj);
                     g.setGrille(null, ni+1, nj);
                 }
             }
             if(nj>=1){
                     g.setGrille(cases_[2], ni, nj+1);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj+1);
                     g.setGrille(cases_[1], ni+1, nj+1);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj+1);
                     g.setGrille(cases_[3], ni-1, nj+1);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj+1);
                     g.setGrille(cases_[0], ni, nj);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni-1, nj);
                     g.setGrille(null, ni+1, nj);
                     g.setGrille(null, ni, nj-1);
             }
         }
     }
 } 
 public  void deplacerGauche(Grille g){
     if(this.getEtat()==0){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();            
        }
        if(ni>0){
            if(nj==0){
                if((cases_[1].getX()!=-1)
                        &&(g.lireGrille(ni-1, nj)==null)){
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj==1){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)){
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni-1, nj-1);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[0], ni, nj-1);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-1);
                    g.setGrille(null, ni+1, nj-1);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni-1, nj)==null)
                        &&(g.lireGrille(ni-1, nj-1)==null)
                        &&(g.lireGrille(ni-1, nj-2)==null)){
                    g.setGrille(cases_[1], ni-1, nj);
                    cases_[1].setX(ni-1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni-1, nj-1);
                    cases_[2].setX(ni-1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[0], ni, nj-1);
                    cases_[0].setX(ni);
                    cases_[0].setY(nj-1);
                    g.setGrille(cases_[3], ni-1, nj-2);
                    cases_[3].setX(ni-1);
                    cases_[3].setY(nj-2);
                    g.setGrille(null, ni+1, nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-2);
                }
            }
        }
    }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
             ni=cases_[0].getX();
             nj=cases_[0].getY();
         }
         if(ni>1){
             if(nj==0){
                 if((cases_[0].getX()!=-1)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni-2, nj-1)==null)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[1], ni-2, nj-1);
                     cases_[1].setX(ni-2);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[2], ni-1, nj-1);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[3], ni, nj-1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni, nj);
                     
                 }
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         if(ni>1){
             if(nj==0){
                 if((cases_[3].getX()!=-1)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[3], ni-1, nj);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni-1, nj)==null)
                         &&(g.lireGrille(ni-2, nj-1)==null)){
                     g.setGrille(cases_[3], ni-1, nj);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj);                     
                     g.setGrille(cases_[0], ni-2, nj-1);
                     cases_[0].setX(ni-2);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[2], ni-1, nj-1);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni-1, nj)==null)
                         &&(g.lireGrille(ni-2, nj-1)==null)
                         &&(g.lireGrille(ni-1, nj-2)==null)){
                     g.setGrille(cases_[3], ni-1, nj);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj);                     
                     g.setGrille(cases_[0], ni-2, nj-1);
                     cases_[0].setX(ni-2);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[2], ni-1, nj-1);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[1], ni-1, nj-2);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj-2);                     
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                     g.setGrille(null, ni, nj-2);
                 }
             }
         }
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[2].getX()!=-1){
             ni=cases_[2].getX();
             nj=cases_[2].getY();
         }
         if(ni>1){
             if(nj==0){
                 if((cases_[2].getX()!=-1)
                         &&(g.lireGrille(ni-2, nj)==null)){
                     g.setGrille(cases_[3], ni-2, nj);
                     cases_[3].setX(ni-2);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni-1, nj);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[1], ni, nj);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj);
                     g.setGrille(null, ni+1, nj);
                 }
             }
             if(nj>=1){
                  if((g.lireGrille(ni-1, nj-1)==null)
                         &&(g.lireGrille(ni-2, nj)==null)){
                     g.setGrille(cases_[3], ni-2, nj);
                     cases_[3].setX(ni-2);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni-1, nj);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[1], ni, nj);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[0], ni-1, nj-1);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni+1, nj);                     
                 }
             }
         }
     }
     
 }
 public  void deplacerDroite(Grille g){
    if(this.getEtat()==0){
        int ni=4;
        int nj=0;
        if(cases_[1].getX()!=-1){
            ni=cases_[1].getX();
            nj=cases_[1].getY();            
        }
        if(ni<8){
            if(nj==0){
                if((cases_[1].getX()!=-1)
                        &&(g.lireGrille(ni+1, nj)==null)){
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj==1){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+2, nj-1)==null)){
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[0], ni+2, nj-1);
                    cases_[0].setX(ni+2);
                    cases_[0].setY(nj-1);
                    g.setGrille(null, ni, nj-1);
                    g.setGrille(null, ni, nj);
                }
            }
            if(nj>=2){
                if((g.lireGrille(ni+1, nj)==null)
                        &&(g.lireGrille(ni+2, nj-1)==null)
                        &&(g.lireGrille(ni+1, nj-2)==null)){
                    g.setGrille(cases_[1], ni+1, nj);
                    cases_[1].setX(ni+1);
                    cases_[1].setY(nj);
                    g.setGrille(cases_[2], ni+1, nj-1);
                    cases_[2].setX(ni+1);
                    cases_[2].setY(nj-1);
                    g.setGrille(cases_[0], ni+2, nj-1);
                    cases_[0].setX(ni+2);
                    cases_[0].setY(nj-1);
                    g.setGrille(cases_[3], ni+1, nj-2);
                    cases_[3].setX(ni+1);
                    cases_[3].setY(nj-2);
                    g.setGrille(null, ni, nj-1);
                    g.setGrille(null, ni, nj);
                    g.setGrille(null, ni, nj-2);
                }
            }
        }
    }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
             ni=cases_[0].getX();
             nj=cases_[0].getY();
         }
         if(ni<8){
             if(nj==0){
                 if((cases_[0].getX()!=-1)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni+2, nj-1)==null)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[1], ni, nj-1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[2], ni+1, nj-1);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[3], ni+2, nj-1);
                     cases_[3].setX(ni+2);
                     cases_[3].setY(nj-1);
                     g.setGrille(null, ni-1, nj-1);
                     g.setGrille(null, ni, nj);
                     
                 }
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         if(ni<9){
             if(nj==0){
                 if((cases_[3].getX()!=-1)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni+2, nj-1)==null)){
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);                     
                     g.setGrille(cases_[0], ni, nj-1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[2], ni+1, nj-1);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj-1);
                     g.setGrille(null, ni-1, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni+1, nj-1)==null)
                         &&(g.lireGrille(ni+1, nj-2)==null)){
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);                     
                     g.setGrille(cases_[0], ni, nj-1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[2], ni+1, nj-1);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[1], ni+1, nj-2);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj-2);                     
                     g.setGrille(null, ni-1, nj-1);
                     g.setGrille(null, ni, nj);
                     g.setGrille(null, ni, nj-2);
                 }
             }
         }
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[2].getX()!=-1){
             ni=cases_[2].getX();
             nj=cases_[2].getY();
         }
         if(ni<8){
             if(nj==0){
                 if((cases_[2].getX()!=-1)
                         &&(g.lireGrille(ni+2, nj)==null)){
                     g.setGrille(cases_[3], ni, nj);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[1], ni+2, nj);
                     cases_[1].setX(ni+2);
                     cases_[1].setY(nj);
                     g.setGrille(null, ni-1, nj);
                 }
             }
             if(nj>=1){
                  if((g.lireGrille(ni+1, nj-1)==null)
                         &&(g.lireGrille(ni+2, nj)==null)){
                     g.setGrille(cases_[3], ni, nj);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[1], ni+2, nj);
                     cases_[1].setX(ni+2);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[0], ni+1, nj-1);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni-1, nj);                     
                 }
             }
         }
     }
 }
 public  void rotate(Grille g){
 if(this.getEtat()==0){
     int ni=4;
     int nj=0;
     if(cases_[1].getX()!=-1){
         ni=cases_[1].getX();
         nj=cases_[1].getY();
     }
     if(ni>0){
         if(nj==0){
             if(cases_[1].getX()!=-1){
                 g.setGrille(cases_[0], ni, nj);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj);
                 cases_[1].setX(-1);
                 cases_[1].setY(-1);
                 this.setEtat(1);
                 return;
             }
         }
         if(nj==1){
             if(g.lireGrille(ni-1, nj-1)==null){
                 g.setGrille(cases_[0], ni, nj);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj);
                 g.setGrille(cases_[1], ni-1, nj-1);
                 cases_[1].setX(ni-1);
                 cases_[1].setY(nj-1);
                 g.setGrille(cases_[3], ni+1, nj-1);
                 cases_[3].setX(ni+1);
                 cases_[3].setY(nj-1);
                 this.setEtat(1);
                 return;
             }
         }
         if(nj>=2){
             if(g.lireGrille(ni-1, nj-1)==null){
                 g.setGrille(cases_[0], ni, nj);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj);
                 g.setGrille(cases_[1], ni-1, nj-1);
                 cases_[1].setX(ni-1);
                 cases_[1].setY(nj-1);
                 g.setGrille(cases_[3], ni+1, nj-1);
                 cases_[3].setX(ni+1);
                 cases_[3].setY(nj-1);
                 g.setGrille(null, ni, nj-2);
                 this.setEtat(1);
                 return;
             }
         }
     }
 }
 if(this.getEtat()==1){
     int ni=4;
     int nj=0;
     if(cases_[0].getX()!=-1){
         ni=cases_[0].getX();
         nj=cases_[0].getY();
     }
     if(nj==0){
         if(cases_[0].getX()!=-1){
             g.setGrille(cases_[3], ni, nj);
             cases_[3].setX(ni);
             cases_[3].setY(nj);
             cases_[0].setX(-1);
             cases_[0].setY(-1);
             this.setEtat(2);
             return;
         }
     }
     if(nj==1){
             g.setGrille(cases_[3], ni, nj);
             cases_[3].setX(ni);
             cases_[3].setY(nj);
             g.setGrille(cases_[0], ni-1, nj-1);
             cases_[0].setX(ni-1);
             cases_[0].setY(nj-1);
             g.setGrille(null, ni+1, nj-1);
             this.setEtat(2);
             return;
     }
     if(nj>=2){
             g.setGrille(cases_[3], ni, nj);
             cases_[3].setX(ni);
             cases_[3].setY(nj);
             g.setGrille(cases_[0], ni-1, nj-1);
             cases_[0].setX(ni-1);
             cases_[0].setY(nj-1);
             g.setGrille(cases_[1], ni, nj-2);
             cases_[0].setX(ni);
             cases_[0].setY(nj-2);
             g.setGrille(null, ni+1, nj-1);
             this.setEtat(2);
             return;
     }
 }
 if(this.getEtat()==2){
     int ni=4;
     int nj=0;
     if(cases_[3].getX()!=-1){
         ni=cases_[3].getX();
         nj=cases_[3].getY();
     }
     if(ni<9){
         /*if(nj==0){
             if(cases_[3].getX()!=-1){
                 cases_[3].setX(-1);
                 cases_[3].setX(-1);
             }
         }*/
         if(nj==1){
             if(g.lireGrille(ni+1, nj-1)==null){
                 g.setGrille(cases_[1], ni+1, nj-1);
                 cases_[1].setX(ni+1);
                 cases_[1].setY(nj-1);
                 g.setGrille(cases_[3], ni-1, nj-1);
                 cases_[3].setX(ni-1);
                 cases_[3].setY(nj-1);
                 g.setGrille(null, ni, nj);
                 this.setEtat(3);
                 return;
             }
         }
         if(nj>=2){
             if(g.lireGrille(ni+1, nj-1)==null){
                 g.setGrille(cases_[1], ni+1, nj-1);
                 cases_[1].setX(ni+1);
                 cases_[1].setY(nj-1);
                 g.setGrille(cases_[3], ni-1, nj-1);
                 cases_[3].setX(ni-1);
                 cases_[3].setY(nj-1);
                 g.setGrille(cases_[0], ni, nj-2);
                 g.setGrille(null, ni, nj);
                 this.setEtat(3);
                 return;
             }
         }
     }
 }
 if(this.getEtat()==3){
     int ni=4;
     int nj=0;
     if(cases_[2].getX()!=-1){
         ni=cases_[2].getX();
         nj=cases_[2].getY();
     }
     if(nj==0){
         if((cases_[2].getX()!=-1)
                 &&(g.lireGrille(ni, nj+1)==null)){
             g.setGrille(cases_[1], ni, nj+1);
             cases_[1].setX(ni);
             cases_[1].setY(nj+1);
             g.setGrille(cases_[0], ni+1, nj);
             cases_[0].setX(ni+1);
             cases_[0].setY(nj);
             cases_[3].setX(-1);
             cases_[3].setY(-1);
             g.setGrille(null, ni-1, nj); 
             this.setEtat(0);
             return;
         }
     }
     if(nj>=1){
         if(g.lireGrille(ni, nj+1)==null){
             g.setGrille(cases_[1], ni, nj+1);
             cases_[1].setX(ni);
             cases_[1].setY(nj+1);
             g.setGrille(cases_[0], ni+1, nj);
             cases_[0].setX(ni+1);
             cases_[0].setY(nj);
             g.setGrille(cases_[3], ni, nj-1);
             cases_[3].setX(ni);
             cases_[3].setY(nj-1);
             g.setGrille(null, ni-1, nj);
             this.setEtat(0);
             return;
         }
     }
 }
 } 
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Thread1 extends Thread implements KeyListener {
    private Timer timer_1;    
    private Figure fig_;
    private Figure fig_next;
    private JPanel pan_next_fig;
    private JPanel pan_grille_;
    private JLabel jLabel_1;
    private JLabel jLabel_2;
    private Grille grille_;
    private Grille grille_2;
    private int delai_=1000;
    private JPanel pan_figure_;
    private JPanel jPanel4;
    private Thread2 thread_2;
    
    
public Thread1(JPanel pan_g, JPanel pan_fig,JLabel jl, 
        Thread2 th2,Grille g1, Grille g2){
       
        thread_2=th2;
        //affichage de la grille
        jLabel_1=jl;
        grille_=g1;
        grille_2=g2;
        pan_grille_=grille_.afficheGrille();
        pan_grille_.setBounds(0,0,251,551);       
        pan_g.add(pan_grille_);
        pan_grille_.setBackground(Color.black);
        fig_=Controle.newFigure();
        //next figure
        pan_next_fig=pan_fig;
        fig_next=Controle.newFigure();
        pan_figure_=fig_next.afficheFigure();
        pan_next_fig.add(pan_figure_);
        pan_figure_.repaint();
        pan_figure_.setBounds(0,0,101,101);
        pan_figure_.setBackground(Color.black);
}
public Timer getTimer(){
        return timer_1;
    }
public void setLabel(String s){
    jLabel_1.setVisible(true);
    jLabel_1.setText(s);
}
public Grille getGrille(){
    return grille_;
}
public void run(){
    
timer_1 = new Timer(delai_, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
//Inserer ici le code a repeter
        try{
    fig_.descendre(grille_);
   
    }
    catch (Exception ex) {
        
        if((grille_.lireGrille(4, 0)!=null)
                    ||(grille_.lireGrille(5, 0)!=null)){
            
                jLabel_1.setVisible(true);                
                //affichage_.setVisible(false);
                jLabel_1.setText("GAME OVER");
                pan_grille_.add(jLabel_1);
                pan_grille_.repaint();
                //affichage_.setEnabled(true);
                timer_1.stop();
                thread_2.getTimer().stop();
                thread_2.setLabel("YOU ARE THE WINNER");
                //System.out.println("je suis là");
                return;
                }           
            //timer.stop();
            //Controle.simul_2(grille_,grille_2);
             Controle.simul_2(grille_,grille_2);
            delai_=Controle.delay(grille_);
            timer_1.setDelay(delai_);
                       
            pan_grille_.repaint();            
            fig_=fig_next;
            fig_next=Controle.newFigure();           
                 
                pan_figure_=fig_next.afficheFigure();
                pan_next_fig.add(pan_figure_);
                pan_figure_.repaint();                
                pan_figure_.setBounds(0,0,101,101);
                pan_figure_.setBackground(Color.black);
                
                
            }
    finally{        
         pan_grille_.repaint();
        //System.out.println("finaly:   "+fig_+"   "+test);
        }  
    
     
                
            }});
timer_1.start();
}

    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {timer_1.setDelay(50);}
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(timer_1.isRunning()){
         if(e.getKeyCode()==KeyEvent.VK_LEFT)
        {fig_.deplacerGauche(grille_);
             pan_grille_.repaint();}
         else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
        {
          fig_.deplacerDroite(grille_);
            pan_grille_.repaint();
        }
         else if(e.getKeyCode()==KeyEvent.VK_UP)
        {
          fig_.rotate(grille_);
            pan_grille_.repaint();
        }
         else if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {timer_1.setDelay(delai_);}         
        }
    }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Thread2 extends Thread implements KeyListener {
    private Timer timer_1;    
    private Figure fig_;
    private Figure fig_next;
    private JPanel pan_next_fig;
    private JPanel pan_grille_;
    private JLabel jLabel_1;
    private JLabel jLabel_2;
    private Grille grille_;
    private Grille grille_2;
    private int delai_=1000;
    private JPanel pan_figure_;
    private JPanel jPanel4;
    private Thread1 thread_1;
    
public Thread2(JPanel pan_g, JPanel pan_fig,JLabel jl,Thread1 th1,
        Grille g1, Grille g2){
       
        thread_1=th1;
        //affichage de la grille
        jLabel_1=jl;
        grille_=g1;
        grille_2=g2;
        pan_grille_=grille_.afficheGrille();
        pan_grille_.setBounds(0,0,251,551);       
        pan_g.add(pan_grille_);
        pan_grille_.setBackground(Color.black);
        fig_=Controle.newFigure();
        //next figure
        fig_next=Controle.newFigure();
        pan_figure_=fig_next.afficheFigure();
        pan_fig.add(pan_figure_);
        pan_next_fig=pan_fig;
        pan_figure_.repaint();
        pan_figure_.setBounds(0,0,101,101);
        pan_figure_.setBackground(Color.black);
}
public Timer getTimer(){
        return timer_1;
    }
public void setLabel(String s){
    jLabel_1.setVisible(true);
    jLabel_1.setText(s);
}
public Grille getGrille(){
    return grille_;
}
public void run(){
    
timer_1 = new Timer(delai_, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
//Inserer ici le code a repeter
        try{
    fig_.descendre(grille_);
   
    }
    catch (Exception ex) {
        
        if((grille_.lireGrille(4, 0)!=null)
                    ||(grille_.lireGrille(5, 0)!=null)){
            
                jLabel_1.setVisible(true);                
                //affichage_.setVisible(false);
                jLabel_1.setText("GAME OVER");
                pan_grille_.add(jLabel_1);
                pan_grille_.repaint();
                //affichage_.setEnabled(true);
                timer_1.stop();
                thread_1.getTimer().stop();
                thread_1.setLabel("YOU ARE THE WINNER");
                //System.out.println("je suis là");
                return;
                }           
            //timer.stop();
            Controle.simul_2(grille_,grille_2);
            //Controle.simul(grille_);
            delai_=Controle.delay(grille_);
            timer_1.setDelay(delai_);
                       
            pan_grille_.repaint();            
            fig_=fig_next;
            fig_next=Controle.newFigure();           
                 
                pan_figure_=fig_next.afficheFigure();                
                //jPanel3.add(affichage_fig);
                pan_next_fig.add(pan_figure_);
                pan_figure_.repaint();
                pan_figure_.setBounds(0,0,101,101);
                pan_figure_.setBackground(Color.black);
                
                
            }
    finally{        
         pan_grille_.repaint();
        //System.out.println("finaly:   "+fig_+"   "+test);
        }               
            }});
timer_1.start();
}

    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_D)
        {timer_1.setDelay(50);}
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(timer_1.isRunning()){
         if(e.getKeyCode()==KeyEvent.VK_S)
        {fig_.deplacerGauche(grille_);
             pan_grille_.repaint();}
         else if(e.getKeyCode()==KeyEvent.VK_F)
        {
          fig_.deplacerDroite(grille_);
            pan_grille_.repaint();
        }
         else if(e.getKeyCode()==KeyEvent.VK_E)
        {
          fig_.rotate(grille_);
            pan_grille_.repaint();
        }
         else if(e.getKeyCode()==KeyEvent.VK_D)
        {timer_1.setDelay(delai_);}         
        }
    }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * @author zero
 */
public class Z  extends Figure  {
    private Case [] cases_;
    public Z(){
        cases_=new Case[4];
        cases_[0]=new Case(-1,-1);
        cases_[1]=new Case(-1,-1);
        cases_[2]=new Case(-1,-1);
        cases_[3]=new Case(-1,-1);
    }
    public Case getCases(int i){
      return cases_[i];
  }
    public JPanel afficheFigure(){
    
        PanneauFigure pan= new PanneauFigure(this);
        return pan;
    
  }
 public  void descendre(Grille g) throws Exception{
     if(this.getEtat()==0){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
             ni=cases_[0].getX();
             nj=cases_[0].getY();
         }
        //System.out.println("nj  ="+nj);
         //si on est en bas de la grille
         if(nj==21) throw new Exception();
         //si les cases suivantes sont occupées
         if((g.lireGrille(ni, nj+1)!=null)){
             //System.out.println("nj exception  ="+nj);
             throw new Exception();             
         }
         if((cases_[0].getY()==-1)&&(g.lireGrille(ni, nj)!=null))
             throw new Exception();
         if((cases_[0].getY()==0)&&(g.lireGrille(ni+1, nj)!=null))
             throw new Exception();
         //System.out.println("nj  ="+nj);
         
         if(nj==0){
             if((cases_[0].getY()==0)
                     &&(g.lireGrille(ni+1, nj)==null)
                     &&(g.lireGrille(ni, nj+1)==null)){
                 g.setGrille(cases_[0], ni, nj+1);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[2], ni+1, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj+1);
                 return;
             }
             if((cases_[0].getY()==-1)
                     &&(g.lireGrille(ni, nj)==null)){
                 g.setGrille(cases_[0], ni, nj);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj);
                 return;
             }
         }
         if(nj==1){
             if((g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj)==null)){
                 g.setGrille(cases_[0], ni, nj+1);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[2], ni+1, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj+1);
                 g.setGrille(cases_[3], ni+1, nj-1);
                 cases_[3].setX(ni+1);
                 cases_[3].setY(nj-1);
                 g.setGrille(null, ni, nj-1);
                 return;
             }
         }
         if(nj>=2){
             if((g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj)==null)){
                 g.setGrille(cases_[0], ni, nj+1);
                 cases_[0].setX(ni);
                 cases_[0].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[2], ni+1, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj+1);
                 g.setGrille(cases_[3], ni+1, nj-1);
                 cases_[3].setX(ni+1);
                 cases_[3].setY(nj-1);
                 g.setGrille(null, ni, nj-1);
                 g.setGrille(null, ni+1, nj-2);
                 return;
             }
         }
         throw new Exception();
     }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[2].getX()!=-1){
             ni=cases_[2].getX();
             nj=cases_[2].getY();
         }
         //si on est en bas de la grille
         if(nj==21)throw new Exception();
         //si les cases suivantes sont occupées
         if((cases_[2].getX()!=-1)
                 &&((g.lireGrille(ni, nj+1)!=null)
                 ||(g.lireGrille(ni+1, nj+1)!=null)
                 ||(g.lireGrille(ni-1, nj)!=null)))
             throw new Exception();
         if(nj==0){
             if((cases_[2].getX()!=-1)
                     &&(g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj+1)==null)
                     &&(g.lireGrille(ni-1, nj)==null)){
                 g.setGrille(cases_[3], ni+1, nj+1);
                 cases_[3].setX(ni+1);
                 cases_[3].setY(nj+1);
                 g.setGrille(cases_[2], ni, nj+1);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[0], ni-1, nj);
                 cases_[0].setX(ni-1);
                 cases_[0].setY(nj);
                 g.setGrille(null, ni+1, nj);
             }
         }
         if(nj>=1){
             if((g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj+1)==null)
                     &&(g.lireGrille(ni-1, nj)==null)){
                 g.setGrille(cases_[3], ni+1, nj+1);
                 cases_[3].setX(ni+1);
                 cases_[3].setY(nj+1);
                 g.setGrille(cases_[2], ni, nj+1);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[0], ni-1, nj);
                 cases_[0].setX(ni-1);
                 cases_[0].setY(nj);
                 g.setGrille(null, ni+1, nj);
                 g.setGrille(null, ni, nj-1);
                 g.setGrille(null, ni-1, nj-1);
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         //si on est en bas de la grille
         if(nj==21) throw new Exception();
         //si les cases suivantes sont occupées 
         if((g.lireGrille(ni, nj+1)!=null)
                 ||(g.lireGrille(ni+1, nj)!=null))
             throw new Exception();
         if(nj==0){
             if((cases_[3].getX()!=-1)
                     &&(g.lireGrille(ni+1, nj)==null)
                     &&(g.lireGrille(ni, nj+1)==null)){
                 g.setGrille(cases_[3], ni, nj+1);
                 cases_[3].setX(ni);
                 cases_[3].setY(nj+1);
                 g.setGrille(cases_[1], ni+1, nj);
                 cases_[1].setX(ni+1);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[2], ni, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj);
             }
         }
         if(nj==1){
             if((g.lireGrille(ni+1, nj)==null)
                     &&(g.lireGrille(ni, nj+1)==null)){
                 g.setGrille(cases_[3], ni, nj+1);
                 cases_[3].setX(ni);
                 cases_[3].setY(nj+1);
                 g.setGrille(cases_[1], ni+1, nj);
                 cases_[1].setX(ni+1);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[2], ni, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj);
                 g.setGrille(cases_[0], ni+1, nj-1);
                 cases_[0].setX(ni+1);
                 cases_[0].setY(nj-1);
                 g.setGrille(null, ni, nj-1);
             }
         }
         if(nj>=2){
             if((g.lireGrille(ni+1, nj)==null)
                     &&(g.lireGrille(ni, nj+1)==null)){
                 g.setGrille(cases_[3], ni, nj+1);
                 cases_[3].setX(ni);
                 cases_[3].setY(nj+1);
                 g.setGrille(cases_[1], ni+1, nj);
                 cases_[1].setX(ni+1);
                 cases_[1].setY(nj);
                 g.setGrille(cases_[2], ni, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj);
                 g.setGrille(cases_[0], ni+1, nj-1);
                 cases_[0].setX(ni+1);
                 cases_[0].setY(nj-1);
                 g.setGrille(null, ni, nj-1);
                 g.setGrille(null, ni+1, nj-2);
             }
         }
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[1].getX()!=-1){
             ni=cases_[1].getX();
             nj=cases_[1].getY();
         }
         //si on est en bas de la grille
         if(nj==21)throw new Exception();
         //si les cases suivantes sont occupées
         if((cases_[1].getX()!=-1)
                 &&((g.lireGrille(ni, nj+1)!=null)
                 ||(g.lireGrille(ni+1, nj+1)!=null)
                 ||(g.lireGrille(ni-1, nj)!=null)))
             throw new Exception();
         if(nj==0){
             if((cases_[1].getX()!=-1)
                     &&(g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj+1)==null)
                     &&(g.lireGrille(ni-1, nj)==null)){
                 g.setGrille(cases_[0], ni+1, nj+1);
                 cases_[0].setX(ni+1);
                 cases_[0].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj+1);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj+1);
                 g.setGrille(cases_[2], ni, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj);
                 g.setGrille(cases_[3], ni-1, nj);
                 cases_[3].setX(ni-1);
                 cases_[3].setY(nj);
                 g.setGrille(null, ni+1, nj);
             }
         }
         if(nj>=1){
             if((g.lireGrille(ni, nj+1)==null)
                     &&(g.lireGrille(ni+1, nj+1)==null)
                     &&(g.lireGrille(ni-1, nj)==null)){
                 g.setGrille(cases_[0], ni+1, nj+1);
                 cases_[0].setX(ni+1);
                 cases_[0].setY(nj+1);
                 g.setGrille(cases_[1], ni, nj+1);
                 cases_[1].setX(ni);
                 cases_[1].setY(nj+1);
                 g.setGrille(cases_[2], ni, nj);
                 cases_[2].setX(ni);
                 cases_[2].setY(nj);
                 g.setGrille(cases_[3], ni-1, nj);
                 cases_[3].setX(ni-1);
                 cases_[3].setY(nj);
                 g.setGrille(null, ni+1, nj);
                 g.setGrille(null, ni, nj-1);
                 g.setGrille(null, ni-1, nj-1);
             }
         }
         
     }
 } 
 public  void deplacerGauche(Grille g){
     if(this.getEtat()==0){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
             ni=cases_[0].getX();
             nj=cases_[0].getY();
         }
         if(ni>0){
             if(nj==0){
                 if((cases_[0].getX()!=-1)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni-1, nj)==null)
                         &&(g.lireGrille(ni-1, nj-1)==null)){
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[1], ni-1, nj-1);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[2], ni, nj-1);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni-1, nj)==null)
                         &&(g.lireGrille(ni-1, nj-1)==null)
                         &&(g.lireGrille(ni, nj-2)==null)){
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[1], ni-1, nj-1);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[2], ni, nj-1);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[3], ni, nj-2);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj-2);
                     g.setGrille(null, ni+1, nj-2);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
         }
     }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[2].getX()!=-1){
             ni=cases_[2].getX();
             nj=cases_[2].getY();
         }
         if(ni>1){
             if(nj==0){
                 if((cases_[2].getX()!=-1)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[2], ni-1, nj);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni, nj);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni+1, nj);
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni-2, nj-1)==null)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[2], ni-1, nj);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni, nj);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[0], ni-2, nj-1);
                     cases_[0].setX(ni-2);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[1], ni-1, nj-1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj);
                     g.setGrille(null, ni+1, nj);
                     g.setGrille(null, ni, nj-1);
                 }
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         if(ni>0){
             if(nj==0){
                 if((cases_[3].getX()!=-1)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[0], ni-1, nj);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni-1, nj)==null)
                         &&(g.lireGrille(ni-1, nj-1)==null)){
                     g.setGrille(cases_[3], ni-1, nj);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni-1, nj-1);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[1], ni, nj-1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni-1, nj)==null)
                         &&(g.lireGrille(ni-1, nj-1)==null)
                         &&(g.lireGrille(ni, nj-2)==null)){
                     g.setGrille(cases_[3], ni-1, nj);
                     cases_[3].setX(ni-1);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni-1, nj-1);
                     cases_[2].setX(ni-1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[1], ni, nj-1);
                     cases_[1].setX(ni);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[0], ni, nj-2);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj-2);
                     g.setGrille(null, ni+1, nj-2);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
         }
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[1].getX()!=-1){
             ni=cases_[1].getX();
             nj=cases_[1].getY();
         }
         if(ni>1){
             if(nj==0){
                 if((cases_[1].getX()!=-1)
                         &&(g.lireGrille(ni-1, nj)==null)){
                     g.setGrille(cases_[1], ni-1, nj);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[0], ni, nj);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni+1, nj);
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni-2, nj-1)==null)
                         &&(g.lireGrille(ni-1, nj)==null)){
                    g.setGrille(cases_[1], ni-1, nj);
                     cases_[1].setX(ni-1);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[0], ni, nj);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[3], ni-2, nj-1);
                     cases_[3].setX(ni-2);
                     cases_[3].setY(nj-1);
                     g.setGrille(cases_[2], ni-1, nj-1);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(null, ni+1, nj);
                     g.setGrille(null, ni, nj-1);
                 }
             }
         }
     }
 }
 public  void deplacerDroite(Grille g){
      if(this.getEtat()==0){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
             ni=cases_[0].getX();
             nj=cases_[0].getY();
         }
         if((ni<8)&&(ni>=0)){
             if(nj==0){
                 if((cases_[0].getX()!=-1)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni+2, nj-1)==null)){
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[1], ni+1, nj-1);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[2], ni+2, nj-1);
                     cases_[2].setX(ni+2);
                     cases_[2].setY(nj-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni+2, nj-1)==null)
                         &&(g.lireGrille(ni+2, nj-2)==null)){
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[0].setX(ni+1);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[1], ni+1, nj-1);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[2], ni+2, nj-1);
                     cases_[2].setX(ni+2);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[3], ni+2, nj-2);
                     cases_[3].setX(ni+2);
                     cases_[3].setY(nj-2);
                     g.setGrille(null, ni+1, nj-2);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
         }
     }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[2].getX()!=-1){
             ni=cases_[2].getX();
             nj=cases_[2].getY();
         }
         if(ni<8){
             if(nj==0){
                 if((cases_[2].getX()!=-1)
                         &&(g.lireGrille(ni+2, nj)==null)){
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+2, nj);
                     cases_[3].setX(ni+2);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni+1, nj-1)==null)
                         &&(g.lireGrille(ni+2, nj)==null)){
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+2, nj);
                     cases_[3].setX(ni+2);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[0], ni, nj-1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[1], ni+1, nj-1);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj);
                     g.setGrille(null, ni, nj);
                     g.setGrille(null, ni-1, nj-1);
                 }
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         if(ni<8){
             if(nj==0){
                 if((cases_[3].getX()!=-1)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[0], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni+2, nj-1)==null)){
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni+1, nj-1);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[1], ni+2, nj-1);
                     cases_[1].setX(ni+2);
                     cases_[1].setY(nj-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni+1, nj)==null)
                         &&(g.lireGrille(ni+2, nj-1)==null)
                         &&(g.lireGrille(ni+2, nj-2)==null)){
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[2], ni+1, nj-1);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj-1);
                     g.setGrille(cases_[1], ni+2, nj-1);
                     cases_[1].setX(ni+2);
                     cases_[1].setY(nj-1);
                     g.setGrille(cases_[0], ni+2, nj-2);
                     cases_[0].setX(ni+2);
                     cases_[0].setY(nj-2);
                     g.setGrille(null, ni+1, nj-2);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                 }
             }
         }
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[1].getX()!=-1){
             ni=cases_[1].getX();
             nj=cases_[1].getY();
         }
         if(ni<8){
             if(nj==0){
                 if((cases_[1].getX()!=-1)
                         &&(g.lireGrille(ni+2, nj)==null)){
                     g.setGrille(cases_[1], ni+1, nj);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[0], ni+2, nj);
                     cases_[0].setX(ni+2);
                     cases_[0].setY(nj);
                     g.setGrille(null, ni, nj);
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni+1, nj-1)==null)
                         &&(g.lireGrille(ni+2, nj)==null)){
                    g.setGrille(cases_[1], ni+1, nj);
                     cases_[1].setX(ni+1);
                     cases_[1].setY(nj);
                     g.setGrille(cases_[0], ni+2, nj);
                     cases_[0].setX(ni+2);
                     cases_[0].setY(nj);
                     g.setGrille(cases_[3], ni, nj-1);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj-1);
                     g.setGrille(cases_[2], ni+1, nj-1);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     g.setGrille(null, ni, nj);
                     g.setGrille(null, ni-1, nj-1);
                 }
             }
         }
     }
 }
 public  void rotate(Grille g){
     if(this.getEtat()==0){
         int ni=4;
         int nj=0;
         if(cases_[0].getX()!=-1){
                ni=cases_[0].getX();
                nj=cases_[0].getY();
         }
         if(ni>0){
             if(nj==0){
                 if((cases_[0].getY()!=-1)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     cases_[0].setX(-1);
                     cases_[0].setY(-1);
                     this.setEtat(1);
                     return;                             
                 }
             }
             if(nj==1){
                 if((g.lireGrille(ni-1, nj-1)==null)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[0], ni-1, nj-1);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     this.setEtat(1);
                     return;            
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni-1, nj-1)==null)
                         &&(g.lireGrille(ni+1, nj)==null)){
                     g.setGrille(cases_[2], ni, nj);
                     cases_[2].setX(ni);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+1, nj);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj);
                     g.setGrille(cases_[0], ni-1, nj-1);
                     cases_[0].setX(ni-1);
                     cases_[0].setY(nj-1);
                     g.setGrille(null, ni+1, nj-1);
                     g.setGrille(null, ni+1, nj-2);
                     this.setEtat(1);
                     return;            
                 }
             }
         }
     }
     if(this.getEtat()==1){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         if(nj==0){
             if((cases_[3].getX()!=-1)
                     &&(g.lireGrille(ni-2, nj)==null)){
                 g.setGrille(cases_[3], ni-2, nj);
                 cases_[3].setX(ni-2);
                 cases_[3].setY(nj);
                 cases_[2].setX(-1);
                 cases_[2].setY(-1);
                 g.setGrille(null, ni, nj);                 
                 g.setGrille(null, ni-1, nj);
                 this.setEtat(2);
                 return; 
             }
         }
         if(nj==1){
             if(g.lireGrille(ni-2, nj)==null){
                 g.setGrille(cases_[3], ni-2, nj);
                 cases_[3].setX(ni-2);
                 cases_[3].setY(nj);
                 g.setGrille(cases_[2], ni-2, nj-1);
                 cases_[2].setX(ni-2);
                 cases_[2].setY(nj-1);
                 cases_[0].setX(-1);
                 cases_[0].setY(-1);
                 g.setGrille(null, ni, nj);                 
                 g.setGrille(null, ni-1, nj);
                 this.setEtat(2);
                 return;
             }
         }
         if(nj>=2){
             if((g.lireGrille(ni-2, nj)==null)
                     &&(g.lireGrille(ni-1, nj-2)==null)){
                 g.setGrille(cases_[3], ni-2, nj);
                 cases_[3].setX(ni-2);
                 cases_[3].setY(nj);
                 g.setGrille(cases_[2], ni-2, nj-1);
                 cases_[2].setX(ni-2);
                 cases_[2].setY(nj-1);
                 g.setGrille(cases_[0], ni-1, nj-2);
                 cases_[0].setX(ni-1);
                 cases_[0].setY(nj-2);
                 g.setGrille(null, ni, nj);                 
                 g.setGrille(null, ni-1, nj);
                 this.setEtat(2);
                 return;
             }
         }
     }
     if(this.getEtat()==2){
         int ni=4;
         int nj=0;
         if(cases_[3].getX()!=-1){
             ni=cases_[3].getX();
             nj=cases_[3].getY();
         }
         if(ni<9){
             /*if(nj==0){
                 if((cases_[3].getY()!=-1)
                         &&(g.lireGrille(ni, nj)))
             }*/
             if(nj==1){
                 if(g.lireGrille(ni+2, nj-1)==null){
                     g.setGrille(cases_[0], ni+2, nj-1);
                     cases_[0].setX(ni+2);
                     cases_[0].setY(nj-1);
                     cases_[2].setX(-1);
                     cases_[2].setY(-1);
                     cases_[3].setX(-1);
                     cases_[3].setY(-1);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                     this.setEtat(3);
                     return;
                 }
             }
             if(nj>=2){
                 if((g.lireGrille(ni+2, nj-1)==null)
                         &&(g.lireGrille(ni, nj-2)==null)){
                     g.setGrille(cases_[0], ni+2, nj-1);
                     cases_[0].setX(ni+2);
                     cases_[0].setY(nj-1);
                     g.setGrille(cases_[2], ni+1, nj-2);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj-2);
                     g.setGrille(cases_[3], ni, nj-2);
                     cases_[3].setX(ni);
                     cases_[3].setY(nj-2);
                     g.setGrille(null, ni, nj-1);
                     g.setGrille(null, ni, nj);
                     this.setEtat(3);
                     return;
                 }
             }
         }
     }
     if(this.getEtat()==3){
         int ni=4;
         int nj=0;
         if(cases_[1].getX()!=-1){
             ni=cases_[1].getX();
             nj=cases_[1].getY();
         }
         if(nj<21){
             if(nj==0){
                 if((cases_[1].getY()!=-1)
                         &&(g.lireGrille(ni, nj+1)==null)){
                     g.setGrille(cases_[0], ni, nj+1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj+1);
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     this.setEtat(0);
                     return;
                 }
             }
             if(nj>=1){
                 if((g.lireGrille(ni, nj+1)==null)
                         &&(g.lireGrille(ni+1, nj-1)==null)){
                     g.setGrille(cases_[0], ni, nj+1);
                     cases_[0].setX(ni);
                     cases_[0].setY(nj+1);
                     g.setGrille(cases_[2], ni+1, nj);
                     cases_[2].setX(ni+1);
                     cases_[2].setY(nj);
                     g.setGrille(cases_[3], ni+1, nj-1);
                     cases_[3].setX(ni+1);
                     cases_[3].setY(nj-1);
                     g.setGrille(null, ni-1, nj-1);
                     g.setGrille(null, ni, nj-1);
                     this.setEtat(0);
                     return;
                 }
             }
         }
     }
 }   
}

Conclusion :

Interface graphique
L?interface reste proche de la version à un seul joueur mais deux zones de jeu doivent être représentées simultanément et la partie score n?ayant plus aucune utilité disparaîtra.
Gameplay
A deux joueurs, le Gameplay de chacun est évidement le même que celui à un joueur (voir le paragraphe Gameplay à un joueur). Les boutons, dont le nombre est évidemment doublé, sont paramétrables (cf. le paragraphe suivant). La touche Échap du clavier permet, comme pour la version à un joueur, de mettre le jeu en pause et d?afficher le même choix de possibilité.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.