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

public class hiroimono extends Applet implements Runnable{

   int td[][] = new int[10][10];
   int pnd[] = {20,18,20,20,21,18,23};
   int pd[][][] = {{{0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,1,0,0,1,0,0,0},
                    {0,0,1,1,1,1,1,1,0,0},
                    {0,0,0,1,0,0,1,0,0,0},
                    {0,0,0,1,0,0,1,0,0,0},
                    {0,0,1,1,1,1,1,1,0,0},
                    {0,0,0,1,0,0,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,0,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,0,0,0},
                    {0,0,0,1,1,1,1,0,0,0},
                    {0,0,0,1,1,1,1,0,0,0},
                    {0,0,0,1,1,1,1,0,0,0},
                    {0,0,1,1,1,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,0,0,0,0,0,0,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,1,1,1,0,0,0,0,0},
                    {0,0,1,1,1,1,0,0,0,0},
                    {0,0,0,1,1,1,1,0,0,0},
                    {0,0,0,0,1,1,1,1,0,0},
                    {0,0,0,0,0,1,1,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,0,0,0,0,0,0,0}},
                   {{0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,1,1,0,0,0,0},
                    {0,0,0,0,0,1,0,0,0,0},
                    {0,0,0,1,1,1,1,1,0,0},
                    {0,0,0,1,0,1,0,1,0,0},
                    {0,0,0,1,1,1,1,1,0,0},
                    {0,0,0,0,0,1,0,0,0,0},
                    {0,0,0,0,0,1,0,0,0,0},
                    {0,0,0,0,0,1,0,0,0,0},
                    {0,0,0,0,0,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},
                    {0,0,0,1,1,1,0,0,0,0},
                    {0,0,0,0,0,1,0,0,1,0},
                    {0,0,0,0,0,1,0,0,1,0},
                    {0,0,1,1,1,1,1,1,1,0},
                    {0,0,1,0,0,1,0,0,0,0},
                    {0,0,1,0,0,1,0,0,0,0},
                    {0,0,0,0,0,1,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,0,0,0,0,0,0,0,0},
                    {0,0,0,0,1,1,0,0,0,0},
                    {0,0,0,0,1,1,0,0,0,0},
                    {0,0,1,1,1,1,1,1,0,0},
                    {0,0,0,0,1,1,0,0,0,0},
                    {0,0,0,0,1,1,0,0,0,0},
                    {0,0,0,0,1,1,0,0,0,0},
                    {0,0,0,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},
                    {0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0},
                    {0,0,1,1,1,1,1,1,1,0},
                    {0,0,0,0,0,1,0,0,0,0},
                    {0,0,0,1,0,1,1,1,0,0},
                    {0,0,0,1,0,1,0,0,0,0},
                    {0,1,1,1,1,1,1,1,1,1},
                    {0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0}}};
   int pn = 0;
   Choice cho = new Choice();
   int mx,my;
   int sw,co;
   int dd,md;
   int px,py,vx,vy;
   Button rep;
   Label spa;
   Thread th = null;
   Image os;
   Graphics og;

   public void init(){
      os = createImage(330,350);
      og = os.getGraphics();
      setBackground(Color.white);
      setLayout(new BorderLayout());
      Panel pan = new Panel();
      pan.setLayout(new FlowLayout());
      pan.add(rep = new Button("  replay  "));
      pan.add(spa = new Label("    "));
      pan.add(cho);
      cho.addItem("    No.1    ");
      cho.addItem("    No.2    ");
      cho.addItem("    No.3    ");
      cho.addItem("    No.4    ");
      cho.addItem("    No.5    ");
      cho.addItem("    No.6    ");
      cho.addItem("    No.7    ");
      cho.addItemListener(new MyListener());
      add("South",pan);

      R_set();

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               px = (e.getX() - 15) / 30;
               py = (e.getY() - 15) / 30;
               if(sw == 0){
                  if(td[py][px] == 1){
                     mx = px;
                     my = py;
                     sw = 1;
                  }
               }else if(sw == 1){
                  switch(md){
                     case 1 : if(td[my][mx] == 1){
                                 co --;
                                 td[my][mx] = 0;
                              }
                              my = my - 1;
                              if(my < 0)my = 0;
                              dd = 1;
                              break;
                     case 2 : if(td[my][mx] == 1){
                                 co --;
                                 td[my][mx] = 0;
                              }
                              mx = mx + 1;
                              if(mx > 9)mx = 9;
                              dd = 2;
                              break;
                     case 3 : if(td[my][mx] == 1){
                                 co --;
                                 td[my][mx] = 0;
                              }
                              my = my + 1;
                              if(my > 9)my = 9;
                              dd = 3;
                              break;
                     case 4 : if(td[my][mx] == 1){
                                 co --;
                                 td[my][mx] = 0;
                              }
                              mx = mx - 1;
                              if(mx < 0)mx = 0;
                              dd = 4;
                              break;
                  }
               }
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e){
               vx = e.getX()-30*mx-30;
               vy = e.getY()-30*my-30;
                  if(td[my][mx] == 0){
                     if((vy - vx < 0) && (vy + vx < 0) && (dd == 1))md = 1;
                     if((vy - vx < 0) && (vy + vx > 0) && (dd == 2))md = 2;
                     if((vy - vx > 0) && (vy + vx > 0) && (dd == 3))md = 3;
                     if((vy - vx > 0) && (vy + vx < 0) && (dd == 4))md = 4;
                  }else if(td[my][mx] == 1){
                     if((vy - vx < 0) && (vy + vx < 0) && (dd != 3))md = 1;
                     if((vy - vx < 0) && (vy + vx > 0) && (dd != 4))md = 2;
                     if((vy - vx > 0) && (vy + vx > 0) && (dd != 1))md = 3;
                     if((vy - vx > 0) && (vy + vx < 0) && (dd != 2))md = 4;
                  }
               repaint();
            }
         }
      );

      rep.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e){
            R_set();
            repaint();
         }
      });

   }

   class MyListener implements ItemListener{
      public void itemStateChanged(ItemEvent e){
         Choice cho = (Choice)e.getSource();
         switch(cho.getSelectedIndex()){
            case 0 : pn = 0 ; R_set() ; break;
            case 1 : pn = 1 ; R_set() ; break;
            case 2 : pn = 2 ; R_set() ; break;
            case 3 : pn = 3 ; R_set() ; break;
            case 4 : pn = 4 ; R_set() ; break;
            case 5 : pn = 5 ; R_set() ; break;
            case 6 : pn = 6 ; R_set() ; break;
         }
         repaint();
      }
   }

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

      og.setColor(Color.gray);
      for(int k1 = 0;k1 < 10;k1 ++){
         og.drawLine(30*k1+30,15,30*k1+30,315);
         og.drawLine(15,30*k1+30,315,30*k1+30);
      }

      for(int k1 = 0;k1 < 10;k1 ++){
         for(int k2 = 0;k2 < 10;k2 ++){
            if(td[k2][k1] == 1){
               for(int cc = 0;cc < 15;cc ++){
                   og.setColor(new Color(cc*12,cc*12,cc*12));
                   og.fillOval(k1*30+15+cc,k2*30+15+cc,30-2*cc,30-2*cc);
               }
            }
         }
      }

      if((sw == 1) && (co != 0)){
         for(int cc = 0;cc < 15;cc ++){
            og.setColor(new Color(255,cc*12,cc*12));
            og.fillOval(mx*30+15+cc,my*30+15+cc,30-2*cc,30-2*cc);
         }
      }

      og.setColor(Color.green);
      if(sw == 1){
         switch(md){
            case 1 : og.drawLine(mx*30+20,my*30+15,mx*30+30,my*30+5);
                     og.drawLine(mx*30+22,my*30+15,mx*30+30,my*30+7);
                     og.drawLine(mx*30+30,my*30+5,mx*30+40,my*30+15);
                     og.drawLine(mx*30+30,my*30+7,mx*30+38,my*30+15);
                     break;
            case 2 : og.drawLine(mx*30+45,my*30+20,mx*30+55,my*30+30);
                     og.drawLine(mx*30+45,my*30+22,mx*30+53,my*30+30);
                     og.drawLine(mx*30+55,my*30+30,mx*30+45,my*30+40);
                     og.drawLine(mx*30+53,my*30+30,mx*30+45,my*30+38);
                     break;
            case 3 : og.drawLine(mx*30+20,my*30+45,mx*30+30,my*30+55);
                     og.drawLine(mx*30+22,my*30+45,mx*30+30,my*30+53);
                     og.drawLine(mx*30+30,my*30+55,mx*30+40,my*30+45);
                     og.drawLine(mx*30+30,my*30+53,mx*30+38,my*30+45);
                     break;
            case 4 : og.drawLine(mx*30+15,my*30+20,mx*30+5,my*30+30);
                     og.drawLine(mx*30+15,my*30+22,mx*30+7,my*30+30);
                     og.drawLine(mx*30+5,my*30+30,mx*30+15,my*30+40);
                     og.drawLine(mx*30+7,my*30+30,mx*30+15,my*30+38);
                     break;
         }
      }
      if(co == 0){
         og.setColor(Color.white);
         og.fillRect(0,0,330,350);
         og.setFont(new Font("",Font.PLAIN,32));
         og.setColor(Color.red);
         og.drawString("clear !!!",120,180);
         og.drawRect(80,150,170,40);
         og.drawRect(83,153,164,34);
      }

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

   public void R_set(){
      for(int k1 = 0;k1 < 10;k1 ++){
         for(int k2 = 0;k2 < 10;k2 ++){
            td[k2][k1] = pd[pn][k2][k1];
         }
      }
      sw = 0;
      dd = 0;
      co = pnd[pn];
   }

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