import java.applet.Applet;
import java.awt.*;

public class vittoria  extends Applet
{

    public void init()
    {
            for(h = 0; h <= 17; h++)
                ce[h] = ce3[h];
        sh=19;
        sh2=28;
        shift=30;
        mosse = 0;
        scacchiera();
        setLayout(null);
        setBackground(Color.white);
        add(are);
        are.setBounds(330, 40, 210, 165);
        add(ric);
        ric.setBounds(245, 180, 70, 25);
            for(h1 = 0; h1 <= 17; h1++)
                for(h = 0; h <= 9; h++)
                    ceno[h1][h] = 0;
                    ceno2[h1][h] = 0;
ceno[1][1]=2;
ceno[1][2]=4;
ceno[1][3]=5;

ceno2[1][1]=3;
ceno2[1][2]=7;
ceno2[1][3]=9;

ceno[2][1]=5;
ceno[2][2]=4;
ceno[2][3]=3;
ceno[2][4]=1;
ceno[2][5]=6;

ceno2[2][1]=8;
ceno2[2][2]=11;

ceno[3][1]=2;
ceno[3][2]=5;
ceno[3][3]=6;

ceno2[3][1]=1;
ceno2[3][2]=7;
ceno2[3][3]=9;


ceno[4][1]=7;
ceno[4][2]=5;
ceno[4][3]=11;
ceno[4][4]=8;
ceno[4][5]=1;
ceno[4][6]=2;

ceno2[4][1]=14;
ceno2[4][2]=6;
ceno2[4][3]=12;

ceno[5][1]=7;
ceno[5][2]=2;
ceno[5][3]=3;
ceno[5][4]=4;
ceno[5][5]=6;
ceno[5][6]=1;
ceno[5][7]=8;
ceno[5][8]=9;

ceno2[5][1]=13;

ceno[6][1]=5;
ceno[6][2]=8;
ceno[6][3]=2;
ceno[6][4]=3;
ceno[6][5]=9;

ceno2[6][1]=4;
ceno2[6][2]=14;

ceno[7][1]=4;
ceno[7][2]=5;
ceno[7][3]=8;
ceno[7][4]=11;
ceno[7][5]=13;
ceno[7][6]=14;

ceno2[7][1]=1;
ceno2[7][2]=3;
ceno2[7][3]=9;
ceno2[7][4]=10;
ceno2[7][5]=15;
ceno2[7][6]=17;

ceno[8][1]=5;
ceno[8][2]=7;
ceno[8][3]=14;
ceno[8][4]=6;
ceno[8][5]=9;
ceno[8][6]=4;

ceno2[8][1]=2;
ceno2[8][2]=11;
ceno2[8][3]=16;


ceno[9][1]=5;
ceno[9][2]=6;
ceno[9][3]=8;

ceno2[9][1]=1;
ceno2[9][2]=3;
ceno2[9][3]=7;

ceno[10][1]=11;
ceno[10][2]=12;
ceno[10][3]=13;

ceno2[10][1]=7;
ceno2[10][2]=15;
ceno2[10][3]=17;

ceno[11][1]=7;
ceno[11][2]=14;
ceno[11][3]=4;
ceno[11][4]=13;
ceno[11][5]=12;
ceno[11][6]=10;

ceno2[11][1]=8;
ceno2[11][2]=16;
ceno2[11][3]=2;

ceno[12][1]=11;
ceno[12][2]=13;
ceno[12][3]=10;
ceno[12][4]=15;
ceno[12][5]=16;

ceno2[12][1]=4;
ceno2[12][2]=14;

ceno[13][1]=7;
ceno[13][2]=11;
ceno[13][3]=12;
ceno[13][4]=10;
ceno[13][5]=15;
ceno[13][6]=14;
ceno[13][7]=16;
ceno[13][8]=17;

ceno2[13][1]=5;


ceno[14][1]=8;
ceno[14][2]=7;
ceno[14][3]=13;
ceno[14][4]=11;
ceno[14][5]=16;
ceno[14][6]=17;

ceno2[14][1]=6;
ceno2[14][2]=4;
ceno2[14][3]=12;

ceno[15][1]=12;
ceno[15][2]=13;
ceno[15][3]=16;

ceno2[15][1]=10;
ceno2[15][2]=7;
ceno2[15][3]=17;


ceno[16][1]=14;
ceno[16][2]=13;
ceno[16][3]=15;
ceno[16][4]=12;
ceno[16][5]=17;

ceno2[16][1]=8;
ceno2[16][2]=11;

ceno[17][1]=14;
ceno[17][2]=13;
ceno[17][3]=16;

ceno2[17][1]=7;
ceno2[17][2]=10;
ceno2[17][3]=15;

    }

    public boolean mouseDown(Event event, int i, int j)
    {
        x1 = i;
        y1 = j;
        riquadro();
        return false;
    }

    public void paint(Graphics g)
    {
        scacchiera();
    }

    public void riquadro()
    {
        Graphics g = getGraphics();
        for(h = 1; h <= 17; h++)
            if(x1 >= (b[h] / 2 - 1) * shift + 15 && x1 <= (b[h] / 2 - 1) * shift + 50 && y1 >= (a[h] / 2 - 1) * shift + 10 && y1 <= (a[h] / 2 - 1) * shift + 41)
            cella = h;
            libero = false;

if(ce[cella] == 1 || ce[cella]==2)
cella2=0;
for(h = 1; h <= 9; h++)
{
if (ce[ceno[cella][h]]==3)
{
cella2=ceno[cella][h];
libero=true;
}
if (ce[ceno2[cella][h]]==3 && (ce[ceno[cella][h]]==1 || ce[ceno[cella][h]]==2))
{
cella2=ceno2[cella][h];
libero=true;
}
}
        if(libero)
        {
            ce[cella2] = ce[cella];
            ce[cella] = 3;
            scacchiera();
            mosse++;
            String f8=Integer.toString(mosse);

if(ce[1]==2 && ce[2]==2 &&  ce[3]==2 && ce[4]==2 && ce[5]==2 && ce[6]==2 && ce[7]==3 && ce[8]==2 && ce[9]==2 && ce[10]==1 && ce[11]==1 && ce[12]==1 && ce[13]==1 && ce[14]==1 && ce[15]==1 && ce[16]==1 && ce[17]==1)
{
                String TheMsg = "Hai completato il solitario in "+f8+" mosse";
                g.drawString(TheMsg, ((int)((280-(g.getFontMetrics(g.getFont()).stringWidth(TheMsg)))/2))+1, 195);
                if(mosse<37)
                TheMsg ="Eccezionale, scrivimi il punteggio";
                if(mosse>=37 && mosse<44)
                TheMsg = "Ottimo risultato";
                if(mosse>=44 && mosse<=60)
                TheMsg = "Risultato discreto";
                if(mosse>60)
                TheMsg = "Puoi fare di meglio";
                g.drawString(TheMsg, ((int)((280-(g.getFontMetrics(g.getFont()).stringWidth(TheMsg)))/2))+1, 215);
}
else
{
            String TheMsgo = "Mossa n. "+f8;
            g.drawString(TheMsgo, ((int)((280-(g.getFontMetrics(g.getFont()).stringWidth(TheMsgo)))/2))+1, 195);
}

}
}

    public boolean action(Event event, Object obj)
    {
        if((event.target instanceof Button) && "Ricomincia".equals(obj))
            init();
        if(event.target instanceof Checkbox)
        {
            init();
        }
        return true;
    }

    public void scacchiera()
    {
        Graphics g = getGraphics();
        g.setColor(Color.black);
        g.setFont(new Font("Helvetica", 1, 16));
        g.drawString("Piccolo Solitario Vittoriano", 331, 30);
        g.setFont(new Font("Helvetica", 2, 11));

                g.setColor(Color.white);
                g.fillRect(30, 180 , 300, 50);
   
        g.setColor(Color.blue);
        int ax1=30;
        int xpoints[]={ax1*0,ax1*3,ax1*6,ax1*3,ax1*0,ax1*2,ax1*4,ax1*2,ax1*0,ax1*1,ax1*2,ax1*1,ax1*0};
        int ypoints[]={ax1*3,ax1*0,ax1*3,ax1*6,ax1*3,ax1*1,ax1*3,ax1*5,ax1*3,ax1*2,ax1*3,ax1*4,ax1*3};
        int npoints=13;
        g.drawPolygon(xpoints,ypoints,npoints);

        int xpoints1[]={ax1*2,ax1*4,ax1*5,ax1*4,ax1*5,ax1*4,ax1*2};
        int ypoints1[]={ax1*3,ax1*1,ax1*2,ax1*3,ax1*4,ax1*5,ax1*3};
         npoints=7;
        g.drawPolygon(xpoints1,ypoints1,npoints);

        int xpoints2[]={ax1*0+(ax1*4),ax1*3+(ax1*4),ax1*6+(ax1*4),ax1*3+(ax1*4),ax1*0+(ax1*4),ax1*2+(ax1*4),ax1*4+(ax1*4),ax1*2+(ax1*4),ax1*0+(ax1*4),ax1*1+(ax1*4),ax1*2+(ax1*4),ax1*1+(ax1*4),ax1*0+(ax1*4)};
        int ypoints2[]={ax1*3,ax1*0,ax1*3,ax1*6,ax1*3,ax1*1,ax1*3,ax1*5,ax1*3,ax1*2,ax1*3,ax1*4,ax1*3};
         npoints=13;
        g.drawPolygon(xpoints2,ypoints2,npoints);

        int xpoints3[]={ax1*2+(ax1*4),ax1*4+(ax1*4),ax1*5+(ax1*4),ax1*4+(ax1*4),ax1*5+(ax1*4),ax1*4+(ax1*4),ax1*2+(ax1*4)};
        int ypoints3[]={ax1*3,ax1*1,ax1*2,ax1*3,ax1*4,ax1*5,ax1*3};
         npoints=7;
        g.drawPolygon(xpoints3,ypoints3,npoints);

        for(h = 1; h <= 17; h++)
        {
            if(ce[h] == 1)
            {
                g.setColor(Color.black);
                g.drawRect((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2-3, 23, 6);
                g.setColor(Color.cyan);
                g.fillOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2, 23, 8);
                g.setColor(Color.black);
                g.drawOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2, 23, 8);
                g.setColor(Color.cyan);
                g.fillRect((b[h] / 2 - 1) * shift + sh+1, (a[h] / 2 - 1) * shift + sh2-3, 22, 6);
                g.fillOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2-8, 23, 8);
                g.setColor(Color.black);
                g.drawOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2-8, 23, 8);
            }
            if(ce[h] == 2)
            {
                g.setColor(Color.black);
                g.drawRect((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2-3, 23, 6);
                g.setColor(Color.red);
                g.fillOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2, 23, 8);
                g.setColor(Color.black);
                g.drawOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2, 23, 8);
                g.setColor(Color.red);
                g.fillRect((b[h] / 2 - 1) * shift + sh+1, (a[h] / 2 - 1) * shift + sh2-3, 22, 6);
                g.fillOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2-8, 23, 8);
                g.setColor(Color.black);
                g.drawOval((b[h] / 2 - 1) * shift + sh, (a[h] / 2 - 1) * shift + sh2-8, 23, 8);
            }
            if(ce[h] == 3)
            {
        int ax2=(b[h] / 2 - 1) * shift+1;
        int ax3=(a[h] / 2 - 1) * shift+1;
        ax1=29;

        g.setColor(Color.white);
        int xpoints4[]={ax2,ax1+ax2,ax1*2+ax2,ax1+ax2,ax2};
        int ypoints4[]={ax3+ax1,ax3,ax1+ax3,ax3+ax1*2,ax3+ax1};
        int npoints4=5;
        g.fillPolygon(xpoints4,ypoints4,npoints4);
            }
        }
    }

    public vittoria()
    {
        ok = true;
        libero = false;
        mosse = 0;
        testo = "Lo scopo del gioco e' spostare tutte\nle pedine azzurre sulla destra e le\npedine rosse sulla sinistra.\nLe pedine devono essere mosse una\nalla volta da una casella a un'altra\nadiacente che sia libera,\nin orizzontale, verticale o diagonale.\nE' possibile muovere le pedine anche\nsaltandone un'altra.\nBuon divertimento\n\nAntonino Iacono (aiacono@tiscalinet.it)";        gruppo = new CheckboxGroup();
        are = new TextArea(testo, 40, 40);
        ric = new Button("Ricomincia");
        ceno = new int[35][25];
        ceno2 = new int[35][25];        
        ce = new int[35];
    }

    boolean ok;
    boolean libero;
    int mosse;
    String testo;
    CheckboxGroup gruppo;
    TextArea are;
    Button ric;
    int arnd3;
    int x1;
    int y1;
    int h;
    int h1;
    int h2;
    int e;
    int r;
    int cella;
    int cella2;
    int cellav;
    int conta;
    int shift;
    int sh;
    int sh2;
    int b[] = { 0, 6, 4, 2, 8, 6, 4, 10 ,8,6,14,12,16,14,12,18,16,14  };
    int a[] = { 0, 2,4,6,4,6,8,6,8,10,2,4,4,6,8,6,8,10   };
    int ce3[] = { 0, 1, 1, 1, 1, 1, 1, 3,1,1,2,2,2,2,2,2,2,2};
    int ceno[][];
    int ceno2[][];
    int ce[];
}
