import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class g_dominos extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int td[][] = new int[7][8];
   int vd[][] = new int[7][8];
   int cd[][] = new int[7][8];
   int ddd[][] = new int[28][2];
   int ddn[][] = new int[28][2];
   int chd[][] = new int[7][7];
   int ifg,dn,ch;
   int sp1,sp2,sn1,sn2;
   int px,py,ax,ay;
   int cf,cco;
   int c1=-1,c2=-1;

   public void init(){
      os = createImage(550,270);
      og = os.getGraphics();
      setBackground(Color.white);
      while(sn2 == 0){
         d_set();
      }

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if((e.getX()>30)&&(e.getX()<270)&&(e.getY()>30)&&(e.getY()<240)){
                  px = (e.getX()-30)/30;
                  py = (e.getY()-30)/30;
                  if(cf == 1){
                     if(cd[py][px] == -1){
                        ax = px ; ay = py ;
                        cd[py][px] = cco;
                        cf = -1;
                     }else{
                        sp1 = cd[py][px];
                        for(int tx = 0;tx < 8;tx ++){
                           for(int ty = 0;ty < 7;ty ++){
                              if(cd[ty][tx] == sp1){
                                 if(c1 == -1){
                                    c1 = vd[ty][tx];
                                 }else{
                                    c2 = vd[ty][tx];
                                 }
                                 cd[ty][tx] = -1;
                              }else if(cd[ty][tx] > sp1){
                                 cd[ty][tx] --;
                              }
                           }
                        }
                        chd[c1][c2] = 0;
                        chd[c2][c1] = 0;
                        c1 = -1 ; c2 = -1 ;
                        cco --;
                     }
                  }else{
                     if(cd[py][px] == -1){
                        if(((px==ax)&&(py==ay-1))||((px==ax)&&(py==ay+1))||((px==ax-1)&&(py==ay))||((px==ax+1)&&(py==ay))){
                           if(chd[vd[py][px]][vd[ay][ax]] != 1){
                              cd[py][px] = cco;
                              chd[vd[py][px]][vd[ay][ax]] = 1;
                              chd[vd[ay][ax]][vd[py][px]] = 1;
                              cco ++;
                              cf = 1;
                           }
                        }
                     }else{
                        if((px==ax)&&(py==ay)){
                           cd[ay][ax] = -1;
                           cf = 1;
                        }
                     }
                  }
               }else if((e.getX()>300)&&(e.getX()<390)&&(e.getY()>170)&&(e.getY()<200)){
                  for(int t1 = 0;t1 < 8;t1 ++){
                     for(int t2 = 0;t2 < 7;t2 ++){
                       cd[t2][t1] = -1;
                     }
                  }
                  for(int t1 = 0;t1 < 7;t1 ++){
                     for(int t2 = 0;t2 < 7;t2 ++){
                        chd[t1][t2] = 0;
                     }
                  }
                  cf = 1 ; cco = 1 ;
               }else if((e.getX()>300)&&(e.getX()<390)&&(e.getY()>210)&&(e.getY()<240)){
                  sn2 = 0;
                  while(sn2 == 0){
                     d_set();
                  }
               }
               repaint();
            }
         } 
      );

   }

   public void paint(Graphics g){
      og.setColor(Color.white);
      og.fillRect(0,0,550,270);

      og.setColor(Color.black);

      for(int tx = 0;tx < 8;tx ++){
         for(int ty = 0;ty < 7;ty ++){
            d_dice(tx,ty);
         }
      }

      for(int ix = 0;ix < 7;ix ++){
         for(int iy = ix;iy < 7;iy ++){
            if(chd[iy][ix] == 0){
               og.setFont(new Font("",Font.PLAIN,14));
               og.setColor(Color.gray);
            }else{
               og.setFont(new Font("",Font.BOLD,15));
               og.setColor(Color.blue);
            }
            og.drawString(""+ix+"-"+iy,iy*35+290,ix*30+50);
         }
      }

      for(int ix = 0;ix < 7;ix ++){
         for(int iy = 0;iy < 7;iy ++){
            if(cd[iy][ix] != -1){
               if(cd[iy][ix] == cd[iy][ix+1]){
                  og.setColor(Color.red);
                  og.drawRoundRect(30*ix+31,30*iy+31,58,28,9,9);
               }
            }
         }
      }
      for(int ix = 0;ix < 8;ix ++){
         for(int iy = 0;iy < 6;iy ++){
            if(cd[iy][ix] != -1){
               if(cd[iy][ix] == cd[iy+1][ix]){
                  og.setColor(Color.red);
                  og.drawRoundRect(30*ix+31,30*iy+31,28,58,9,9);
               }
            }
         }
      }

      og.setColor(Color.lightGray);
      og.fillRoundRect(300,170,90,30,15,15);
      og.fillRoundRect(300,210,90,30,15,15);
      og.setColor(Color.darkGray);
      og.drawRoundRect(300,170,90,30,15,15);
      og.drawRoundRect(300,210,90,30,15,15);
      og.setColor(Color.black);
      og.setFont(new Font("",Font.BOLD,16));
      og.drawString("retry",325,190);
      og.drawString("shuffle",317,230);

      sp1 = 1;
      for(int t1 = 0;t1 < 7;t1 ++){
         for(int t2 = 0;t2 < 7;t2 ++){
            sp1 = sp1 * chd[t1][t2] ;
         }
      }

      if(sp1 == 1){
         og.setFont(new Font("",Font.BOLD,36));
         og.setColor(Color.red);
         og.drawString("clear!!",350,130);
      }

      g.drawImage(os,0,0,this);
   }

   public void d_dice(int dx,int dy){
      if(cd[dy][dx] == -1){
         og.setColor(Color.gray);
         og.drawRect(30*dx+30,30*dy+30,30,30);
         switch (vd[dy][dx]){
            case 0 : break ;
            case 1 : og.setColor(Color.red) ; 
                     og.fillOval(30*dx+38,30*dy+38,13,13) ; break ;
            case 2 : og.setColor(Color.black) ;
                     if(ddd[td[dy][dx]-1][0] == -1){
                        og.fillOval(30*dx+32,30*dy+32,8,8) ;
                        og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     }else{
                        og.fillOval(30*dx+32,30*dy+50,8,8) ;
                        og.fillOval(30*dx+50,30*dy+32,8,8) ;
                     }
                     break ;
            case 3 : og.setColor(Color.black) ;
                     if(ddd[td[dy][dx]-1][0] == -1){
                        og.fillOval(30*dx+41,30*dy+41,8,8) ;
                        og.fillOval(30*dx+32,30*dy+32,8,8) ;
                        og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     }else{
                        og.fillOval(30*dx+41,30*dy+41,8,8) ;
                        og.fillOval(30*dx+32,30*dy+50,8,8) ;
                        og.fillOval(30*dx+50,30*dy+32,8,8) ;
                     }
                     break ;
            case 4 : og.setColor(Color.black) ;
                     og.fillOval(30*dx+32,30*dy+32,8,8) ;
                     og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     og.fillOval(30*dx+32,30*dy+50,8,8) ;
                     og.fillOval(30*dx+50,30*dy+32,8,8) ; break ;
            case 5 : og.setColor(Color.black) ;
                     og.fillOval(30*dx+41,30*dy+41,8,8) ;
                     og.fillOval(30*dx+32,30*dy+32,8,8) ;
                     og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     og.fillOval(30*dx+32,30*dy+50,8,8) ;
                     og.fillOval(30*dx+50,30*dy+32,8,8) ; break ;
            case 6 : og.setColor(Color.black) ;
                     og.fillOval(30*dx+32,30*dy+32,8,8) ;
                     og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     og.fillOval(30*dx+32,30*dy+50,8,8) ;
                     og.fillOval(30*dx+50,30*dy+32,8,8) ;
                     if(ddd[td[dy][dx]-1][0] == -1){
                        og.fillOval(30*dx+32,30*dy+41,8,8) ;
                        og.fillOval(30*dx+50,30*dy+41,8,8) ;
                     }else{
                        og.fillOval(30*dx+41,30*dy+32,8,8) ;
                        og.fillOval(30*dx+41,30*dy+50,8,8) ;
                     }
                     break ;
         }
      }else{
         og.setColor(Color.black);
         og.fillRoundRect(30*dx+32,30*dy+32,27,27,9,9);
         og.setColor(Color.gray);
         og.drawRect(30*dx+30,30*dy+30,30,30);
         switch (vd[dy][dx]){
            case 0 : break ;
            case 1 : og.setColor(Color.red) ; 
                     og.fillOval(30*dx+38,30*dy+38,13,13) ; break ;
            case 2 : og.setColor(Color.white) ;
                     if(ddd[td[dy][dx]-1][0] == -1){
                        og.fillOval(30*dx+32,30*dy+32,8,8) ;
                        og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     }else{
                        og.fillOval(30*dx+32,30*dy+50,8,8) ;
                        og.fillOval(30*dx+50,30*dy+32,8,8) ;
                     }
                     break ;
            case 3 : og.setColor(Color.white) ;
                     if(ddd[td[dy][dx]-1][0] == -1){
                        og.fillOval(30*dx+41,30*dy+41,8,8) ;
                        og.fillOval(30*dx+32,30*dy+32,8,8) ;
                        og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     }else{
                        og.fillOval(30*dx+41,30*dy+41,8,8) ;
                        og.fillOval(30*dx+32,30*dy+50,8,8) ;
                        og.fillOval(30*dx+50,30*dy+32,8,8) ;
                     }
                     break ;
            case 4 : og.setColor(Color.white) ;
                     og.fillOval(30*dx+32,30*dy+32,8,8) ;
                     og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     og.fillOval(30*dx+32,30*dy+50,8,8) ;
                     og.fillOval(30*dx+50,30*dy+32,8,8) ; break ;
            case 5 : og.setColor(Color.white) ;
                     og.fillOval(30*dx+41,30*dy+41,8,8) ;
                     og.fillOval(30*dx+32,30*dy+32,8,8) ;
                     og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     og.fillOval(30*dx+32,30*dy+50,8,8) ;
                     og.fillOval(30*dx+50,30*dy+32,8,8) ; break ;
            case 6 : og.setColor(Color.white) ;
                     og.fillOval(30*dx+32,30*dy+32,8,8) ;
                     og.fillOval(30*dx+50,30*dy+50,8,8) ;
                     og.fillOval(30*dx+32,30*dy+50,8,8) ;
                     og.fillOval(30*dx+50,30*dy+32,8,8) ;
                     if(ddd[td[dy][dx]-1][0] == -1){
                        og.fillOval(30*dx+32,30*dy+41,8,8) ;
                        og.fillOval(30*dx+50,30*dy+41,8,8) ;
                     }else{
                        og.fillOval(30*dx+41,30*dy+32,8,8) ;
                        og.fillOval(30*dx+41,30*dy+50,8,8) ;
                     }
                     break ;
         }
      }
   }

   public void d_set(){
      cf = 1 ; cco = 1 ;
      for(int ip = 0;ip < 28;ip ++){
         if(Math.random() < 0.5){
             ddd[ip][0] = 1;
         }else{
             ddd[ip][0] = -1;
         }
         if(Math.random() < 0.5){
             ddd[ip][1] = 1;
         }else{
             ddd[ip][1] = -1;
         }
      }

      ch = 0;
      for(int ix = 0;ix < 7;ix ++){
         for(int iy = ix;iy < 7;iy ++){
            if(ddd[ch][1] == 1){
               ddn[ch][0] = ix;
               ddn[ch][1] = iy;
            }else{
               ddn[ch][0] = iy;
               ddn[ch][1] = ix;
            }
            ch ++;
         }
      }

      for(int ct = 0;ct < 100;ct ++){
         sp1 = (int)(Math.random() * 28);
         sp2 = (int)(Math.random() * 28);
         sn1 = ddn[sp1][0] ; sn2 = ddn[sp1][1] ;
         ddn[sp1][0] = ddn[sp2][0] ; ddn[sp1][1] = ddn[sp2][1] ;
         ddn[sp2][0] = sn1 ; ddn[sp2][1] = sn2 ; 
      }

      ifg = 0 ; sn1 = 1 ; sn2 = 1;
      while(ifg == 0){
         dn = 0;
         d_put();
         sn1 ++;
         if(sn1 > 100){
            ifg = 1;
            sn2 = 0;
         }
      }
      for(int t1 = 0;t1 < 7;t1 ++){
         for(int t2 = 0;t2 < 7;t2 ++){
            chd[t1][t2] = 0;
         }
      }
      
   }

   public void d_put(){

      for(int t1 = 0;t1 < 8;t1 ++){
         for(int t2 = 0;t2 < 7;t2 ++){
            td[t2][t1] = 0;
            vd[t2][t1] = -1;
            cd[t2][t1] = -1;
         }
      }

      ifg = 1;
      for(int ty = 0;ty < 7;ty ++){
         for(int tx = 0;tx < 8;tx ++){

            if(ifg == 1){
               if(td[ty][tx] == 0){
                  if(ddd[dn][0] == -1){
                     if(ty == 6){
                        ddd[dn][0] = 1;
                        if(td[ty][tx+1] == 0){
                           td[ty][tx] = dn + 1;
                           td[ty][tx+1] = dn + 1;
                           vd[ty][tx] = ddn[dn][0];
                           vd[ty][tx+1] = ddn[dn][1];
                           dn = (dn + 1) % 28;
                        }else{
                           ddd[td[ty][tx+1]-1][0] = 1;
                           ifg = 0;
                        }
                     }else{
                        td[ty][tx] = dn + 1;
                        td[ty+1][tx] = dn + 1;
                        vd[ty][tx] = ddn[dn][0];
                        vd[ty+1][tx] = ddn[dn][1];
                        dn  = (dn + 1) % 28;
                     }
                  }else{
                     if(tx == 7){
                        ddd[dn][0] = -1;
                        if(ty == 6){
                           ifg = 0;
                        }else{
                           td[ty][tx] = dn + 1;
                           td[ty+1][tx] = dn + 1;
                           vd[ty][tx] = ddn[dn][0];
                           vd[ty+1][tx] = ddn[dn][1];
                           dn  = (dn + 1) % 28;
                        }
                     }else{
                        if(td[ty][tx+1] == 0){
                           td[ty][tx] = dn + 1;
                           td[ty][tx+1] = dn + 1;
                           vd[ty][tx] = ddn[dn][0];
                           vd[ty][tx+1] = ddn[dn][1];
                           dn  = (dn + 1) % 28;
                        }else{
                           if(tx == 6){
                              ddd[dn][0] = -1;
                              td[ty][tx] = dn + 1;
                              td[ty+1][tx] = dn + 1;
                              vd[ty][tx] = ddn[dn][0];
                              vd[ty][tx+1] = ddn[dn][1];
                              dn  = (dn + 1) % 28;
                           }else{
                              ddd[td[ty][tx+1]-1][0] = 1;
                              ifg = 0;
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }

   public void start(){
      if(th == null){
         th = new Thread(this);
         th.start();
      }
   }

   public void stop(){
      th = null;
   }

   public void run(){
      while(th != null){
         try{
            Thread.sleep(100);
         }
         catch (InterruptedException e){
         }
      }
   }

   public void update( Graphics g ){
      paint( g ) ;
   }
}