Advertisement
Guest User

gem matching grid

a guest
Mar 27th, 2013
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public class GameGrid extends JewelPuzzleGridCaller {
  2.     private JewelCell[][] jewelGrid;
  3.     private Coord         selected;
  4.     private int           width;
  5.     private int           height;
  6.     private ArrayList<Coord> aChangedCells;
  7.     private ArrayList<Coord> aToBeDestroyedCells;
  8.     private int chainCount = 0;
  9.     private JewelGameManager myManager;
  10.    
  11.     public GameGrid(int width,int height, JewelGameManager myManager) {
  12.         jewelGrid = new JewelCell[width][height];
  13.         this.myManager = myManager;
  14.         this.width  = width;
  15.         this.height  = height;
  16.         aChangedCells = new ArrayList<Coord>();
  17.         aToBeDestroyedCells = new ArrayList<Coord>();
  18.         selected  = new Coord(-1, -1);
  19.     }
  20.    
  21.     public void initialize() {
  22.         for (int x = 0; x < this.width; x++) {
  23.             for (int y = 0; y < this.height; y++) {
  24.                 jewelGrid[x][y] = new JewelCell(null);
  25.             }          
  26.         }
  27.         checkCellsAndPullDown();
  28.         //updateValidMoves();
  29.     }
  30.  
  31.     public int getWidth() {
  32.         return width;
  33.     }
  34.  
  35.     public int getHeight() {
  36.         return height;
  37.     }
  38.    
  39.     public boolean hasSelected(){
  40.         return (this.selected != null && this.selected.getX() > -1 && this.selected.getY() > -1);
  41.     }
  42.    
  43.     public Coord getSelected() {
  44.         return selected;
  45.     }
  46.    
  47.     public void select(int x, int y){
  48.         this.selected.setCoords(x, y);
  49.         callShowSelectedMarker(x, y, true);
  50.     }
  51.  
  52.     public void deSelect(){
  53.         this.selected.setCoords(-1, -1);
  54.         callShowSelectedMarker(0, 0, false);
  55.     }
  56.    
  57.     public JewelCell getCell(int x, int y){
  58.         return jewelGrid[x][y];
  59.     }
  60.    
  61.     public JewelCell getCell(Coord coord){
  62.         return jewelGrid[coord.getX()][coord.getY()];
  63.     }
  64.  
  65.     public int getChainCount() {
  66.         return chainCount;
  67.     }
  68.  
  69.     public void resetChainCount() {
  70.         this.chainCount = 0;
  71.     }  
  72.    
  73.     private void addCellToBeChecked(int x, int y){
  74.         addCellToBeChecked(new Coord(x, y));
  75.     }
  76.    
  77.     private void addCellToBeChecked(Coord coord){
  78.         aChangedCells.add(coord);
  79.     }
  80.    
  81.     private boolean checkChangedCellsForMatches(){
  82.         boolean result = false;
  83.         if (aChangedCells.size() > 0){
  84.             for (Coord coord : aChangedCells) {
  85.                 if (checkCellForMatches(coord)){
  86.                     result = true;
  87.                 }
  88.             }
  89.         }
  90.         return result;
  91.     }
  92.  
  93.     /**
  94.      * Check all cells from the grid for matches.
  95.      * @return <b>true</b> if there is at least one match, <b>false</b> otherwise.
  96.      */
  97.     public boolean checkGridForMatches(){
  98.         for (int x = 0; x < width; x++) {
  99.             for (int y = 2; y < height; y++) {
  100.                 checkCellForMatches(new Coord(x, y));
  101.             }
  102.         }
  103.         return clearMarkedCells();
  104.     }
  105.    
  106.     private boolean checkCellForMatches(Coord pCoord){
  107.         ArrayList<Coord> VLine = new ArrayList<Coord>();
  108.         ArrayList<Coord> HLine = new ArrayList<Coord>();
  109.         JewelType type;
  110.         for (Coord coord : aToBeDestroyedCells) {
  111.             // if the cell is already marked for destruction skip the check. It is doomed.
  112.             if (coord.match(pCoord)) return false;
  113.         }
  114.        
  115.        
  116.         boolean result = false;
  117.         final int x = pCoord.getX();
  118.         final int y = pCoord.getY();
  119.         type = getCell(x, y).getType();
  120.        
  121.         // @Anila
  122.         // this 'for' is because my gems can have more than one type of color
  123.         // so I check every type
  124.         // regular 1-color gems don't need the 'for'
  125.         for (JewelColor color : type.getColors()) {
  126.             HLine.clear();
  127.             VLine.clear();
  128.            
  129.             for (int xt = x; xt >= 0 && JewelType.isMatch(getCell(xt, y).getType(), color); xt--) {
  130.                 HLine.add(new Coord(xt, y));               
  131.             }
  132.             for (int xt = x +1; xt < width  && JewelType.isMatch(getCell(xt, y).getType(), color); xt++) {
  133.                 HLine.add(new Coord(xt, y));               
  134.             }
  135.             //yt = 2 to ignore the first 2 lines, they will be hidden unless the player has the proper ability
  136.             for (int yt = y; yt >= 2 && JewelType.isMatch(getCell(x, yt).getType(), color); yt--) {
  137.                 VLine.add(new Coord(x, yt));               
  138.             }
  139.             for (int yt = y +1; yt < height  && JewelType.isMatch(getCell(x, yt).getType(), color); yt++) {
  140.                 VLine.add(new Coord(x, yt));               
  141.             }
  142.            
  143.             if (HLine.size() > 2){
  144.                 aToBeDestroyedCells.addAll(HLine);
  145.                 result = true;
  146.             }
  147.            
  148.             if (VLine.size() > 2){
  149.                 aToBeDestroyedCells.addAll(VLine);
  150.                 result = true;
  151.             }
  152.         }
  153.         return result;
  154.     }
  155.     /*
  156.     private void updateValidMoves(){
  157.        
  158.     }*/
  159.    
  160.     public boolean clearMarkedCells(){
  161.         ArrayList<Coord> list = new ArrayList<Coord>();
  162.         if (aToBeDestroyedCells.size() > 0){
  163.             for (Coord coord : aToBeDestroyedCells) {
  164.                 if (!getCell(coord).isEmpty()){
  165.                     for (JewelColor color : getCell(coord).getType().getColors()) {
  166.                         myManager.matchedPoints(color, 1, coord);                      
  167.                     }
  168.                     getCell(coord).setEmpty();
  169.                     list.add(coord);
  170.                 }
  171.             }
  172.            
  173.             callClearMatchedCells(list);   
  174.             aToBeDestroyedCells.clear();
  175.             chainCount++;
  176.             return true;
  177.         } else {
  178.             return false;
  179.         }
  180.     }
  181.    
  182.     public void swapCell(int x1, int y1, int x2, int y2){
  183.         deSelect();
  184.         JewelCell cell1 = jewelGrid[x1][y1];
  185.         JewelCell cell2 = jewelGrid[x2][y2];
  186.        
  187.         jewelGrid[x1][y1] = cell2;
  188.         jewelGrid[x2][y2] = cell1;
  189.        
  190.         aChangedCells.clear();
  191.         addCellToBeChecked(x1, y1);
  192.         addCellToBeChecked(x2, y2);
  193.        
  194.         if (checkChangedCellsForMatches()){
  195.             callSwapJewels(x1, y1, x2, y2);
  196.         } else {
  197.             jewelGrid[x1][y1] = cell1;
  198.             jewelGrid[x2][y2] = cell2;
  199.             callSwapJewelsFailed(x1, y1, x2, y2);
  200.         }
  201.     }
  202.    
  203.     /**
  204.      * Pull all gems down from bottom to top creating new gems as needed
  205.      * @return <b>true</b> if pulled at least one gem, <b>false</b> if all lines were filled and no one was pulled.
  206.      */
  207.     public boolean checkCellsAndPullDown(){
  208.         ArrayList<MoveCoord> list = new ArrayList<MoveCoord>();
  209.         for (int x = 0; x < width; x++) {
  210.             list.addAll(cellPullDown(x));
  211.         }
  212.         if (list.size() > 0) callExecutePullDown(list);
  213.         return list.size() > 0;
  214.     }
  215.  
  216.     private ArrayList<MoveCoord> cellPullDown(int x){
  217.         ArrayList<MoveCoord> list = new ArrayList<MoveCoord>();
  218.         final int BOTTOM = height -1;
  219.         JewelCell upcell;
  220.        
  221.         for (int y = BOTTOM; y >= 0; y--) {
  222.             JewelCell cell = getCell(x, y);
  223.             if (cell.isEmpty()){
  224.                 Coord toCoord = new Coord(x, y);
  225.                 Coord fromCoord = new Coord(x, -1);
  226.                 boolean foundCell = false;
  227.                 for (int curY = y -1; curY >= 0 && !foundCell; curY--){
  228.                     if (curY >= 0 && !(upcell = getCell(x, curY)).isEmpty()){
  229.                         cell.setType(upcell.getType());
  230.                         upcell.setEmpty();
  231.                         fromCoord.setCoords(x, curY);
  232.                         foundCell = true;
  233.                     }
  234.                 }
  235.                 if (foundCell){
  236.                     list.add(new MoveCoord(fromCoord, toCoord));                   
  237.                 } else {
  238.                     list.add(new MoveCoord(fromCoord, toCoord, cell.newType()));           
  239.                 }
  240.             }
  241.         }
  242.         return list;
  243.     }
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement