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

public class a_dice extends Applet implements Runnable{

   int td[][] = new int[10][10];
   int nd[][] = new int[10][10];
   int dd[][][] = {{{0,0,0},{0,1,0},{0,0,0}},
                   {{1,0,0},{0,0,0},{0,0,1}},
                   {{1,0,0},{0,1,0},{0,0,1}},
                   {{1,0,1},{0,0,0},{1,0,1}},
                   {{1,0,1},{0,1,0},{1,0,1}},
                   {{1,0,1},{1,0,1},{1,0,1}}};
   int pt[][] = new int[3][3];
   int dpx[] = new int[6];
   int dpy[] = new int[6];
   int dx[] = {20,20,20,340,340,340};
   int dy[] = {20,100,180,20,100,180};
   int psw[] = new int[6];
   int qd[][][] = {{{-1,0,-1,-1,3,6,4,3,-1,-1},{-1,-1,-1,-1,0,-1,-1,-1,2,2}},
                   {{1,5,-1,-1,-1,-1,-1,0,5,-1},{2,2,2,2,2,-1,-1,-1,-1,2}},
                   {{1,2,3,4,5,5,-1,-1,-1,-1},{-1,1,-1,-1,-1,-1,1,3,1,-1}}};
   int qn = 0,pn;
   int cs;
   int mx,my,px,py,bx,by,cx,cy;
   Thread th = null;
   Image os;
   Graphics og;

   public void init(){
      os = createImage(420,260);
      og = os.getGraphics();
      setBackground(Color.white);

      for(int i1 = 0;i1 < 10;i1 ++){
         for(int i2 = 0;i2 < 10;i2 ++){
            td[i2][i1] = -1;
            nd[i2][i1] = -1;
         }
      }
      for(int i1 = 0;i1 < 6;i1 ++){
         dpx[i1] = dx[i1];
         dpy[i1] = dy[i1];
      }

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               px = e.getX();
               py = e.getY();
               if(e.getClickCount() == 2){
                  for(int p1 = 0;p1 < 3;p1 ++){
                     for(int p2 = 0;p2 < 3;p2 ++){
                        pt[p1][2-p2] = dd[pn][p2][p1];
                     }
                  }
                  for(int p1 = 0;p1 < 3;p1 ++){
                     for(int p2 = 0;p2 < 3;p2 ++){
                        dd[pn][p2][p1] = pt[p2][p1];
                     }
                  }
               }else{
                  if((px>20)&&(px<80)){
                     if((py>20)&&(py<80)){
                        if(psw[0] == 0){
                           if(psw[pn] != 1)pn = 0 ; psw[pn] = 1;
                        }else if(psw[0] == 1){
                           psw[0] = 0;
                        }
                     }else if((py>100)&&(py<160)){
                        if(psw[1] == 0){
                           if(psw[pn] != 1)pn = 1 ; psw[pn] = 1;
                        }else if(psw[1] == 1){
                           psw[1] = 0;
                        }
                     }else if((py>180)&&(py<240)){
                        if(psw[2] == 0){
                           if(psw[pn] != 1)pn = 2 ; psw[pn] = 1;
                        }else if(psw[2] == 1){
                           psw[2] = 0;
                        }
                     }
                  }else if((px>340)&&(px<400)){
                     if((py>20)&&(py<80)){
                        if(psw[3] == 0){
                           if(psw[pn] != 1)pn = 3 ; psw[pn] = 1;
                        }else if(psw[3] == 1){
                           psw[3] = 0;
                        }
                     }else if((py>100)&&(py<160)){
                        if(psw[4] == 0){
                           if(psw[pn] != 1)pn = 4 ; psw[pn] = 1;
                        }else if(psw[4] == 1){
                           psw[4] = 0;
                        }
                     }else if((py>180)&&(py<240)){
                        if(psw[5] == 0){
                           if(psw[pn] != 1)pn = 5 ; psw[pn] = 1;
                        }else if(psw[5] == 1){
                           psw[5] = 0;
                        }
                     }
                  }else if((px>120)&&(px<280)){
                     if((py>40)&&(py<200)){
                        bx = (px - 100) / 20;
                        by = (py - 20) / 20;
                        if(psw[pn] == 1){
                           cs = 0;
                           for(int c1 = 0;c1 < 3;c1 ++){
                              cs = cs + nd[by-1][bx+c1-1] + nd[by][bx+c1-1] + nd[by+1][bx+c1-1];
                           }
                           if(cs == -9){
                              for(int p1 = 0;p1 < 3;p1 ++){
                                 nd[by-1][bx+p1-1] = pn;
                                 nd[by][bx+p1-1] = pn;
                                 nd[by+1][bx+p1-1] = pn;
                              }
                              for(int p2 = 0;p2 < 3;p2 ++){
                                 td[by-1][bx+p2-1] = dd[pn][0][p2];
                                 td[by][bx+p2-1] = dd[pn][1][p2];
                                 td[by+1][bx+p2-1] = dd[pn][2][p2];
                              }
                              dpx[pn] = 20 * bx + 80;
                              dpy[pn] = 20 * by; 
                              psw[pn] = 2;
                           }
                        }else{
                           pn = nd[by][bx];
                           cx = (dpx[pn] - 100) / 20;
                           cy = (dpy[pn] - 20) / 20;
                           for(int i1 = 0;i1 < 3;i1 ++){
                              for(int i2 = 0;i2 < 3;i2 ++){
                                 td[cy+i2][cx+i1] = -1;
                                 nd[cy+i2][cx+i1] = -1;
                              }
                           }
                           dpx[pn] = dx[pn];
                           dpy[pn] = dy[pn];
                           psw[pn] = 1;
                        }
                     }
                  }else if((px>280)&&(px<330)&&(py>225)&&(py<250)){
                     qn = qn +1;
                     if(qn > 2)qn = 0;
                     for(int i1 = 0;i1 < 10;i1 ++){
                        for(int i2 = 0;i2 < 10;i2 ++){
                           td[i2][i1] = -1;
                           nd[i2][i1] = -1;
                        }
                     }
                     for(int k1 = 0;k1 < 6;k1 ++){
                        dpx[k1] = dx[k1] ; dpy[k1] = dy[k1];
                        psw[k1] = 0;
                     }

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

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

      og.setColor(new Color(255,255,153));
      for(int c1 = 0;c1 < 10;c1 ++){
         for(int c2 = 0;c2 < 10;c2 ++){
            og.fill3DRect(20*c1+100,20*c2+20,20,20,true);
         }
      }
      og.setColor(Color.black); 
      for(int d1 = 0;d1 < 6;d1 ++){
         if(psw[d1] != 1){
            for(int m1 = 0;m1 < 3;m1 ++){
               for(int m2 = 0;m2 < 3;m2 ++){
                   if(dd[d1][m2][m1] == 1){
                      og.fillOval(20*m1+dpx[d1]+2,20*m2+dpy[d1]+2,17,17);
                   }
               }
            }
            og.drawRect(dpx[d1],dpy[d1],60,60);
         }else{
            for(int m1 = 0;m1 < 3;m1 ++){
               for(int m2 = 0;m2 < 3;m2 ++){
                   if(dd[d1][m2][m1] == 1){
                      og.fillOval(20*m1+mx-28,20*m2+my-28,17,17);
                   }
               }
            }
            og.drawRect(mx-30,my-30,60,60);
         }
      }
      for(int s1 = 0;s1 < 10;s1 ++){
         og.setFont(new Font("",Font.PLAIN,20));
         if(qd[qn][0][s1] != -1){
            cs = 0;
            for(int s2 = 0;s2 < 10;s2 ++){
              if(td[s2][s1] != -1){
                 cs = cs + td[s2][s1];
              }
              if(cs == qd[qn][0][s1]){
                 og.setColor(Color.blue);
              }else{
                 og.setColor(Color.red);
              }
              og.drawString(""+qd[qn][0][s1],20*s1+105,240);
            }
         }
         if(qd[qn][1][s1] != -1){
            cs = 0;
            for(int s2 = 0;s2 < 10;s2 ++){
              if(td[s1][s2] != -1){
                 cs = cs + td[s1][s2];
              }
              if(cs == qd[qn][1][s1]){
                 og.setColor(Color.blue);
              }else{
                 og.setColor(Color.red);
              }
              og.drawString(""+qd[qn][1][s1],305,20*s1+38);
            }
         }
      }
      og.setColor(Color.gray);
      og.fillRoundRect(281,226,50,25,10,10);
      og.setColor(Color.lightGray);
      og.fillRoundRect(280,225,50,25,10,10);
      og.setFont(new Font("",Font.BOLD,20));
      og.setColor(Color.white);
      og.drawString("No."+(qn+1),286,246);
      og.setColor(Color.black);
      og.drawString("No."+(qn+1),285,245);
      g.drawImage(os,0,0,this);
   }

   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 ) ;
   }
}