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

public class domino extends Applet implements Runnable{

   Image os;
   Graphics og;
   Thread th = null;
   int td_b[][] = {{0,0,0,0,0,0},
                   {0,1,1,1,1,0},
                   {0,1,0,0,1,0},
                   {0,1,0,0,1,0},
                   {0,1,1,1,1,0},
                   {0,0,0,0,0,0}};
   int td_n[][] = {{1,1,2,2,3,3},
                   {0,0,0,0,0,0},
                   {0,0,0,0,0,0},
                   {0,0,0,0,0,0},
                   {0,0,0,0,0,0},
                   {4,4,5,5,6,6}};
   int td_d[][] = {{0,0,1,0,1,1},
                   {0,0,0,0,0,0},
                   {0,0,0,0,0,0},
                   {0,0,0,0,0,0},
                   {0,0,0,0,0,0},
                   {1,2,0,2,2,2}};
   int domi_d[][] = {{1,0,0},{1,1,0},{1,1,1},{1,1,2},{1,0,2},{1,2,2}};
   int dx[] = {0,2,4,0,2,4};
   int dy[] = {0,0,0,5,5,5};
   int pd , fg = 0 , px , py;
   int sx,sy,rx,ry;
   int sw;
   int su[] = new int [4];

   public void init(){
      os = createImage(300,300);
      og = os.getGraphics();
      setBackground(Color.white);
      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if(fg == 1){
                  if(e.getClickCount() == 2){
                     if(domi_d[pd][0] == 0){
                        domi_d[pd][0] = 1;
                        sw = domi_d[pd][1] ; domi_d[pd][1] = domi_d[pd][2] ; domi_d[pd][2] = sw;
                     }else{
                        domi_d[pd][0] = 0;
                     }
                  }
                  if(e.getClickCount() == 1){
                     if(domi_d[pd][0] == 0){
                        rx = e.getX() / 50;
                        ry = (e.getY()-25) / 50;
                        if((td_n[ry][rx] == 0)&&(td_n[ry+1][rx]) == 0){
                           td_n[ry][rx] = pd + 1; td_n[ry+1][rx] = pd + 1;
                           td_d[ry][rx] = domi_d[pd][1] ; td_d[ry+1][rx] = domi_d[pd][2];
                           dx[pd] = rx ; dy[pd] = ry;
                           fg = 0;
                        }
                     }else{
                        rx = (e.getX()-25) / 50;
                        ry = e.getY() / 50;
                        if((td_n[ry][rx] == 0)&&(td_n[ry][rx+1]) == 0){
                           td_n[ry][rx] = pd + 1; td_n[ry][rx+1] = pd + 1;
                           td_d[ry][rx] = domi_d[pd][1] ; td_d[ry][rx+1] = domi_d[pd][2];
                           dx[pd] = rx ; dy[pd] = ry;
                           fg = 0;
                        }                  
                     }
                  }
               }else{
                  sx = e.getX() / 50;
                  sy = e.getY() / 50;
                  if(td_n[sy][sx] != 0){
                     pd = td_n[sy][sx] - 1;
                     for(int i1 = 0;i1 < 6;i1 ++){
                        for(int i2 = 0;i2 <6 ;i2 ++){
                           if(td_n[i2][i1] == pd + 1){
                              td_n[i2][i1] = 0;
                              td_d[i2][i1] = 0;
                           }
                        }
                     }
                     fg = 1;
                  }
               }
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e){
               px = e.getX();
               py = e.getY();
               repaint();
            }
         }
      );

   }

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

      for(int i1 = 0;i1 < 6;i1 ++){
         for(int i2 = 0;i2 <6 ;i2 ++){
            if(td_b[i2][i1] == 1){
               og.setColor(new Color(100,40,220));
            }else{
               og.setColor(Color.white);
            }
            og.fillRect(i1 * 50,i2 * 50,50,50);
         }
      }

      for(int dd = 0;dd < 6;dd ++){
         if((fg != 1) || (dd != pd)){
            if(domi_d[dd][0] == 1){
               domi(domi_d[dd][0],dx[dd]*50+50,dy[dd]*50+25,domi_d[dd][1],domi_d[dd][2]);
            }else{
               domi(domi_d[dd][0],dx[dd]*50+25,dy[dd]*50+50,domi_d[dd][1],domi_d[dd][2]);
            }
         }
      }

      if(fg == 1){
         domi(domi_d[pd][0],px,py,domi_d[pd][1],domi_d[pd][2]);
      }

      su[0] = td_d[1][1] + td_d[1][2] + td_d[1][3] + td_d[1][4];
      su[1] = td_d[4][1] + td_d[4][2] + td_d[4][3] + td_d[4][4];
      su[2] = td_d[1][1] + td_d[2][1] + td_d[3][1] + td_d[4][1];
      su[3] = td_d[1][4] + td_d[2][4] + td_d[3][4] + td_d[4][4];
      if((su[0]==4)&&(su[1]==4)&&(su[2]==4)&&(su[3]==4)){
         og.setColor(Color.red);
         for(int k = 0;k < 5;k ++){
            og.drawRect(45+k,45+k,210-2*k,210-2*k);
            og.drawRect(100+k,100+k,100-2*k,100-2*k);
         }
      }
    g.drawImage(os,0,0,this);
   }

   public void domi(int d , int x , int y , int s1 , int s2){
      og.setColor(Color.black);
      if(d == 0){
         og.fillRoundRect(x - 25,y - 50,50,100,15,15);
         og.setColor(Color.lightGray);
         og.drawRoundRect(x - 25,y - 50,50,100,15,15);
         og.setColor(new Color(100,100,100));
         og.drawLine(x-25,y,x+25,y);
         if(s1 == 1){
            og.setColor(Color.red);
            og.fillOval(x-8,y-33,16,16);
         }else if(s1 == 2){
            og.setColor(Color.white);
            og.fillOval(x-16,y-41,13,13);
            og.fillOval(x+3,y-22,13,13);
         }
         if(s2 == 1){
            og.setColor(Color.red);
            og.fillOval(x-8,y+17,16,16);
         }else if(s2 == 2){
            og.setColor(Color.white);
            og.fillOval(x-16,y+9,13,13);
            og.fillOval(x+3,y+28,13,13);
         }
      }else{
         og.fillRoundRect(x - 50,y - 25,100,50,15,15);
         og.setColor(Color.lightGray);
         og.drawRoundRect(x - 50,y - 25,100,50,15,15);
         og.setColor(new Color(100,100,100));
         og.drawLine(x,y-25,x,y+25);
         if(s1 == 1){
            og.setColor(Color.red);
            og.fillOval(x-33,y-8,16,16);
         }else if(s1 == 2){
            og.setColor(Color.white);
            og.fillOval(x-41,y+3,13,13);
            og.fillOval(x-22,y-16,13,13);
         }
         if(s2 == 1){
            og.setColor(Color.red);
            og.fillOval(x+17,y-8,16,16);
         }else if(s2 == 2){
            og.setColor(Color.white);
            og.fillOval(x+9,y+3,13,13);
            og.fillOval(x+28,y-16,13,13);
         }
      }
   }

   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(30);
         }
         catch (InterruptedException e){
         }
      }
   }

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