import java.awt.*;
import java.applet.*;

public class puzzle extends Applet
{
    Image lo;
    Image lm;
    Image lu;

    Image mo;
    Image mm;
    Image mu;

    Image ro;
    Image rm;
    Image ru;

    Image no;
    Image oben;
    Image unten;
    Image sol;

    boolean Knopfunten;

    int count=0;
    int anfang =0;

    MediaTracker Tracker;


    feld Felder[] = new feld[9];

    public void init()
    {

        lo = getImage (getDocumentBase(), "lo.jpg");
        lm = getImage (getDocumentBase(), "lm.jpg");
        lu = getImage (getDocumentBase(), "lu.jpg");

        mo = getImage (getDocumentBase(), "mo.jpg");
        mm = getImage (getDocumentBase(), "mm.jpg");
        mu = getImage (getDocumentBase(), "mu.jpg");

        ro = getImage (getDocumentBase(), "ro.jpg");
        rm = getImage (getDocumentBase(), "rm.jpg");
        ru = getImage (getDocumentBase(), "ru.jpg");

        no = getImage (getDocumentBase(), "no,jpg");
        oben = getImage (getDocumentBase(),"oben.jpg");
        unten  = getImage (getDocumentBase(),"unten.jpg");
        sol = getImage (getDocumentBase(), "button.gif");

        Tracker = new MediaTracker(this);

        Tracker.addImage(lo,0);
        Tracker.addImage(lm,1);
        Tracker.addImage(lu,2);

        Tracker.addImage(mo,3);
        Tracker.addImage(mm,4);
        Tracker.addImage(mu,5);

        Tracker.addImage(ro,6);
        Tracker.addImage(rm,7);
        Tracker.addImage(ru,8);

        Tracker.addImage(no,9);
        Tracker.addImage(oben,10);
        Tracker.addImage(unten,11);
        Tracker.addImage(sol,12);

        showStatus("Please wait while images for 'The Puzzle' are being loaded!");

        try
        {
            Tracker.waitForAll();
        }
        catch(InterruptedException e)
        {
            return;
        }


        Felder [0] = new feld(no,   1,   1, 71, 51);
        Felder [1] = new feld(ru,  73,   1, 71, 51);
        Felder [2] = new feld(lm, 145,   1, 71, 51);

        Felder [3] = new feld(mm,   1,  53, 71, 51);
        Felder [4] = new feld(mu,  73,  53, 71, 51);
        Felder [5] = new feld(rm, 145,  53, 71, 51);

        Felder [6] = new feld(mo,   1, 105, 71, 51);
        Felder [7] = new feld(lu,  73, 105, 71, 51);
        Felder [8] = new feld(ro, 145, 105, 71, 51);



    }

    public void paint(Graphics g)
    {
        showStatus("Have fun playing 'The Puzzle'!");

        g.drawRect(0, 0, 300, 200);
        g.setColor(Color.white);
        g.fillRect(0,0,300,200);
        g.setColor(Color.black);
        g.drawLine(0, 52, 216, 52);
        g.drawLine(0, 103, 216, 103);
        g.drawLine(0, 155, 216, 155);
        g.drawLine(72, 0, 72, 155);
        g.drawLine(144, 0, 144, 155);
        g.drawLine(216, 0, 216, 155);
        g.drawString("Moves: " + count, 100, 190);

    for (int i=0; i<9; i++)
    {
        g.drawImage(Felder[i].getBild(), Felder[i].getX_pos(), Felder[i].getY_pos(), this);
        if (Felder[i].getBild() == no)
        Felder[i].setZustand(0);
        else Felder[i].setZustand(1);

    }

    if (Knopfunten) g.drawImage(unten,230,50,this);
    else g.drawImage(oben,230,50,this);
    g.drawImage(sol, 230, 105, this);
    g.drawString("Solution:", 230,100);

    }

      public boolean mouseDown (Event event, int x_pos, int y_pos)
    {
        if (x_pos > 230 && x_pos < 313 && y_pos > 50 && y_pos < 80)
        {

            Knopfunten = true;
            repaint(230,50,60,40);
        }



        return true;
    }

     public boolean mouseDrag (Event event, int x_pos, int y_pos)
     {
        if (((x_pos < 230 || x_pos > 313) || (y_pos < 50 || y_pos > 80)) && Knopfunten)
        {
        Knopfunten = false;
        repaint(230,50,60,40);
        }
        return true;
     }


public boolean mouseUp (Event e, int x_kor, int y_kor)
{
        if (x_kor > 230 && x_kor < 264 && y_kor > 105 && y_kor < 142)
        {
            Felder[0].setBild(lo);
            Felder[1].setBild(mo);
            Felder[2].setBild(ro);

            Felder[3].setBild(lm);
            Felder[4].setBild(mm);
            Felder[5].setBild(rm);

            Felder[6].setBild(lu);
            Felder[7].setBild(mu);
            Felder[8].setBild(ru);

            for (int s = 0; s < 9; s++)
            {
                Felder[s].setZustand(1);
            }
            repaint();
        }


        Knopfunten = false;
            if (x_kor > 230 && x_kor < 313 && y_kor > 50 && y_kor < 80)
        {
            init();
            count = 0;
            repaint();

        }

    for (int n=0; n<9; n++)
    {
        anfang = count;
        if ((x_kor > Felder[n].getX_pos() && x_kor < Felder[n].getX_pos() + 70) &&
            (y_kor > Felder[n].getY_pos() && y_kor < Felder[n].getY_pos() + 50))
            {
                if (n != 0 && n != 8)
                {
                    if (n < 6)
                    {
                        if (Felder[n].getZustand() == 1 &&
                            Felder[n+3].getZustand() == 0)
                         {
                             Felder[n+3].setBild(Felder[n].getBild());
                             Felder[n+3].setZustand(1);
                             Felder[n].setBild(no);
                             Felder[n].setZustand(0);
                             count++;
                             repaint(Felder[n].getX_pos(), Felder[n].getY_pos(), 75, 105);
                         }
                    }

                    if (n > 2)
                    {
                        if (Felder[n].getZustand() == 1 &&
                            Felder[n-3].getZustand() == 0)
                         {
                             Felder[n-3].setBild(Felder[n].getBild());
                             Felder[n-3].setZustand(1);
                             Felder[n].setBild(no);
                             Felder[n].setZustand(0);
                             count++;
                             repaint(Felder[n-3].getX_pos(), Felder[n-3].getY_pos(), 75, 105);
                         }
                    }

                }
                if (n == 1 || n == 4 || n == 7)
                 {
                 if (Felder[n].getZustand() == 1 &&
                 (Felder[n-1].getZustand() == 0 ||
                  Felder[n+1].getZustand() == 0) )
                 {
                     if (Felder[n+1].getZustand() == 0)
                     {
                         Felder[n+1].setBild(Felder[n].getBild());
                         Felder[n+1].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         repaint(Felder[n].getX_pos(), Felder[n].getY_pos(), 145, 55);
                     }

                     if (Felder[n-1].getZustand() == 0)
                     {
                         Felder[n-1].setBild(Felder[n].getBild());
                         Felder[n-1].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         repaint(Felder[n-1].getX_pos(), Felder[n-1].getY_pos(), 145, 55);
                     }
                     count++;
                    }
                 }


                if (n == 3 || n == 6)
                 {
                 if (Felder[n].getZustand() == 1 &&
                  Felder[n+1].getZustand() == 0)
                 {
                     if (Felder[n+1].getZustand() == 0)
                     {
                         Felder[n+1].setBild(Felder[n].getBild());
                         Felder[n+1].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         repaint(Felder[n].getX_pos(), Felder[n].getY_pos(), 145, 55);
                     }
                     count++;
                    }
                 }

                if (n == 2 || n == 5)
                 {
                 if (Felder[n].getZustand() == 1 &&
                     Felder[n-1].getZustand() == 0)
                 {
                     if (Felder[n-1].getZustand() == 0)
                     {
                         Felder[n-1].setBild(Felder[n].getBild());
                         Felder[n-1].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         repaint(Felder[n-1].getX_pos(), Felder[n-1].getY_pos(), 145, 55);
                     }
                     count++;
                    }
                 }


                 if (n == 0)
                 {
                     if (Felder[n].getZustand() == 1 &&
                         Felder[n+1].getZustand() == 0 )
                     {
                         Felder[n+1].setBild(Felder[n].getBild());
                         Felder[n+1].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         count++;
                         repaint(Felder[n].getX_pos(), Felder[n].getY_pos(), 145, 55);
                     }


                     if (Felder[n].getZustand() == 1 &&
                         Felder[n+3].getZustand() == 0)
                      {
                         Felder[n+3].setBild(Felder[n].getBild());
                         Felder[n+3].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         count++;
                         repaint(Felder[n].getX_pos(), Felder[n].getY_pos(), 75, 105);
                      }
                 }

                 if (n == 8)
                 {
                     if (Felder[n].getZustand() == 1 &&
                         Felder[n-1].getZustand() == 0 )
                     {
                         Felder[n-1].setBild(Felder[n].getBild());
                         Felder[n-1].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         count++;
                         repaint(Felder[n-1].getX_pos(), Felder[n-1].getY_pos(), 145, 55);
                     }

                                         {
                     if (Felder[n].getZustand() == 1 &&
                         Felder[n-3].getZustand() == 0)
                      {
                         Felder[n-3].setBild(Felder[n].getBild());
                         Felder[n-3].setZustand(1);
                         Felder[n].setBild(no);
                         Felder[n].setZustand(0);
                         count++;
                         repaint(Felder[n-3].getX_pos(), Felder[n-3].getY_pos(), 75, 105);
                      }
                    }


                 }


            }
            if (count == anfang + 1)
    repaint(110,190, 30,20);
    }


    if (Felder[0].getBild() == no
        && Felder[1].getBild() == mo
        && Felder[2].getBild() == ro

        && Felder[3].getBild() == lm
        && Felder[4].getBild() == mm
        && Felder[5].getBild() == rm

        && Felder[6].getBild() == lu
        && Felder[7].getBild() == mu
        && Felder[8].getBild() == ru)
        {
            Felder[0].setBild(lo);
            repaint();
        }

    return true;



}


}

class feld
{
    int x_pos;
    int y_pos;
    int x_pos2;
    int y_pos2;
    int Zustand;
    Image Bild;

    public feld (Image Pic, int init_x_pos, int init_y_pos, int init_y_pos2, int init_x_pos2)
    {
      x_pos = init_x_pos;
      y_pos = init_y_pos;
      x_pos2 = init_x_pos2;
      y_pos2 = init_x_pos2;
      Zustand = 0;
      Bild = Pic;

    }

    public Image getBild()
    {
        return Bild;
    }

    public Image setBild(Image picture)
    {
        Bild = picture;
        return Bild;
    }

    public int getX_pos()
    {
        return x_pos;
    }

    public int getY_pos()
    {
        return y_pos;
    }

    public int getX_pos2()
    {
        return x_pos2;
    }

    public int getY_pos2()
    {
        return y_pos2;
    }

    public int setZustand(int Zustandsaenderung)
    {
        Zustand = Zustandsaenderung;
        return Zustand;
    }

    public int getZustand()
    {
        return Zustand;
    }

}
