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

public class Osidori extends Applet implements Runnable{

   Image pic,mp;
   int px[]={20,50,80,110,140,170,200,230,260,290,320,350,380,410,440,470,500};
   int Count = 0;
   int py=20;
   int mx,my;
   int sx1,sx2,sw;
   int cx,cx0,rx;
   int md[]={1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0};
   int nop = 3;
   Choice sel = new Choice(); 
   Button pla = new Button("  (re)PLAY  ");
   Thread th = null;
   Image os;
   Graphics og;
 
   public void init(){
      setBackground(Color.white);
      os = createImage(520,100);
      og = os.getGraphics();
      mp = getImage(getDocumentBase(),"Picture/siro.gif");
      mx = 20;
      my = 20;

      setLayout(new BorderLayout());

      Panel pan = new Panel();
      pan.setLayout(new FlowLayout());
   
      sel.addItem("    3   ");
      sel.addItem("    4   ");
      sel.addItem("    5   ");
 
      pan.add(sel);
      pan.add(pla);
      add("South",pan);

   }

   public void paint(Graphics g){
      og.setColor(Color.white); 
      og.fillRect(0,0,520,100);
      og.setColor(Color.black); 
      og.drawLine(20,20,500,20);
      og.drawLine(20,50,500,50);

      for(int i = 0;i < 17;i++){
         og.drawLine(20+30*i,20,20+30*i,50);
      }

      og.setFont(new Font("Century",Font.PLAIN,16));
      og.drawString("Count = "+Count,400,70);

      for(int j = 0;j < 16;j++){
         if(md[j] == -1){
                   pic = getImage(getDocumentBase(),"Picture/kuro.gif");
         }else if(md[j] == 1){
                   pic = getImage(getDocumentBase(),"Picture/siro.gif");
         }else if(md[j] == 0){
                   pic = getImage(getDocumentBase(),"");
      }
      og.drawImage(pic,px[j],py,this);
      og.drawImage(mp,mx,my,this);
      }
      g.drawImage(os,0,0,this);
   }

   public boolean mouseDown(Event e,int x,int y){
      cx = (x-35)/30;
      cx0 = cx;
      if(md[cx] == 1 && md[cx+1] == -1){
         sx1 = md[cx];
         sx2 = md[cx+1];    
         md[cx]=0;
         md[cx+1]=0;
         mp = getImage(getDocumentBase(),"Picture/s-k.gif");     
         mx = cx*30+30;
         my = y-15;
         sw = 1;
      }else if(md[cx] == -1 && md[cx+1] == 1){
         sx1 = md[cx];
         sx2 = md[cx+1];
         md[cx]=0;
         md[cx+1]=0;
         mp = getImage(getDocumentBase(),"Picture/k-s.gif");     
         mx = cx*30+30;
         my = y-15;
         sw = 1;       
      }else if(md[cx] == 1 && md[cx+1] == 1){
         sx1 = md[cx];
         sx2 = md[cx+1];
         md[cx]=0;
         md[cx+1]=0;
         mp = getImage(getDocumentBase(),"Picture/s-s.gif");     
         mx = cx*30+30;
         my = y-15;
         sw = 1;       
      }else if(md[cx] == -1 && md[cx+1] == -1){
         sx1 = md[cx];
         sx2 = md[cx+1];
         md[cx]=0;
         md[cx+1]=0;
         mp = getImage(getDocumentBase(),"Picture/k-k.gif");     
         mx = cx*30+30;
         my = y-15;
         sw = 1;       
      }else {
         sx1 = md[cx];
         sx2 = md[cx+1];
         sw = 0;
         mp = getImage(getDocumentBase(),"");  
      }
      repaint();
      return true;
   }

   public boolean mouseUp(Event e,int x2,int y){
      rx = (x2-35)/30;
      if(rx > 14)rx=14;
      if(md[rx] == 0 && md[rx+1] == 0 && sw == 1){
         md[rx]=sx1;
         md[rx+1]=sx2;
         Count = Count + 1;
         mx = cx*30+35;
         my = 20;  
      }else {
         md[cx0]=sx1;
         md[cx0+1]=sx2;
         mx = cx0*30+35;
         my = 20;
      }
      mp = getImage(getDocumentBase(),""); 
      repaint();
      return true;
   }

   public boolean mouseDrag(Event e,int x,int y){
      mx = x-30;
      my = y-15;
      repaint();
      return true;  
   }  

   public boolean action(Event e,Object o){
      if(e.target == sel){
         if(o == "    5   ")nop =5;
         else if(o == "    4   ")nop =4;
         else nop =3;
      for(int k = 0;k <= nop;k++){
         md[k*2]=1;
         md[k*2+1]=-1;
      }
      for(int k=nop*2;k<16;k++)md[k]=0;
         Count = 0;
         repaint();
         return true;
      }
      if(e.target == pla){
         for(int k = 0;k <= nop;k++){
            md[k*2]=1;
            md[k*2+1]=-1;
         }
         for(int k=nop*2;k<16;k++)md[k]=0;
         Count = 0;
         repaint();
         return true;
      }
      return false;
   }

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

}