import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;

public class passage extends Applet implements Runnable{

    int opdb[][] = {{4,0,3},{0,5,0},{2,0,1}};
    int tcdb[][] = {{1,0,2},{0,5,0},{3,0,4}};
    int opd[][] = new int[3][3],tcd[][] = new int[3][3];
    Color cd[] = new Color[6];
    int sw = 0,sc = 0,fg = 0;
    int mx,my,mcx,mcy;
    Button rep;
    Thread th = null;
    Image os;
    Graphics og;

    public void init(){
        setBackground(Color.white);
        os = createImage(220,240);
        og = os.getGraphics();
        cd[0] = new Color(220,220,220);
        cd[1] = new Color(255,  0,  0);
        cd[2] = new Color(  0,  0,255);
        cd[3] = new Color(  0,255,  0);
        cd[4] = new Color(255,255,  0);
        cd[5] = new Color(  0,255,255);
        for(int px = 0;px < 3;px ++){
            for(int py = 0;py < 3;py ++){
                opd[py][px] = opdb[py][px];
                tcd[py][px] = tcdb[py][px];
            }
        }
        setLayout(new BorderLayout());
        Panel pan = new Panel();
        pan.setLayout(new FlowLayout());
        pan.add(rep = new Button("  replay  "));
        add("South",pan);
        rep.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                for(int px = 0;px < 3;px ++){
                    for(int py = 0;py < 3;py ++){
                       opd[py][px] = opdb[py][px];
                       tcd[py][px] = tcdb[py][px];
                   }
                }
                repaint();
            }
        });

        addMouseListener(
            new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                    mx = (e.getX() - 20) / 60;
                    my = (e.getY() - 20) / 60;
                    if(opd[my][mx] != 0){
                        sw = 1 ; sc = opd[my][mx] ; opd[my][mx] = 0;
                        repaint();
                    }
                }
                public void mouseReleased(MouseEvent e){
                    sw = 0 ; opd[my][mx] = sc ; sc = 0 ;
                        repaint();
                }
            }
        );

        addMouseMotionListener(
            new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent e){
                    mcx = (e.getX() - 20) / 60;
                    mcy = (e.getY() - 20) / 60;
                    if((mx != mcx) || (my != mcy)){
                        if(opd[mcy][mcx] == 0){
                            if((Math.abs(mx - mcx) + Math.abs(my - mcy)) < 2){
                                if((mx == 0) && (my == 0) && (mcy == 1)){fg = 1;}
                                if((mx == 0) && (my == 1) && (mcy == 0)){fg = 1;}
                                if((mx == 0) && (my == 1) && (mcx == 1)){fg = 1;}
                                if((mx == 1) && (my == 1) && (mcx == 0)){fg = 1;}
                                if((mx == 1) && (my == 1) && (mcx == 2)){fg = 1;}
                                if((mx == 2) && (my == 1) && (mcx == 1)){fg = 1;}
                                if((mx == 2) && (my == 1) && (mcy == 2)){fg = 1;}
                                if((mx == 2) && (my == 2) && (mcy == 1)){fg = 1;}
                                if(fg == 0){
                                    mx = mcx ; my =mcy;
                                    repaint();
                                }else{
                                    fg = 0;
                                }
                            }
                        }
                    }
                }
            }
        );

    }

    public void paint(Graphics g){
        og.setColor(Color.white); 
        og.fillRect(0,0,220,240);
        for(int ix = 0;ix < 3;ix ++){
            for(int iy = 0;iy < 3;iy ++){
                og.setColor(cd[tcd[iy][ix]]);
                og.fill3DRect(ix * 60 + 20,iy * 60 + 20,59,59,true);
                og.setColor(cd[opd[iy][ix]]);
                og.fillOval(ix * 60 + 30,iy * 60 + 30,40,40);
                if(opd[iy][ix] > 0){
                    og.setColor(Color.lightGray);
                    og.drawOval(ix * 60 + 30,iy * 60 + 30,40,40);
                }
            }
        }
        og.setColor(Color.darkGray);
        og.fill3DRect(0 * 60 + 20,1 * 60 + 17,61,6,true);
        og.fill3DRect(1 * 60 + 17,1 * 60 + 19,6,61,true);
        og.fill3DRect(2 * 60 + 17,1 * 60 + 19,6,61,true);
        og.fill3DRect(2 * 60 + 19,2 * 60 + 17,61,6,true);

        if(sw == 1){
            og.setColor(cd[sc]);
            og.fillOval(mx * 60 + 30,my * 60 + 30,40,40);
            og.setColor(Color.lightGray);
            og.drawOval(mx * 60 + 30,my * 60 + 30,40,40);
        }
        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(20);
            }
            catch (InterruptedException e){ }
        }
    }
    public void update( Graphics g )
    {
        paint( g ) ;
    }
}