/**
 *   This program was written by me (Thorondor) :)
 *   I've fixed it for higher versions of IE 'n Netscape in October 2000, but I didn't had enough time
 *   to fix this new deprecation stuff... So by downloading the sourcecode and compiling this awsome
 *   game, you may get about 8 warnings. This is because I've used some Java-Methods that are not longer
 *   actual. Maybe I'm goin' to fix it in a few years ;) We'll see...
 *   Oh yeah, I've forgotten to tell you to use the
 *
 *   javac -deprecation ship.java       command
 *
 *   so use it ;)
 *   If you download this program and maybe make some modifikations,
 *   please comply with the following:
 *   1. By adding this Applet to your own page, please send me an e-Mail with your URL.
 *       (Thoro@geocities.com)
 *   2. Please add a link to my homepage at yours.
 *       (http://www.geocities.com/SiliconValley/Pines/8878)
 *   3. Please keep these requests in the source code.
 *   4. Please tell everybody you know of my great Homepage!!! (And my Applets!!!)
 *
 *   Thanks. 'n heaps of fun ;)
**/

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

public class ship extends Applet
{
    Image block, x_pic, o_pic, xr_pic;
    Image boat1, boat2, boat3, boat4, boat5;
    Image oben, unten, script;
    field_s feld[][] = new field_s[10][10];
    field_s feldL[][] = new field_s[10][10];
    field_s comp[][] = new field_s[10][10];
    field_s compL[][] = new field_s[10][10];
    field_s select[] = new field_s[5];
    field_s sink[][] = new field_s[5][5];
    field_s sinkR[][] = new field_s[4][5];
    double space=2.4;
    double space_x = 3.5;
    int h=12;
    int w=11;
    int akut = 0;
    int zahl = 0;
    int ini = 0;
    int hit1, hit2, hit3, hit4, hit5;
    int spieler, spieler_fertig, count;
    Graphics GR;
    MediaTracker Tracker;
    int rotate;
    TextField Message;
    int gesetzt, getroffen, m_alt, mm_alt, z, x, xx, y, yy, versenkt, run, m_anfang, mm_anfang;
    int richt;
    int treffer, ctreffer;
    int spiel_ende, unten_var;

    public void init()
    {
        akut = 0;
        zahl = 0;

        rotate=0;
        setBackground(Color.white);

        block = getImage(getDocumentBase(),"block.gif");
        x_pic = getImage(getDocumentBase(),"x.gif");
        o_pic =getImage(getDocumentBase(), "o.gif");
        xr_pic = getImage(getDocumentBase(), "xr.gif");

        boat1 = getImage(getDocumentBase(), "lit.gif");
        boat2 = getImage(getDocumentBase(), "dsv.gif");
        boat3 = getImage(getDocumentBase(), "gunb.gif");
        boat4 = getImage(getDocumentBase(), "zers.gif");
        boat5 = getImage(getDocumentBase(), "flug.gif");

        oben = getImage(getDocumentBase(), "oben.jpg");
        unten = getImage(getDocumentBase(), "unten.jpg");
        script = getImage(getDocumentBase(), "script.gif");

        Tracker = new MediaTracker(this);
        Tracker.addImage(block,   0);
        Tracker.addImage(x_pic,   1);
        Tracker.addImage(oben,    2);
        Tracker.addImage(boat1,   3);
        Tracker.addImage(boat2,   4);
        Tracker.addImage(boat3,   5);
        Tracker.addImage(boat4,   6);
        Tracker.addImage(boat5,   7);
        Tracker.addImage(o_pic,   8);
        Tracker.addImage(xr_pic,  9);
        Tracker.addImage(unten,  10);

        try
        {
            Tracker.waitForAll();
        }
        catch (InterruptedException e)
        {
            return;
        }

        double x_pos=31;
        double y_pos=71;
        for (int i=0; i< 10; i++)       //initializing of the play-fields
        {
            for (int ii=0; ii<10; ii++)
            {
                feld[i][ii]= new field_s(x_pos, y_pos, 0);
                comp[i][ii]= new field_s(x_pos, y_pos, 0);
                y_pos = y_pos + h + space;

            }
            y_pos = 71;
            x_pos = x_pos + w + space_x;
        }

        x_pos = 231;
        for (int i=0; i< 10; i++)
        {
            for (int ii=0; ii<10; ii++)
            {
                feldL[i][ii]= new field_s(x_pos, y_pos, 0, 0);
                compL[i][ii]= new field_s(x_pos, y_pos, 0, 0);
                y_pos = y_pos + h + space;

            }
            y_pos = 71;
            x_pos = x_pos + w + space_x;
        }

        select[0] = new field_s(410, 60, 0, true);  //shows which ship is selected
        select[1] = new field_s(410, 80, 0, true);
        select[2] = new field_s(410, 100, 0, true);
        select[3] = new field_s(410, 120, 0, true);
        select[4] = new field_s(410, 140, 0, true);

        int u = 60;         //locations of the images of your ships for hit-x.
        int r = 410;
        for (int i=0; i< 5; i++)
        {
            for (int ii=0; ii<4; ii++)
            {
                sink[ii][i] = new field_s(r, u, 0);
                u = u+22;
            }
            u=60;
            r = r+w+10;
        }

        u=143;
        r=410;
        for (int i=0; i<5; i++)
        {
            sink[4][i] = new field_s(r, u, 0);
            r=r+w+5;
        }

        u = 220;        //locations of the images of the hostile ships for hit-x.
        r = 10;
        for (int i=0; i<2; i++)
        {
            sinkR[0][i] = new field_s(r, u, 0);
            r = r+w+10;
        }
        for (int i=2; i<5; i++)
        {
            sinkR[0][i] = new field_s(r, u, 0);
            r = r+w+10;
        }
        r = 10;
        u = 242;
        for (int ii=1; ii<3; ii++)
        {
            for (int i = 0; i<5; i++)
            {
                sinkR[ii][i] = new field_s(r, u, 0);
                r= r+w+10;
            }
            r=10;
            u=u+22;
        }

        r = 10;
        u = 286;
        for (int i=0; i<5; i++)
        {
            sinkR[3][i] = new field_s(r, u, 0);
            r = r+w+5;
        }
            //end x-hit-setting

        if (ini == 0) //necessary because of the textfield. it hasn't work anymore after "restart"
        {
        ini++;
        Panel p = new Panel();
        p.add(new Button("Rotate"));
        setLayout(null);
        p.reshape(400, 170,100,50);
        add(p);

        Panel p2 = new Panel();
        Message = new TextField("Make your settings and push 'Start Game'.");
        Message.setEditable(false);
        p2.add(Message);
        p2.add(new Button("Start Game"));
        p2.reshape(90,270,500,150);
        add(p2);

        Panel p3 = new Panel();
        p3.add(new Button("OK"));
        p3.reshape(250,230,35,30);
        add(p3);
        } //ini == 0

        hit1 = 0;
        hit2 = 0;
        hit3 = 0;
        hit4 = 0;
        hit5 = 0;

        gesetzt = 1;  //Initializing of who plays first etc.
        getroffen = 0;
        m_alt = -1;
        mm_alt = -1;
        x=0;
        xx=0;
        y=0;
        yy=0;
        versenkt = 0;
        run = 0;
        m_anfang=0;
        mm_anfang=0;
        richt = 0;

        spieler = 0;
        count = 0;
        treffer = 0;
        ctreffer = 0;
        spiel_ende = 0;
        unten_var = 0;
        spieler_fertig = 0;

        showStatus("The computer makes its settings, this may take a while...");

        //computer sets it's ships
        int length=5;
        boolean pruefe=true;
        boolean frei=true;
        int gemacht = 0;
        for (int i=4; i>=0;)
         {
            int m = (int) (Math.random()*9);    //y_feld
            int mm = (int) (Math.random()*9);   //x-feld
            int mmm = (int) (Math.random()*2);  //rotate
            if (comp[m][mm].getStatus()==0)
            {
                setze(length,m,mm,(i+1),mmm);
                if (comp[m][mm].getStatus()!=0) //testing, whether ship may be placed here
                {
                    i--;
                    length--;
                    if (length == 1)
                    {
                        length = 3;
                    }

                }

            }
         }
    showStatus("Now, you're ready to play...");
    }// End of Init()

    public boolean action(Event evt, Object arg)
    {
        if (spiel_ende == 0)
        {
        if (spieler_fertig == 1)
        {
             if (arg.equals("OK"))
             {
                if (gesetzt == 0)
                {
                    compi();
                }
                else Message.setText("First you should shoot...");
             }
        }

        if (spieler_fertig == 0)
        {
            if( arg.equals("Rotate"))
            {
                if (rotate==0)
                {
                    rotate = 1;
                }
                else if (rotate == 1)
                {
                    rotate = 0;
                }
            }

            if (arg.equals("Start Game"))
            {
                for (int i=0; i<10; i++)
                {
                    for (int ii=0; ii<10; ii++)
                    {
                        if (feldL[i][ii].getSS() != 0) count++;
                    }
                }
                if (count == 17)
                {
                    spieler_fertig = 1;
                    Message.setText("Let's get ready to rumble!!!!");
                    demark();
                }
                else if (count != 17)
                {
                    Message.setText("You've got to finish your settings.");
                    count = 0;
                }
            }
        }
        }//End Spiel_ende
        return true;
    }

    public void paint(Graphics g)
    {
        g.drawImage(block, 0,0, this);
        g.drawImage(block, 200, 0, this);
        g.drawImage(boat1, 410, 60, this);//right
        g.drawImage(boat2, 410, 80, this);
        g.drawImage(boat3, 410, 100, this);
        g.drawImage(boat4, 410, 120, this);
        g.drawImage(boat5, 410, 140, this);

        g.drawImage(boat1, 10, 220, this);//down
        g.drawImage(boat2, 45, 220, this);
        g.drawImage(boat3, 10, 240, this);
        g.drawImage(boat4, 10, 260, this);
        g.drawImage(boat5, 10, 280, this);

        g.drawImage(oben, 415, 230, this);
        //drawing of fields:
        for (int i = 0; i<10; i++)
        {
            for (int ii = 0; ii<10; ii++)
            {
                if (feldL[i][ii].getSS() != 0)
                {
                    g.drawImage(o_pic, (int)feldL[i][ii].getXX(),
                    (int) feldL[i][ii].getYY(),
                    this);
                }
                if (compL[i][ii].getSS() == 2)
                {
                    g.drawImage(xr_pic, (int)compL[i][ii].getXX(),
                    (int) compL[i][ii].getYY(),
                    this);
                }
            }
        }

        for (int i = 0; i<10; i++)
        {
            for (int ii = 0; ii<10; ii++)
            {
                if (feld[i][ii].getStatus() == 1)
                {
                    g.drawImage(x_pic, (int) feld[i][ii].getX_pos(), (int) feld[i][ii].getY_pos(), this);
                }
                else if (feld[i][ii].getStatus() == 2)
                {
                    g.drawImage(xr_pic, (int) feld[i][ii].getX_pos(), (int) feld[i][ii].getY_pos(), this);
                }
            }
        }
        //drawing of hits in the ships
        for (int i = 0; i<5; i++)
        {
            for (int ii = 0; ii<5; ii++)
            {
                if (sink[i][ii].getStatus() == 1)
                {
                    g.drawImage(xr_pic, (int) sink[i][ii].getX_pos(), (int) sink[i][ii].getY_pos(), this);
                }
            }
        }
        for (int i = 0; i<5; i++)
        {
            for (int ii = 0; ii<4; ii++)
            {
                if (sinkR[ii][i].getStatus() == 1)
                {
                    g.drawImage(xr_pic, (int) sinkR[ii][i].getX_pos(), (int) sinkR[ii][i].getY_pos(), this);
                }
            }
        }
        g.drawImage(script, 105,220,this);
        g.clipRect(400,0,100,56);
        g.drawImage(block, 400, 0, this);
        g.clipRect(400,25,100,100);
        g.drawImage(script, 380,-20,this);
    }//End of paint()

    public void compi()     //Computer's turn
    {
        if (spiel_ende == 0)
        {
        int m,mm;
        while (gesetzt==0)
        {
            if (getroffen < 1)
            {
            richt = 0;
            m = (int) (Math.random()*10);
            mm = (int) (Math.random()*10);
            if (compL[m][mm].getSS() == 0) //if field hasn't been hit before
            {
                if (feldL[m][mm].getSS() != 0)  //if hit
                {
                    message(m, mm, 1, 0);
                    compL[m][mm].setSS(2);
                    getroffen = 1;
                    versenkt = 1;
                    m_alt=m;
                    mm_alt=mm;
                    m_anfang = m_alt;
                    mm_anfang = mm_alt;
                    richt=0;

                    int t = feldL[m][mm].getSS();
                    t--;
                    if (t == 1) t=0;
                    else if (t == 0) t=2;
                    else if (t == 2) t=1;

                    sink[t][0].setStatus(1);
                    repaint(410,60,90,163);
                }
                else    //if not hit
                {
                    compL[m][mm].setSS(1);
                    message(m, mm, 0, 0);
                    gesetzt = 1;
                    spieler = 0;
                }
                    GR.setColor(Color.red);
                    GR.fillRect((int) compL[m][mm].getXX(), (int) compL[m][mm].getYY(), w, h);
                    repaint((int) compL[m][mm].getXX(), (int) compL[m][mm].getYY(), w, h);
                    try
                    {
                        Thread.sleep(50);
                    }
                    catch(InterruptedException e)
                    {
                        return;
                    }
                    repaint((int) compL[m][mm].getXX(), (int) compL[m][mm].getYY(), w, h);
            }
            }//End getroffen < 1

           else if (getroffen >= 1)     //if hited at the turn before, to test the fields around
                                        //the current position.
           {
            while (gesetzt !=1)
            {
               if (x==0 && y==0 && richt == 0)
               {
                z = (int) (Math.random()*4);
                if (z == 0) //test field above
                {
                    y = -1;
                }
                if (z == 1)//test field right
                {
                    x = 1;
                }
                if (z == 2)//test field below
                {
                    y= 1;
                }
                if (z == 3)//test left field
                {
                    x = -1;
                }
               }

                if ((mm_alt + y == -1) || (mm_alt + y == 10))
                {
                    y = y*(-1);
                    mm_alt=mm_anfang;
                }
                if ((m_alt + x == -1) || (m_alt + x == 10))
                {
                    x = x*(-1);
                    m_alt = m_anfang;
                }

                if (compL[m_alt+x][mm_alt+y].getSS() == 0)
                {
                    if (feldL[m_alt+x][mm_alt+y].getSS() != 0)
                    {
                        richt = 1;
                        int stat;
                        stat = feldL[m_alt+x][mm_alt+y].getSS();
                        if (stat == 1) stat = 3;
                        compL[m_alt+x][mm_alt+y].setSS(2);
                        GR.fillRect((int) compL[m_alt+x][mm_alt+y].getXX(), (int) compL[m_alt+x][mm_alt+y].getYY(), w, h);
                        repaint((int) compL[m_alt+x][mm_alt+y].getXX(), (int) compL[m_alt+x][mm_alt+y].getYY(), w, h);
                        try
                        {
                            Thread.sleep(50);
                        }
                        catch(InterruptedException e)
                        {
                            return;
                        }
                        repaint((int) compL[m_alt+x][mm_alt+y].getXX(), (int) compL[m_alt+x][mm_alt+y].getYY(), w, h);

                        m_alt = m_alt+x;
                        mm_alt = mm_alt+y;//coors are saved for next turn (to try another direction).
                        versenkt++;
                        message(m_alt, mm_alt, 1, 0);

                        int s = feldL[m_alt][mm_alt].getSS();
                        s--;
                        if (s == 1) s=0;
                        else if (s == 0) s=2;
                        else if (s == 2) s=1;
                        sink[s][versenkt-1].setStatus(1);
                        repaint(410,60,90,163);

                        if (versenkt == stat)     //if ship is destroyed
                        {
                            if (feldL[m_alt][mm_alt].getSS() == 1) stat = 1;
                            for (int h=0; h<10; h++)
                            {
                                for (int hh=0; hh<10; hh++)     //clearing field around the destroyed ship.
                                {

                                    if (feldL[h][hh].getSS() == stat)
                                    {
                                        if (h > 0 && compL[h-1][hh].getSS() != 2)   compL[h-1][hh].setSS(1);//left
                                        if (h < 9 && compL[h+1][hh].getSS() != 2)   compL[h+1][hh].setSS(1);//right
                                        if (hh > 0 && compL[h][hh-1].getSS() != 2)  compL[h][hh-1].setSS(1);//above
                                        if (hh < 9 && compL[h][hh+1].getSS() != 2)  compL[h][hh+1].setSS(1);//below
                                        if (h > 0 && hh > 0 && compL[h-1][hh-1].getSS() !=2) compL[h-1][hh-1].setSS(1);//upper-left
                                        if (h < 9 && hh > 0 && compL[h+1][hh-1].getSS() !=2) compL[h+1][hh-1].setSS(1);//upper-right
                                        if (h > 0 && hh < 9 && compL[h-1][hh+1].getSS() !=2) compL[h-1][hh+1].setSS(1);//lower-left
                                        if (h < 9 && hh < 9 && compL[h+1][hh+1].getSS() !=2) compL[h+1][hh+1].setSS(1);//lower-right
                                    }
                                }
                            }

                            ctreffer++;
                            if (ctreffer == 5)
                            {
                                victory(0);
                            }
                            getroffen = 0;
                            versenkt = 0;
                            x=0;
                            y=0;
                            m_alt = 0;
                            mm_alt = 0;
                            richt = 0;
                            gesetzt=1;
                            spieler = 0;
                        }

                    }
                    else //if not hit again
                    {
                        message(m_alt, mm_alt, 0, 0);
                        compL[m_alt+x][mm_alt+y].setSS(1);
                        GR.fillRect((int) compL[m_alt+x][mm_alt+y].getXX(), (int) compL[m_alt+x][mm_alt+y].getYY(), w, h);
                        repaint((int) compL[m_alt+x][mm_alt+y].getXX(), (int) compL[m_alt+x][mm_alt+y].getYY(), w, h);
                        try
                        {
                            Thread.sleep(50);
                        }
                        catch(InterruptedException e)
                        {
                            return;
                        }
                        repaint((int) compL[m_alt+x][mm_alt+y].getXX(), (int) compL[m_alt+x][mm_alt+y].getYY(), w, h);

                        if (versenkt == 1)
                        {
                            x = 0;
                            y = 0;

                        }
                        else if (versenkt > 1)
                        {
                            x=x*(-1);
                            y=y*(-1);
                            m_alt = m_anfang;
                            mm_alt = mm_anfang;
                        }
                        gesetzt=1;
                        spieler = 0;
                    } //else
                }//if ss= 0

                else if (compL[m_alt+x][mm_alt+y].getSS() == 2) //field was a hit before
                {
                    x=x*(-1);
                    y=y*(-1);
                    m_alt = m_anfang;
                    mm_alt = mm_anfang;
                }

                else if (compL[m_alt+x][mm_alt+y].getSS() == 1) //field was tried before
                {
                    x=0;
                    y=0;
                    richt=0;
                }
           }
        }
    }
   }
}

    public void victory(int who)    //message at end of game
    {
        if (who == 0)
        {
            Message.setText("The computer has bombed you down to hell!");
        }
        if (who == 1)
        {
            Message.setText("Congratulations, you were lucky!");
        }
        spiel_ende = 1;
    }

    public void message(int y_pos, int x_pos, int hit, int who)
    {
        //hit = 2 = ship destroyed
        //hit = 1 = hit
        //hit = 0 = no hit
        //who = 0 = computer
        //who = 1 = player
        String buch="";
        y_pos++;
        if (x_pos == 0) buch = "A";
        if (x_pos == 1) buch = "B";
        if (x_pos == 2) buch = "C";
        if (x_pos == 3) buch = "D";
        if (x_pos == 4) buch = "E";
        if (x_pos == 5) buch = "F";
        if (x_pos == 6) buch = "G";
        if (x_pos == 7) buch = "H";
        if (x_pos == 8) buch = "I";
        if (x_pos == 9) buch = "J";

        if (hit == 1)   //hit
        {
            if (who == 1)
            {
                Message.setText("You've hit at "+buch+" "+y_pos+"!!!");
            }
            else if (who == 0)
            {
                Message.setText("The computer hited one of your ships at "+buch+" "+y_pos+"!!!");
            }
        }
        else if (hit == 0)  //no hit
        {
            if (who == 1)
            {
                Message.setText("At "+buch+" "+y_pos+" was just water!!!");
            }
            else if (who == 0)
            {
                Message.setText("The computer hited absolutly nothing at "+buch+" "+y_pos+"!!!");
            }
        }
        else if (hit == 2)  //ship destroyed
        {
            if (who == 1)
            {
                Message.setText("Wow, you've destroyed a whole ship at "+buch+" "+y_pos+"!!!");
            }
            else if (who == 0)
            {
                Message.setText("You're gonna loose. One of your ships was destroyed at "+buch+" "+y_pos+"!!!");
            }
        }
    }

    public void spieler(int x_pos, int y_pos)   //the player's turn
    {
        if (spieler_fertig == 1)
        {
        for (int i=0; i<10; i++)
        {
            for (int ii=0; ii<10; ii++)
            {
                if (x_pos >= feld[i][ii].getX_pos()
                    && x_pos <= feld[i][ii].getX_pos()+w
                    && y_pos >= feld[i][ii].getY_pos()
                    && y_pos <= feld[i][ii].getY_pos()+h
                    && feld[i][ii].getStatus()==0)
                 {
                    if (comp[i][ii].getStatus() != 0)
                    {
                        feld[i][ii].setStatus(2);
                        if (comp[i][ii].getStatus() == 1)   //counting which ship was hit how
                                                            //many times
                        {
                            hit1++;
                            for (int t = 0; t<hit1; t++)
                            {
                                sinkR[0][2+t].setStatus(1);
                            }
                        }
                        else if (comp[i][ii].getStatus() == 2)
                        {
                            hit2++;
                            for (int t = 0; t<hit2; t++)
                            {
                                sinkR[0][t].setStatus(1);
                            }
                        }

                        else if (comp[i][ii].getStatus() == 3)
                        {
                            hit3++;
                            for (int t = 0; t<hit3; t++)
                            {
                                sinkR[1][t].setStatus(1);
                            }
                        }

                        else if (comp[i][ii].getStatus() == 4)
                        {
                            hit4++;
                            for (int t = 0; t<hit4; t++)
                            {
                                sinkR[2][t].setStatus(1);
                            }
                        }

                        else if (comp[i][ii].getStatus() == 5)
                        {
                            hit5++;
                            for (int t = 0; t<hit5; t++)
                            {
                                sinkR[3][t].setStatus(1);
                            }
                        }

                        message(i, ii, 1, 1);
                        repaint(10,220,100,103);

                        if (hit2 == 2)
                        {
                            for (int h=0; h<10; h++)
                            {
                                for (int hh=0; hh<10; hh++)
                                {
                                    if (comp[h][hh].getStatus() == 2)
                                    {
                                        if (h > 0 && feld[h-1][hh].getStatus() != 2)   feld[h-1][hh].setStatus(1);//links
                                        if (h < 9 && feld[h+1][hh].getStatus() != 2)   feld[h+1][hh].setStatus(1);//rechts
                                        if (hh > 0 && feld[h][hh-1].getStatus() != 2)  feld[h][hh-1].setStatus(1);//oben
                                        if (hh < 9 && feld[h][hh+1].getStatus() != 2)  feld[h][hh+1].setStatus(1);//unten
                                        if (h > 0 && hh > 0 && feld[h-1][hh-1].getStatus() !=2) feld[h-1][hh-1].setStatus(1);//oben-links
                                        if (h < 9 && hh > 0 && feld[h+1][hh-1].getStatus() !=2) feld[h+1][hh-1].setStatus(1);//oben-rechtss
                                        if (h > 0 && hh < 9 && feld[h-1][hh+1].getStatus() !=2) feld[h-1][hh+1].setStatus(1);//unten-links
                                        if (h < 9 && hh < 9 && feld[h+1][hh+1].getStatus() !=2) feld[h+1][hh+1].setStatus(1);//unten-rechts
                                    }
                                }
                            }
                            hit2=0;
                            message(i, ii, 2, 1);
                            treffer++;
                        }
                        if (hit3 == 3)
                        {
                            for (int h=0; h<10; h++)
                            {
                                for (int hh=0; hh<10; hh++)
                                {
                                    if (comp[h][hh].getStatus() == 3)
                                    {
                                        if (h > 0 && comp[h-1][hh].getStatus() != 3)   feld[h-1][hh].setStatus(1);//links
                                        if (h < 9 && comp[h+1][hh].getStatus() != 3)   feld[h+1][hh].setStatus(1);//rechts
                                        if (hh > 0 && comp[h][hh-1].getStatus() != 3)  feld[h][hh-1].setStatus(1);//oben
                                        if (hh < 9 && comp[h][hh+1].getStatus() != 3)  feld[h][hh+1].setStatus(1);//unten
                                        if (h > 0 && hh > 0 && comp[h-1][hh-1].getStatus() !=3) feld[h-1][hh-1].setStatus(1);//oben-links
                                        if (h < 9 && hh > 0 && comp[h+1][hh-1].getStatus() !=3) feld[h+1][hh-1].setStatus(1);//oben-rechtss
                                        if (h > 0 && hh < 9 && comp[h-1][hh+1].getStatus() !=3) feld[h-1][hh+1].setStatus(1);//unten-links
                                        if (h < 9 && hh < 9 && comp[h+1][hh+1].getStatus() !=3) feld[h+1][hh+1].setStatus(1);//unten-rechts
                                    }
                                }
                            }
                            hit3=0;
                            message(i, ii, 2, 1);
                            treffer++;
                        }
                        if (hit4 == 4)
                        {
                            for (int h=0; h<10; h++)
                            {
                                for (int hh=0; hh<10; hh++)
                                {
                                    if (comp[h][hh].getStatus() == 4)
                                    {
                                        if (h > 0 && comp[h-1][hh].getStatus() != 4)   feld[h-1][hh].setStatus(1);//links
                                        if (h < 9 && comp[h+1][hh].getStatus() != 4)   feld[h+1][hh].setStatus(1);//rechts
                                        if (hh > 0 && comp[h][hh-1].getStatus() != 4)  feld[h][hh-1].setStatus(1);//oben
                                        if (hh < 9 && comp[h][hh+1].getStatus() != 4)  feld[h][hh+1].setStatus(1);//unten
                                        if (h > 0 && hh > 0 && comp[h-1][hh-1].getStatus() !=4) feld[h-1][hh-1].setStatus(1);//oben-links
                                        if (h < 9 && hh > 0 && comp[h+1][hh-1].getStatus() !=4) feld[h+1][hh-1].setStatus(1);//oben-rechtss
                                        if (h > 0 && hh < 9 && comp[h-1][hh+1].getStatus() !=4) feld[h-1][hh+1].setStatus(1);//unten-links
                                        if (h < 9 && hh < 9 && comp[h+1][hh+1].getStatus() !=4) feld[h+1][hh+1].setStatus(1);//unten-rechts
                                    }
                                }
                            }
                            hit4=0;
                            message(i, ii, 2, 1);
                            treffer++;
                        }
                        if (hit5 == 5)
                        {
                            for (int h=0; h<10; h++)
                            {
                                for (int hh=0; hh<10; hh++)
                                {
                                    if (comp[h][hh].getStatus() == 5)
                                    {
                                        if (h > 0 && comp[h-1][hh].getStatus() != 5)   feld[h-1][hh].setStatus(1);//links
                                        if (h < 9 && comp[h+1][hh].getStatus() != 5)   feld[h+1][hh].setStatus(1);//rechts
                                        if (hh > 0 && comp[h][hh-1].getStatus() != 5)  feld[h][hh-1].setStatus(1);//oben
                                        if (hh < 9 && comp[h][hh+1].getStatus() != 5)  feld[h][hh+1].setStatus(1);//unten
                                        if (h > 0 && hh > 0 && comp[h-1][hh-1].getStatus() !=5) feld[h-1][hh-1].setStatus(1);//oben-links
                                        if (h < 9 && hh > 0 && comp[h+1][hh-1].getStatus() !=5) feld[h+1][hh-1].setStatus(1);//oben-rechtss
                                        if (h > 0 && hh < 9 && comp[h-1][hh+1].getStatus() !=5) feld[h-1][hh+1].setStatus(1);//unten-links
                                        if (h < 9 && hh < 9 && comp[h+1][hh+1].getStatus() !=5) feld[h+1][hh+1].setStatus(1);//unten-rechts
                                    }
                                }
                            }
                            hit5=0;
                            message(i, ii, 2, 1);
                            treffer++;
                        }
                        if (hit1 == 3)
                        {
                            for (int h=0; h<10; h++)
                            {
                                for (int hh=0; hh<10; hh++)
                                {
                                    if (comp[h][hh].getStatus() == 1)
                                    {
                                        if (h > 0 && comp[h-1][hh].getStatus() != 1)   feld[h-1][hh].setStatus(1);//links
                                        if (h < 9 && comp[h+1][hh].getStatus() != 1)   feld[h+1][hh].setStatus(1);//rechts
                                        if (hh > 0 && comp[h][hh-1].getStatus() != 1)  feld[h][hh-1].setStatus(1);//oben
                                        if (hh < 9 && comp[h][hh+1].getStatus() != 1)  feld[h][hh+1].setStatus(1);//unten
                                        if (h > 0 && hh > 0 && comp[h-1][hh-1].getStatus() !=1) feld[h-1][hh-1].setStatus(1);//oben-links
                                        if (h < 9 && hh > 0 && comp[h+1][hh-1].getStatus() !=1) feld[h+1][hh-1].setStatus(1);//oben-rechtss
                                        if (h > 0 && hh < 9 && comp[h-1][hh+1].getStatus() !=1) feld[h-1][hh+1].setStatus(1);//unten-links
                                        if (h < 9 && hh < 9 && comp[h+1][hh+1].getStatus() !=1) feld[h+1][hh+1].setStatus(1);//unten-rechts
                                    }
                                }
                            }
                            hit1=0;
                            message(i, ii, 2, 1);
                            treffer++;
                        }
                    }
                    else
                    {
                        message(i, ii, 0, 1);
                        feld[i][ii].setStatus(1);
                        spieler = 1;
                        gesetzt = 0;


                    }
                    if (treffer == 5)
                    {
                        victory(1);
                    }
                    repaint(31,71,160,145);
                 }
            }
        }
        }//End spieler_fertig == 1

        if (spieler_fertig != 1)//first setting of your ships
        {
        mark(x_pos, y_pos);
        int laenge;
        if (x_pos > 200 && x_pos < 400 && y_pos > 71 && y_pos < 215)
        {
            for (int p=0; p<5; p++)
            {
                if (select[p].getStat() == 1)
                {
                    for (int i=0; i<10; i++)
                    {
                        for (int ii=0; ii<10; ii++)
                        {
                            if (x_pos >= feldL[i][ii].getXX()
                            && x_pos <= feldL[i][ii].getXX()+w
                            && y_pos >= feldL[i][ii].getYY()
                            && y_pos <= feldL[i][ii].getYY()+h
                            && (feldL[i][ii].getSS() == 0
                            || feldL[i][ii].getSS() == (p+1)))
                             {
                                if (p==0)
                                {
                                    laenge=2;
                                }
                                else if (p==1 || p==2)
                                {
                                    laenge = 3;
                                }
                                else if (p==3)
                                {
                                    laenge = 4;
                                }
                                else
                                {
                                    laenge =5;
                                }

                                boolean geht=true;
                                if (select[p].getGoes() && geht)
                                {
                                    mal(laenge, i, ii, p);
                                }
                             }
                        }
                    }
                }// if
            }// for
        }
        }//End spieler_fertig
    }//End spieler()


    public boolean mouseDrag(Event e, int x_pos, int y_pos) //just for the restart button
    {
        if (x_pos >= 410 && x_pos <= 463 && y_pos >= 242 && y_pos <= 263)
        {
            GR.drawImage(unten, 415, 230, this);
            unten_var = 1;
        }
        else if (unten_var == 1)
        {
            GR.drawImage(oben, 415, 230, this);
            unten_var = 0;
        }
        return true;
    }

    public boolean mouseUp(Event e, int x_pos, int y_pos)   //restart at the restart button
    {
        if (unten_var == 1)
        {
            GR.drawImage(oben, 415, 230, this);
            unten_var = 0;
            Message.setText("Make your settings and push 'Start Game' afterwards.");
            init();
            repaint();
        }
        return true;
    }



    public boolean mouseDown(Event e, int x_pos, int y_pos)
    {
        GR = getGraphics();
        if (x_pos >= 410 && x_pos <= 463 && y_pos >= 242 && y_pos <= 263)
        {
            GR.drawImage(unten, 415, 230, this);
            unten_var = 1;
        }
        if (spiel_ende == 0)
        {
            if (spieler == 0)
            {
                spieler(x_pos, y_pos);
            }
            else Message.setText("It's the computer's turn. Press 'OK'");
        }
        return true;
    }

    public void mal(int laenge, int i, int ii, int Status)  //drawing of the blue ship symbols
    {
        Status++;
        if (Status == 1) Status = 2;
        else if (Status == 2) Status = 3;
        else if (Status == 3) Status = 1;
        boolean free=true;
        boolean pruef=true;
        if (rotate==0)
        {
            if (i <= 10-laenge)
            {
             for (int t=-1; t<2; t++)
             {
                for (int tt=-1; tt<=laenge; tt++)
                {
                    if ((i== 10-laenge) && (tt==laenge)) pruef=false;   //right or left end
                    if ((ii==0 && t==-1) || (ii==9 && t==1))// upper or lower end
                    {
                        pruef=false;
                        if (i+tt >=0 && i+tt<10)
                        {
                        if (feldL[i+tt][ii].getSS() != 0 && feldL[i+tt][ii].getSS() != Status)
                        {
                            free = false;
                        }
                        }
                    }
                    if ((i==0 && tt==-1) || (i==9 && tt==1))//left or right (test whether field is free for ship)
                    {
                        pruef = false;
                        if (ii + t >=0 && ii+t<10)
                        {
                            if (feldL[i][ii+t].getSS() != 0 && feldL[i][ii+t].getSS() != Status)
                            {
                                free = false;
                            }
                        }
                    }
                    if (pruef)
                    {
                        if (feldL[i+tt][ii+t].getSS() != 0 && feldL[i+tt][ii+t].getSS() != Status)
                        {
                            free = false;
                        }
                    }
                    pruef = true;
                }
            }
        }
        if (free)
        {
           if (i <= 10-laenge)
           {
            for (int d=0; d<10; d++)    //delete the ship at the old position
            {
                for (int dd=0; dd<10; dd++)
                {
                    if (feldL[d][dd].getSS() == Status)
                    {
                        feldL[d][dd].setSS(0);
                    }
                }
            }

            for (int p=0; p < laenge; p++)
            {
                feldL[i+p][ii].setSS(Status);
            }
           }
        }
        }//end rotate=0;
        else if (rotate==1)
        {
            if (ii <= 10-laenge)
            {
            for (int t=-1; t<2;)
            {
                for (int tt=-1; tt<=laenge; tt++)
                {
                    if ((ii== 10-laenge) && (tt==laenge)) pruef=false;
                    if ((i==0 && t==-1) || (i==9 && t==1))
                    {
                        pruef=false;
                        if (ii+tt >=0 && ii+tt<10)
                        {
                            if (feldL[i][ii+tt].getSS() != 0 && feldL[i][ii+tt].getSS() != Status)
                            {
                                free = false;
                            }
                        }
                    }
                    if ((ii==0 && tt==-1) || (ii==9 && tt==1))
                    {
                        pruef = false;
                        if (i + t >=0 && i+t<10)
                        {
                            if (feldL[i+t][ii].getSS() != 0 && feldL[i+t][ii].getSS() != Status)
                            {
                                free = false;
                            }
                        }
                    }
                    if (pruef)
                    {
                        if (feldL[i+t][ii+tt].getSS() != 0 && feldL[i+t][ii+tt].getSS() != Status)
                        {
                            free = false;
                        }
                    }
                    pruef = true;
                }
                t++;
            }
        }
        if (free)
        {
           if (ii <= 10-laenge)
           {
            for (int d=0; d<10; d++)
            {
                for (int dd=0; dd<10; dd++)
                {
                    if (feldL[d][dd].getSS() == Status)
                    {
                        feldL[d][dd].setSS(0);
                    }
                }
            }

            for (int p=0; p < laenge; p++)
            {
                feldL[i][ii+p].setSS(Status);
            }
           }
        }
        } //END ROTATE= 1
    repaint(200,71,200,200);
    }


    public void setze(int laenge, int i, int ii, int Status, int rotate)
    {
        boolean free=true;
        boolean pruef=true;
        if (rotate==0)
        {
            if (i <= 10-laenge)
            {

            for (int t=-1; t<2; t++)
            {
                for (int tt=-1; tt<=laenge; tt++)
                {
                    if ((i== 10-laenge) && (tt==laenge)) pruef=false;
                    if ((ii==0 && t==-1) || (ii==9 && t==1))
                    {
                        pruef=false;
                        if (i+tt >=0 && i+tt<10)
                        {
                            if (comp[i+tt][ii].getStatus() != 0 && comp[i+tt][ii].getStatus() != Status)
                            {
                                free = false;
                            }
                        }
                    }
                    if ((i==0 && tt==-1) || (i==9 && tt==1))
                    {
                        pruef = false;
                        if (ii + t >=0 && ii+t<10)
                        {
                            if (comp[i][ii+t].getStatus() != 0 && comp[i][ii+t].getStatus() != Status)
                            {
                                free = false;
                            }
                        }
                    }
                    if (pruef)
                    {
                        if (comp[i+tt][ii+t].getStatus() != 0 && comp[i+tt][ii+t].getStatus() != Status)
                        {
                            free = false;
                        }
                    }
                    pruef = true;
                }
            }
        }
        if (free)
        {
           if (i <= 10-laenge)
           {
            for (int d=0; d<10; d++)
            {
                for (int dd=0; dd<10; dd++)
                {
                    if (comp[d][dd].getStatus() == Status)
                    {
                        comp[d][dd].setStatus(0);
                    }
                }
            }
            for (int p=0; p < laenge; p++)
            {
                comp[i+p][ii].setStatus(Status);
            }
           }
        }
        }//end rotate=0;

        else if (rotate==1)
        {
            if (ii <= 10-laenge)
            {
            for (int t=-1; t<2;)
            {
                for (int tt=-1; tt<=laenge; tt++)
                {
                    if ((ii== 10-laenge) && (tt==laenge)) pruef=false;
                    if ((i==0 && t==-1) || (i==9 && t==1))
                    {
                        pruef=false;
                        if (ii+tt >=0 && ii+tt<10)
                        {
                            if (comp[i][ii+tt].getStatus() != 0 && comp[i][ii+tt].getStatus() != Status)
                            {
                                free = false;
                            }
                        }
                    }
                    if ((ii==0 && tt==-1) || (ii==9 && tt==1))
                    {
                        pruef = false;
                        if (i + t >=0 && i+t<10)
                        {
                        if (comp[i+t][ii].getStatus() != 0 && comp[i+t][ii].getStatus() != Status)
                        {
                            free = false;
                        }
                        }
                    }
                    if (pruef)
                    {
                        if (comp[i+t][ii+tt].getStatus() != 0 && comp[i+t][ii+tt].getStatus() != Status)
                        {
                            free = false;
                        }
                    }
                    pruef = true;
                }
                t++;
            }
        }
        if (free)
        {
           if (ii <= 10-laenge)
           {
            for (int d=0; d<10; d++)
            {
                for (int dd=0; dd<10; dd++)
                {
                    if (comp[d][dd].getStatus() == Status)
                    {
                        comp[d][dd].setStatus(0);
                    }
                }
            }
            for (int p=0; p < laenge; p++)
            {
                comp[i][ii+p].setStatus(Status);
            }
           }
        }
        } //END ROTATE= 1

    }

    public void demark()    //unselekt the selekted ship
    {
        for (int i=0; i<5; i++)
        {
            if (select[i].getStat() == 1)
            {
                GR.setColor(Color.white);
                GR.drawRect(select[i].getLeft(), select[i].getUp(), 80, 20);
                select[i].setStat(0);
                GR.setColor(Color.black);
            }
        }
    }

    public void mark(int x_pos, int y_pos)
    {
        if (x_pos >= 410 && y_pos >= 60)
        {
            if (x_pos >= 410 && x_pos <= 490 && y_pos >= 60 && y_pos < 80)
            {
                for (int i=0; i<5; i++)
                {
                    if (select[i].getStat() == 1)
                    {
                        GR.setColor(Color.white);
                        GR.drawRect(select[i].getLeft(), select[i].getUp(), 80, 20);
                        select[i].setStat(0);
                        GR.setColor(Color.black);
                    }
                }
                GR.drawRect(410,60,80,20);
                select[0].setStat(1);
            }
            else if (x_pos >= 410 && x_pos <= 490 && y_pos >= 80 && y_pos < 100)
            {
                for (int i=0; i<5; i++)
                {
                    if (select[i].getStat() == 1)
                    {
                        GR.setColor(Color.white);
                        GR.drawRect(select[i].getLeft(), select[i].getUp(), 80, 20);
                        select[i].setStat(0);
                        GR.setColor(Color.black);
                    }
                }
                GR.drawRect(410,80,80,20);
                select[1].setStat(1);
            }
            else if (x_pos >= 410 && x_pos <= 490 && y_pos >= 100 && y_pos < 120)
            {
                for (int i=0; i<5; i++)
                {
                    if (select[i].getStat() == 1)
                    {
                        GR.setColor(Color.white);
                        GR.drawRect(select[i].getLeft(), select[i].getUp(), 80, 20);
                        select[i].setStat(0);
                        GR.setColor(Color.black);
                    }
                }
                GR.drawRect(410,100,80,20);
                select[2].setStat(1);
            }
            else if (x_pos >= 410 && x_pos <= 490 && y_pos >= 120 && y_pos < 140)
            {
                for (int i=0; i<5; i++)
                {
                    if (select[i].getStat() == 1)
                    {
                        GR.setColor(Color.white);
                        GR.drawRect(select[i].getLeft(), select[i].getUp(), 80, 20);
                        select[i].setStat(0);
                        GR.setColor(Color.black);
                    }
                }
                GR.drawRect(410,120,80,20);
                select[3].setStat(1);
            }
            else if (x_pos >= 410 && x_pos <= 490 && y_pos >= 140 && y_pos < 160)
            {
                for (int i=0; i<5; i++)
                {
                    if (select[i].getStat() == 1)
                    {
                        GR.setColor(Color.white);
                        GR.drawRect(select[i].getLeft(), select[i].getUp(), 80, 20);
                        select[i].setStat(0);
                        GR.setColor(Color.black);
                    }
                }
                GR.drawRect(410,140,80,20);
                select[4].setStat(1);
            }
        }
    }

}

class field_s
{
    double x_pos, y_pos, xx_pos, yy_pos;
    boolean goes;
    int left, up, Stat, SStatus, Typ, Status;

    public field_s(double xx, double yy, int ss, int tt)
    {
        xx_pos = xx;
        yy_pos = yy;
        SStatus = ss;
        Typ = tt;
    }

    public double getXX()
    {
        return xx_pos;
    }

    public double getYY()
    {
        return yy_pos;
    }

    public int getSS()
    {
        return SStatus;
    }

    public int setSS(int free)
    {
        SStatus = free;
        return SStatus;
    }

    public int getTT()
    {
        return Typ;
    }


    public field_s(int l, int u, int status, boolean geht)
    {
        left = l;
        up = u;
        Stat = status;
        goes = geht;
    }

    public boolean getGoes()
    {
        return goes;
    }

    public boolean setGoes(boolean newGoes)
    {
        goes = newGoes;
        return goes;
    }

    public int getLeft()
    {
        return left;
    }

    public int getUp()
    {
        return up;
    }

    public int getStat()
    {
        return Stat;
    }

    public int setStat(int newStatus)
    {
        Stat = newStatus;
        return Stat;
    }

    public field_s(double x, double y, int stat)
    {
        x_pos = x;
        y_pos = y;
        Status = stat;
    }

    public double getX_pos()
    {
        return x_pos;
    }

    public double getY_pos()
    {
        return y_pos;
    }

    public int getStatus()
    {
        return Status;
    }

    public int setStatus(int st)
    {
        Status = st;
        return Status;
    }
}