Share Pastebin
Guest
Public paste!

sokooooobaaaaan

By: a guest | Mar 22nd, 2010 | Syntax: Java | Size: 6.13 KB | Hits: 126 | Expires: Never
Copy text to clipboard
  1. package sokoban;
  2.  
  3. public class Grid {
  4.         //Definerer et objekt, moves er arraylist med trekk.
  5.         private Moves moves;
  6.        
  7.         //Definerer ulike situasjoner
  8.         //private final char WALL = '#';
  9.         private final char EMPTY = ' ';
  10.         private final char BOX = '$';
  11.         private final char BOX_ON_TARGET = '*';
  12.         private final char PLAYER = '@';
  13.         private final char PLAYER_ON_TARGET = '+';
  14.         private final char TARGET = '.';
  15.        
  16.         //Initialiserer grid og targets
  17.         public char[][] grid;
  18.         public boolean[][] targets;
  19.        
  20.         //Initialiserer spillerens koordinater
  21.         public int playerX = -1;
  22.         public int playerY = -1;
  23.        
  24.         //Konstrokt¯r
  25.         public Grid (String level){
  26.                 //Splitter opp linjene
  27.                 String[] lines = level.split("\\|");
  28.                
  29.                 //Lager et objekt moves, som innholder antall moves og referer til klassen Moves.
  30.                 moves = new Moves();
  31.                
  32.                 //Sjekker hvilken linje som er lengst
  33.                 int maxLength = 0;
  34.                 for(int i=0;i<lines.length;i++){
  35.                         maxLength = Math.max(maxLength, lines[i].length());
  36.                 }
  37.                
  38.                 //Lager grid og targets
  39.                 targets = new boolean[lines.length][maxLength];
  40.                 grid = new char[lines.length][maxLength];
  41.                
  42.                 //GÂr igjennom hver char i lines
  43.                 for(int y = 0; y<lines.length;y++){
  44.                         for(int x = 0; x<maxLength;x++){
  45.                                 //Setter for korte linjer i grid til  bli MaxLength, definerer c til  vÊre char p y,x
  46.                                 char c = (x < lines[y].length() ? lines[y].charAt(x) : EMPTY);
  47.                                         //Fyller targets med true, og setter c verdi.  
  48.                                         if(c == PLAYER_ON_TARGET){
  49.                                                 c = PLAYER;
  50.                                                 targets[y][x] = true;
  51.                                         }
  52.                                         else if(c == BOX_ON_TARGET){
  53.                                                 c = BOX;
  54.                                                 targets[y][x] = true;
  55.                                         }
  56.                                        
  57.                                         else if(c == TARGET){
  58.                                                 c = EMPTY;
  59.                                                 targets[y][x] = true;
  60.                                         }
  61.                                 //Fyller grid (se setCell metode)      
  62.                                 setCell(y,x,c);
  63.                                         //Setter y,x koordinat til spiller
  64.                                         if(c == PLAYER){
  65.                                                 playerX = x;
  66.                                                 playerY = y;
  67.                                         }
  68.                         }
  69.                         moves = new Moves();
  70.                 }
  71.                 //Hvis ingen player er funnet, s har vi definert playerY og X til  vÊre -1. Dermed mindre enn 0.
  72.                 if(playerX < 0 || playerY < 0){
  73.                         System.err.println("Ingen spiller i oppgitt brett. Pr¯v et annet.");
  74.                         System.exit(0);
  75.                 }
  76.                
  77.         }      
  78.        
  79.         //getHeight henter h¯yden til grid
  80.         public int getHeight(){
  81.                 return grid.length;
  82.         }
  83.        
  84.         //getLength henter lengden til grid
  85.         public int getLength(){
  86.                 return grid[0].length;
  87.         }
  88.        
  89.         //isLegal sjekker om koordinat x og y ikke overskrider maxLength og lines.length
  90.         public boolean isLegal(int y, int x){
  91.                 return y >= 0 && x >= 0 && y < getHeight() && x < getHeight();
  92.         }
  93.        
  94.         //setCell legger inn char verdi p x og y koordinat
  95.         public void setCell(int y, int x, char c){
  96.                 if(isLegal(y,x)){
  97.                         grid[y][x] = c;
  98.                 }
  99.         }
  100.        
  101.         //getCell henter ut hvilket symbol som ligger i koordinatet
  102.         public char getCell(int y, int x){
  103.                 if(!isLegal(y,x)){
  104.                         return 'X';
  105.                 }
  106.                 return grid[y][x];
  107.         }
  108.        
  109.         //Sjekker om det er target
  110.         public boolean isTarget (int y, int x){
  111.                 return isLegal(y,x) && targets[y][x];
  112.         }
  113.        
  114.         //Metode for  skrive ut brettet i konsoll
  115.         public String print(){
  116.                 String output = "";
  117.                 for(int y = 0; y<getHeight();y++){
  118.                         for(int x = 0; x<getLength();x++){
  119.                                 //definerer c igjen , som char i grid
  120.                                 char c = grid[y][x];
  121.                                 boolean d = targets[y][x];
  122.                                         //Fyller c med riktige verdier
  123.                                         if(c == PLAYER && d){
  124.                                                 c = PLAYER_ON_TARGET;
  125.                                         }
  126.                                         else if(c == BOX && d){
  127.                                                 c = BOX_ON_TARGET;
  128.                                         }
  129.                                         else if(c == EMPTY && d){
  130.                                                 c = TARGET;
  131.                                         }
  132.                                 output += c;
  133.                         }
  134.                 }
  135.                 return output;
  136.         }
  137.        
  138.         //Sjekker antall TOMME targets som er igjen.
  139.         public int countTargetsLeft(){
  140.                 int count = 0;
  141.                 for (int y = 0; y < getHeight(); y++) {
  142.                         for (int x = 0; x < getLength(); x++) {
  143.                                 if(isTarget(y,x) && getCell(y,x) != BOX) count++;
  144.                         }
  145.                 }
  146.                 return count;
  147.         }
  148.        
  149.         //Metode som beveger p position x og y
  150.         public String doMove(int dy, int dx){
  151.                 //Vi har enda ikke dyttet p noe, derfor false
  152.                 boolean isPush = false;
  153.                 //Sjekker om neste koordinat er boks, og neste der er tom. Hvis true, s flyttes boksen med setCell.
  154.                 if(getCell(playerY+dy, playerX+dx)==BOX && getCell(playerY + dy+dy, playerX +dx+dx)==EMPTY){
  155.                         isPush = true;
  156.                         setCell(playerY+dy+dy, playerX+dx+dx, BOX);
  157.                 }
  158.                 //Hvis vi pushet, og eller neste koordinat er tom. SÂ flytter vi oss dit. Logger trekket i moves.
  159.                 if(isPush||getCell(playerY+dy,playerX+dx)==EMPTY){
  160.                         //Flytter player
  161.                         setCell(playerY+dy,playerX+dx,PLAYER);
  162.                         //Fjerner forrige posisjon
  163.                         setCell(playerY,playerX,EMPTY);
  164.                        
  165.                         //Logger at vi r¯rte p oss
  166.                         moves.add(new Move(playerY, playerX, dy, dx, isPush));
  167.                        
  168.                         //Oppdaterer playerX og Y
  169.                         playerX += dx;
  170.                         playerY += dy;
  171.                 }
  172.                 //Hvis ikke forrige if-setning gikk, alts de to neste koordinatene er boks og tom (i den rekkef¯lgen) s skriver den ut string.
  173.                 return("Cannot move "+(isPush ? "box" : "player")+" in that direction. X-retning: "+dx+" og Y-retning: "+dy);
  174.         }
  175.        
  176.         //Metode som gÂr tilbake et trekk
  177.         public Move undoMove(){
  178.                 //Fjerner f¯rst et move fra loggen. Bruker objektet moves, initialisert i konstrukt¯r.
  179.                 Move m = moves.remove();
  180.                 //Sjekker om arrayList er tom, om den ikke var det setter bruker man Move klassen til  hente dy, dx etc
  181.                 if(m != null){
  182.                         //Setter tidligere posisjon til tom og nÂvÊrende situasjon til spiller igjen
  183.                         setCell(playerY, playerX, EMPTY);
  184.                         setCell(playerY-m.getDy(),playerX-m.getDx(), PLAYER);
  185.                         //Hvis forrige trekk var  flytte en boks, kan ikke tidligere pos. vÊre tom, men boks. Og der boksen var , er n tom.
  186.                         if(m.isPush()){
  187.                                 setCell(playerY, playerX, BOX);
  188.                                 setCell(playerY + m.getDy(), playerX + m.getDx(), EMPTY);
  189.                         }
  190.                         //Oppdaterer posisjonen til spilleren
  191.                         playerX -= m.getDx();
  192.                         playerY -= m.getDy();
  193.                         //Skriver ut beskjed om at spilleren er flyttet
  194.                        
  195.                 }
  196.                 return m;      
  197.         }
  198.        
  199.         //Metode for  hente ut stack med moves
  200.         public int getMoves(){
  201.                 return moves.getMoves();
  202.         }
  203.        
  204.         public int getPushes(){
  205.                 return moves.getPushes();
  206.         }
  207.        
  208.         public boolean hasWon(){
  209.                 boolean hasWon = false;
  210.                 if(this.countTargetsLeft()==0){
  211.                         hasWon = true;
  212.                 }
  213.                 return hasWon;
  214.         }
  215.        
  216.         public Moves getHistory(){
  217.                 return moves;
  218.         }
  219. }