public boolean canMove(Block b) {
return b.getY()+blockHeight < b.getRegard();
}
        
public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRect(0, 0, width, height);
                setRegard();
for(int i=0; i<blocks.size(); i++) {

Block b = (Block) blocks.get(i);
g.setColor(colors[b.getColorNum()]);
int xx = b.getY();
int yy = blockHeight;
int zz = b.getRegard();
if(b.getY()+blockHeight > b.getRegard())
b.setY(b.getRegard() - blockHeight);
        g.fillRect(b.getX()*blockWidth+1, b.getY()+1, blockWidth-1, blockHeight-1);

if(canMove(b)) {
            board[b.getY()/blockHeight][b.getX()] = 0;
    b.move();
}
else {
board[(int)(b.getY()/blockHeight)][b.getX()] = b.getColorNum();
deleteSuccess();
}
}
}  //end paint     
public int findBlock(int r, int c) {
                       int yval = r*blockHeight;
for(int i=0; i<blocks.size(); i++) {
Block b = (Block) blocks.get(i);
if(b.getX()==c && Math.abs(yval - b.getY())<3)
    return i;
}
return -1;
}
private int tempR, tempC;
public void mousePressed(MouseEvent e) {
                tempC = e.getX()/blockWidth;
                tempR = e.getY()/blockHeight;
        }       public void mouseReleased(MouseEvent e) {     
int i = findBlock(tempR, tempC);
if(i == -1)
    return;
Block b = (Block) blocks.get(i);

if(e.getX() >= width || e.getX() <=0 ) return;
if(e.getY() >= height || e.getY() <=0 ) return;

int c = e.getX()/blockWidth;
                int r = e.getY()/blockHeight; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
  if(isLegalSwap(tempR, tempC, r, c)) {
int j = findBlock(r, c);
if(j==-1) {
b.setX(c);
b.setY(r*blockHeight);
board[tempR][tempC] = 0;
return;
}          Block b2 = (Block) blocks.get(j);
int colorN = b.getColorNum();
b.setColorNum(b2.getColorNum());
b2.setColorNum(colorN);

                    int temp = board[r][c];
                    board[r][c] = board[tempR][tempC];
                    board[tempR][tempC] = temp;
    
           }
        }    //end mouse released         public boolean isLegalSwap(int r1, int c1, int r2, int c2) {
             if(board[r1][c1]==0) return false;
             if(r1!=r2) return false;
     if(board[r2][c2]!=0) return true;
    
     if(c2 > c1) {
         int i = c1 + 1;
         for(; i < c2 && r1!=19; i++)
                     if(board[r1+1][i]==0)
                         return false;
     }
     else if(c2 < c1) {
         int i = c1 - 1;
         for(; i > c2 && r1!=19; i--)
                     if(board[r1+1][i]==0)
                         return false;
     }
     
             return true;
         }        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
  
public void deleteSuccess() {
                 int count = 0, val;
                 int[] records = new int[3000];
                 int size = 0;         // row check
                 for(int r = 0; r < row; r++) 
                     for(int c = 0; c < col-1; c++)
                if(board[r][c]!=0 && board[r][c]==board[r][c+1]) {
                                 records[size++] = r;
                                 records[size++] = c;
                             count++;
                                         if(c == col-2 && count>=2) {
                                                 records[size++] = r;
                                     records[size++] = c+1;
                                 count = 0;
                                         }
                                         if(c == col-2 && count == 1) {
                                                 count = 0;
                                                 size -= 2;
                                         }
                        }
                            else if(count >= 2) {
                             records[size++] = r;
                                 records[size++] = c;
                                 count = 0;
                        }
                            else {
                                 size -= 2*count;
                                 count = 0;
                            }
         // col check
                 for(int c = 0; c < col; c++) 
                     for(int r = 0; r < row-1; r++)
                if(board[r][c]!=0 && board[r][c]==board[r+1][c]) {
                                 records[size++] = r;
                                 records[size++] = c;
                             count++;
                                         if(r == row-2 && count>=2) {
                                                 records[size++] = r+1;
                                     records[size++] = c;
                                 count = 0;
                                         }
                                         if(r == row-2 && count == 1) {
                                                 count = 0;
                                                 size -= 2;
                                         }
                        }
                            else if(count >= 2) {
                             records[size++] = r;
                                 records[size++] = c;
                                 count = 0;
                        }
                            else {
                                 size -= 2*count;
                                 count = 0;
                            }
        
                for(int i=0; i<size; ) {
                        int r = records[i];
                        int c = records[i+1];
                        board[r][c] = 0;
int index = findBlock(r, c);
if(index!=-1)
    blocks.remove(index);
                        i += 2;
                }

if(size >= 6) {
    score += calculateScore(size/2-2);
    scoreField.setText(""+score);
            int l = score/100;
    if(l > level) {
        for(int i=level; i<l; i++)
        upSpeed();
                level = l;
levelField.setText(""+level);
}

size = 0;
        }  // end delete Success

public int calculateScore(int k) {
    if(k < 1) return 0;
    
    int result = 2;
    for(int i=1; i<k; i++)
        result *= 2;
            return result + 10;     
}     // end calculate score    

public void newGame() {
    blocks.clear();
    for(int i=0; i<row; i++)
        for(int j=0; j<col; j++)
    board[i][j] = 0;
    score = 0;
    scoreField.setText("0");
level = 0;
levelField.setText("0");
    speed = 25;
    count = 200;
    aCount = 200;  
    gameover = false;
}  // end n
  
}  //end board class
class Block {
private int x, y;
private int colorNum;
        private int regard = 500;  //~~~~~~~~~~~~~~~~~ public Block(int x, int y , int c) {
this.x = x;
this.y = y;
colorNum = c;
} public void move() { y += 2; }
public int getX() { return x; }
public int getY() { return y; }
public int getColorNum() { return colorNum; }
        public int getRegard() { return regard; }
public void setColorNum(int n) { colorNum = n; }
public void setRegard(int r) { regard = r; }
public void setX(int val) { x = val; }
public void setY(int val) { y = val; }
}