Advertisement
itochika

GAME

Mar 7th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.14 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3. import java.net.URI;
  4. import java.awt.Point;
  5. import java.awt.event.KeyEvent;
  6.  
  7. /** Cette classe reprensente le plateau de jeu du Sokoban
  8. */
  9. public class Plateau extends Observable {
  10.    
  11.     private Partie p;
  12.     //Le plateau courant et ses parametres
  13.     private Case[][] plateau = new Case[24][25];
  14.     private int nbLignes, nbColonnes,nbPas, nbPousses;
  15.     //Les donnees de la case ou se trouve le perso
  16.     private int lignePerso, colonnePerso;
  17.     private boolean surZone = false;
  18.     //indicateurs pour la case de destination
  19.     private boolean mur = false;
  20.     private boolean zone = false;
  21.     private boolean caisse = false;
  22.     // Pour la fin de partie
  23.     private boolean fini = false;
  24.     private boolean reinit = false;
  25.     // Pour les types d'affichage
  26.     public static final int CLASSIC = 0;
  27.     public static final int NEW = 1;
  28.     Vector vectDecor = new Vector();
  29.    
  30.     public Plateau(Partie p)  {
  31.         this.p = p;
  32.         initialiserPlateau(1);
  33.        
  34.     }//Plateau
  35.    
  36.    
  37.     public void recommencer() {
  38.         initialiserPlateau(p.getNiveauCourant());
  39.         reinit = true;     
  40.     }
  41.    
  42.     /** Appelle le LevelLoader pour le niveau donné
  43.     * @param niveau Le numero du niveau à charger
  44.     */ 
  45.     public void initialiserPlateau(int niveau)  {
  46.         try {
  47.              p.goToLevel(niveau);
  48.             nbPas = 0;
  49.              nbPousses = 0;
  50.              String levelFile = "niveaux/lvl"+niveau+".sok";
  51.              LevelLoader ll = LevelLoader.getInstance();
  52.              ll.initLevel(this,levelFile);
  53.         }
  54.         catch (Exception e) {e.printStackTrace();}
  55.     }//initilaiserPlateau
  56.    
  57.     /**Rappelé par le level loadeur le fichier parcouru
  58.     *Instancie nbLignes et nbColonnes pour éviter des cases superflues selon le tableau chargé
  59.     */
  60.     public void initialiserPlateau(Case[][] p) {
  61.         nbLignes = 0;
  62.         nbColonnes = 0;
  63.         reinit = true;
  64.         for(int i =0; i < 24; i++) {
  65.             for(int j=0; j < 25;j++) {
  66.                if (p[i][j].getStatut() == Case.MUR) {
  67.                 nbLignes = i;
  68.                 nbColonnes = (j >= nbColonnes)?j:nbColonnes;
  69.                 }//if
  70.                 if (p[i][j].getStatut() == Case.PERSO || p[i][j].getStatut() == Case.PERSO_SUR_ZONE) {
  71.                 lignePerso = i; colonnePerso = j;
  72.                 }
  73.                 this.plateau[i][j] = new Case(p[i][j]);
  74.             }//for
  75.         }//for
  76.         setChanged();
  77.         notifyObservers();
  78.         fini = false;
  79.     }//initialiserPlateau
  80.     //--------------------------------
  81.     // Methodes d'observation ---------
  82.     //--------------------------------
  83.    
  84.     /** Renvoie la partie associée
  85.     */
  86.     public Partie getPartie() {
  87.         return p;
  88.     }
  89.    
  90.     /**Renvoie le nombre de pas effectués dans ce plateau
  91.     */
  92.     public int getNbPas() {
  93.         return nbPas;
  94.     }
  95.    
  96.     /** Renvoie le nombre de pousses
  97.     */
  98.     public int getNbPousses() {
  99.         return nbPousses;
  100.     }
  101.    
  102.     /** Renvoie la case située sur la ligne ligne et la colonne colonne
  103.     * @param ligne La ligne de la case voulue
  104.     * @param colonne La colonne de la case voulue
  105.     */
  106.     public Case caseEn(int ligne,int colonne) {
  107.         return plateau[ligne][colonne];
  108.     }
  109.    
  110.     /**Renvoie le nombre de lignes du plateau courant
  111.     */
  112.     public int getNbLignes() {
  113.         return nbLignes;
  114.     }
  115.     /**Renvoie le nombre de colonnes du plateau courant
  116.     */
  117.     public int getNbColonnes() {
  118.         return nbColonnes;
  119.     }
  120.     /** Teste la victoire
  121.     * On est gagnant si il n'y a plus de zone vides ou avec le perso dessus.
  122.     */
  123.     public void testVictoire() {
  124.         fini = true;
  125.         for(int i = 1; i < nbLignes  && fini;i++) {
  126.             for(int j = 1; j < nbColonnes  && fini; j++) {
  127.                 fini = fini & (plateau[i][j].getStatut() != Case.ZONE_RANGEMENT) && (plateau[i][j].getStatut() != Case.PERSO_SUR_ZONE);
  128.             }
  129.         }
  130.         if (fini) {
  131.             p.goToNextLevel();
  132.             initialiserPlateau(p.getNiveauCourant());
  133.         }
  134.     }
  135.     /** Renvoie le booleen instancié dans testVictoire()
  136.     */
  137.     public boolean termine() {
  138.         return fini;
  139.     }
  140.    
  141.     public boolean reinit() {
  142.         return reinit;
  143.     }
  144.     //------------------------------
  145.     // Gestion des deplacements ----
  146.     //------------------------------
  147.    
  148.     /** Appelle une methode precise pour chaque direction
  149.      */
  150.     public void bougerPerso(int direction) {
  151.     fini = false;
  152.     switch(direction) {
  153.     case KeyEvent.VK_UP ://on monte
  154.         monter();
  155.         break;         
  156.     case KeyEvent.VK_RIGHT ://on va a droite
  157.         aDroite();
  158.         break;
  159.     case KeyEvent.VK_DOWN : //on descends
  160.         descendre();
  161.         break;
  162.     case KeyEvent.VK_LEFT ://on va à gauche
  163.         aGauche();
  164.         break;
  165.     }//switch
  166.     setChanged();
  167.     notifyObservers();
  168.     testVictoire();
  169.     }//bougerPerso
  170.    
  171.     /** Methode privée appelée quand on veut monter
  172.      */
  173.     private void monter() {
  174.    
  175.     //instanciation des indicateurs
  176.         mur = plateau[lignePerso-1][colonnePerso].getStatut() == Case.MUR;
  177.         zone = (plateau[lignePerso][colonnePerso].getStatut() == Case.ZONE_RANGEMENT) ;
  178.         caisse = (plateau[lignePerso-1][colonnePerso].getStatut() == Case.CAISSE_SUR_ZONE)|| (plateau[lignePerso-1][colonnePerso].getStatut() == Case.CAISSE);
  179.         surZone =  plateau[lignePerso][colonnePerso].getStatut() == Case.PERSO_SUR_ZONE;
  180.         if (!mur) {
  181.             if (!caisse) {
  182.             plateau[lignePerso][colonnePerso].setStatut((surZone)?Case.ZONE_RANGEMENT:Case.CASE_VIDE);
  183.             plateau[lignePerso-1][colonnePerso].setStatut((zone)?Case.PERSO_SUR_ZONE:Case.PERSO);
  184.             lignePerso--;
  185.             nbPas++;
  186.             }//if
  187.        
  188.     }//if
  189.        
  190.     }//monter
  191.    
  192.    
  193.    
  194.     /** Methode privée appelée quand on veut descendre
  195.      */
  196.     private void descendre() {
  197.    
  198.     //instanciation des indicateurs
  199.     mur = plateau[lignePerso+1][colonnePerso].getStatut() == Case.MUR;
  200.     zone = (plateau[lignePerso][colonnePerso].getStatut() == Case.ZONE_RANGEMENT) || (plateau[lignePerso+1][colonnePerso].getStatut() == Case.CAISSE_SUR_ZONE);
  201.     caisse = (plateau[lignePerso+1][colonnePerso].getStatut() == Case.CAISSE_SUR_ZONE)|| (plateau[lignePerso+1][colonnePerso].getStatut() == Case.CAISSE);
  202.     surZone =  plateau[lignePerso+1][colonnePerso].getStatut() == Case.PERSO_SUR_ZONE;
  203.     if (!mur) {
  204.         if (!caisse) {
  205.         plateau[lignePerso][colonnePerso].setStatut((surZone)?Case.ZONE_RANGEMENT:Case.CASE_VIDE);
  206.         plateau[lignePerso+1][colonnePerso].setStatut((zone)?Case.PERSO_SUR_ZONE:Case.PERSO);
  207.         lignePerso++;
  208.         nbPas++;
  209.         }//if
  210.      
  211.     }//if  
  212.     }//descendre()
  213.    
  214.  
  215.    
  216.     /** Methode privée appelée quand on veut aller à gauche
  217.      */
  218.     private void aGauche() {
  219.    
  220.     //instanciation des indicateurs
  221.     mur = plateau[lignePerso][colonnePerso-1].getStatut() == Case.MUR;
  222.     zone = (plateau[lignePerso][colonnePerso].getStatut() == Case.ZONE_RANGEMENT) || (plateau[lignePerso][colonnePerso-1].getStatut() == Case.CAISSE_SUR_ZONE);
  223.     caisse = (plateau[lignePerso][colonnePerso-1].getStatut() == Case.CAISSE_SUR_ZONE)|| (plateau[lignePerso][colonnePerso-1].getStatut() == Case.CAISSE);
  224.     surZone =  plateau[lignePerso][colonnePerso-1].getStatut() == Case.PERSO_SUR_ZONE;
  225.     if (!mur) {
  226.         if (!caisse) {
  227.         plateau[lignePerso][colonnePerso].setStatut((surZone)?Case.ZONE_RANGEMENT:Case.CASE_VIDE);
  228.         plateau[lignePerso][colonnePerso-1].setStatut((zone)?Case.PERSO_SUR_ZONE:Case.PERSO);
  229.         colonnePerso--;
  230.         nbPas++;
  231.         }
  232.        
  233.     }//if
  234.        
  235.     }
  236.    
  237.    
  238.    
  239.     /** Methode privée appelée quand on veut aller à droite
  240.      */
  241.     private void aDroite() {
  242.    
  243.     //instanciation des indicateurs
  244.     mur = plateau[lignePerso][colonnePerso+1].getStatut() == Case.MUR;
  245.     zone = (plateau[lignePerso][colonnePerso].getStatut() == Case.ZONE_RANGEMENT) || (plateau[lignePerso][colonnePerso+1].getStatut() == Case.CAISSE_SUR_ZONE);
  246.     caisse = (plateau[lignePerso][colonnePerso+1].getStatut() == Case.CAISSE_SUR_ZONE)|| (plateau[lignePerso][colonnePerso+1].getStatut() == Case.CAISSE);
  247.     surZone =  plateau[lignePerso][colonnePerso+1].getStatut() == Case.PERSO_SUR_ZONE;
  248.     if (!mur) {
  249.         if(!caisse) {
  250.         plateau[lignePerso][colonnePerso].setStatut((surZone)?Case.ZONE_RANGEMENT:Case.CASE_VIDE);
  251.         plateau[lignePerso][colonnePerso+1].setStatut((zone)?Case.PERSO_SUR_ZONE:Case.PERSO);
  252.         colonnePerso++;
  253.         nbPas++;
  254.         }
  255.        
  256.     }//if
  257.    
  258.     }//aDroite()
  259.    
  260.      /** Methode de deboguage
  261.      * Permet d'afficher le statut de chaque case du plateau
  262.      */
  263.     public void print() {
  264.     for(int i=0;i<24;i++) {
  265.         for (int j = 0; j <25;j++) {
  266.         System.out.print(plateau[i][j].getStatut());
  267.         }
  268.         System.out.print("\n");
  269.     }
  270.     }
  271.    
  272.  
  273.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement