import java.applet.*;
import java.awt.*;

public class TicTacToe extends Applet {


    final int leer = 0;
    final int kreischen = 1;
    final int kreuzchen = 2;

    int[][] Belegung = {{leer, leer, leer},
                        {leer, leer, leer},
                        {leer, leer, leer}};


    public void paintSpielfeld(Graphics g, int x, int y) {  // Spielfeld 3 * 3
        g.setColor(Color.white);
        g.fillRect(x,y,300,300);
        g.setColor(Color.blue);
        g.drawLine(x+100,y,x+100,y+300);
        g.drawLine(x+200,y,x+200,y+300);
        g.drawLine(x+300,y,x+300,y+300);
        g.drawLine(x+100,y,x+100,y+300);
        g.drawLine(x,y+100,x+300,y+100);
        g.drawLine(x,y+200,x+300,y+200);
        g.drawLine(x,y+300,x+300,y+300);
    }


    public void paintKreis(Graphics g, int x1, int y1) {  // ein Kreis wird gezeichnet
        g.setColor(Color.green);
        g.drawOval(x1+10,y1+10,80,80);

    }

    public void paintBelegung(Graphics g) {
        for (int i = 0; i <= 2; i++) {
            for (int j = 0; j <= 2; j++) {
                if (Belegung[i][j] == kreischen) {
                    paintKreis(g, i*100, j*100);
                }
                if (Belegung[i][j] == kreuzchen) {
                    paintKreuz(g, i*100, j*100);
                }
            }
        }
    }


    public void paintKreuz(Graphics g, int x1, int y1) { // Kreuz zeichnen
        g.setColor(Color.green);
        g.drawLine(x1+10,y1+10,x1+90,y1+90);
        g.drawLine(x1+90,y1+10,x1+10,y1+90);
    }



    public void paintKreisgew(Graphics g, int x1, int y1) {  // Kreis zeichnen, wenn er gewonnen hat
        g.setColor(Color.red);
        g.drawOval(x1+9,y1+9,82,82);
        g.drawOval(x1+10,y1+10,80,80);
        g.drawOval(x1+11,y1+11,78,78);
    }



    public void paintKreuzgew(Graphics g, int x1, int y1) { // Kreuz zeichnen, wenn Kreuz gewonnen
        g.setColor(Color.red);
        g.drawLine(x1+11,y1+9,x1+91,y1+89);
        g.drawLine(x1+89,y1+9,x1+11,y1+91);
        g.drawLine(x1+10,y1+10,x1+90,y1+90);
        g.drawLine(x1+90,y1+10,x1+10,y1+90);
        g.drawLine(x1+9,y1+11,x1+89,y1+91);
        g.drawLine(x1+91,y1+11,x1+9,y1+89);
    }


    public int gewinn() {  // hat jamand gewonnen?
        int wer;

        for (int j = 1; j <=2; j ++) {
            wer = j;
            for (int i = 0; i<=2; i++) {
                if ((Belegung[i][0] == wer) && (Belegung[i][1] == wer) && (Belegung[i][2] == wer))    // die Zeilen
                    return wer;
            }

            for (int i = 0; i<=2; i++) {
                if ((Belegung[0][i] == wer) && (Belegung[1][i] == wer) && (Belegung[2][i] == wer))   // die Spalten
                    return wer;
            }

            if ((Belegung[0][0] == wer) && (Belegung[1][1] == wer) && (Belegung[2][2] == wer)) {  // die 1. Diagonale
                return wer;
            }

            if ((Belegung[0][2] == wer) && (Belegung[1][1] == wer) && (Belegung[2][0] == wer)) {  // die 2. Diagonale
                return wer;
            }
        }
        return leer;
    }


    public int nochwelchefrei() { // sind noch Felder frei?
        int zaehler = 0;
        int i,j;

        for (i = 0; i<=2; i++) {
            for (j = 0; j<=2; j++) {
                if (Belegung[i][j] == leer)
                    zaehler++;
            }
        }
        return zaehler;
    }


    public void alleszufaellig(Graphics g, int wert) {  // eine zufällige Position wird ausgesucht
        int zaehler = 0;
        int i,j;

        for (i = 0; i<=2; i++) {
            for (j = 0; j<=2; j++) {
                if (Belegung[i][j] == leer)
                    zaehler++;
            }
        }

        int zufall = (int) Math.floor(Math.random()*zaehler);

        int zweiterzaehler;
        zweiterzaehler=0;
        for (i=0; i<=2; i++)
            for (j=0; j<=2; j++)
                if (Belegung[i][j] == leer) {
                    if (zweiterzaehler == zufall) {
                        if (wert == kreischen) {
                            paintKreis(g, i*100, j*100);
                            Belegung[i][j] = kreischen;
                        }
                        else {
                            paintKreuz(g, i*100, j*100);
                            Belegung[i][j] = kreuzchen;
                        }
                        return;
                    }
                    else zweiterzaehler++;
                }
    }


    public void wowurdegewonnen(Graphics g) {     // suchen, wo gewonnen uwrde und dort zeichnen
        int wer;
        for (int j = 1; j <=2; j ++) {
            wer = j;
            for (int i = 0; i<=2; i++) {
                if ((Belegung[i][0] == wer) && (Belegung[i][1] == wer) && (Belegung[i][2] == wer))  {  // die Zeilen
                    if (wer == kreischen) {
                        paintKreisgew(g, i* 100, 0 * 100);
                        paintKreisgew(g, i* 100, 1 * 100);
                        paintKreisgew(g, i* 100, 2 * 100);
                    }
                    else {
                        paintKreuzgew(g, i* 100, 0 * 100);
                        paintKreuzgew(g, i* 100, 1 * 100);
                        paintKreuzgew(g, i* 100, 2 * 100);

                    }
                }
            }

            for (int i = 0; i<=2; i++) {
                if ((Belegung[0][i] == wer) && (Belegung[1][i] == wer) && (Belegung[2][i] == wer)) {   // die Spalten
                    if (wer == kreischen) {
                        paintKreisgew(g, 0* 100, i * 100);
                        paintKreisgew(g, 1* 100, i * 100);
                        paintKreisgew(g, 2* 100, i * 100);
                    }
                    else {
                        paintKreuzgew(g, 0* 100, i * 100);
                        paintKreuzgew(g, 1* 100, i * 100);
                        paintKreuzgew(g, 2* 100, i * 100);

                    }
                }
            }

            if ((Belegung[0][0] == wer) && (Belegung[1][1] == wer) && (Belegung[2][2] == wer)) {  // die 1. Diagonale
                if (wer == kreischen) {
                    paintKreisgew(g, 0* 100, 0 * 100);
                    paintKreisgew(g, 1* 100, 1 * 100);
                    paintKreisgew(g, 2* 100, 2 * 100);
                }
                else {
                    paintKreuzgew(g, 0* 100, 0 * 100);
                    paintKreuzgew(g, 1* 100, 1 * 100);
                    paintKreuzgew(g, 2* 100, 2 * 100);

                }

            }

            if ((Belegung[0][2] == wer) && (Belegung[1][1] == wer) && (Belegung[2][0] == wer)) {  // die 2. Diagonale
                if (wer == kreischen) {
                    paintKreisgew(g, 0* 100, 2 * 100);
                    paintKreisgew(g, 1* 100, 1 * 100);
                    paintKreisgew(g, 2* 100, 0 * 100);
                }
                else {
                    paintKreuzgew(g, 0* 100, 2 * 100);
                    paintKreuzgew(g, 1* 100, 1 * 100);
                    paintKreuzgew(g, 2* 100, 0 * 100);

                }
            }
        }
    }



     public void ichsetzte(Graphics g, int ich) {   /* Setzstrategie,
                                                       erst guckt man, ob man slebst gewinnen kann,
                                                       dann, ob der andere gewinnen kann und setzt sich dort hin,
                                                       tritt kein Fall ein, setzt man sich auf eine zufällige
                                                       Position */
         boolean gesetzt1 = false;
         for (int m = 0; m <= 2; m++) {
             for (int n = 0; n <= 2; n++) {
                 if ((Belegung[m][n] == leer) && (gesetzt1 == false)) {
                     Belegung[m][n] = ich;
                     if (gewinn() == ich) {
                         if (ich == kreischen) {
                            paintKreis(g, m*100, n*100);
                            gesetzt1 = true;
                         }
                         else {
                             paintKreuz(g, m*100, n*100);
                            gesetzt1 = true;
                         }
                     }
                     else
                         Belegung[m][n] = leer;

                 }
             }
         }


         if (gesetzt1 == false) {
             int nichtich;
             boolean gesetzt2 = false;
             if (ich == kreischen)
                 nichtich = kreuzchen;
             else
                 nichtich = kreischen;


             for (int m = 0; m <= 2; m++) {
                 for (int n = 0; n <= 2; n++) {
                     if ((Belegung[m][n] == leer) && (gesetzt2 == false)) {
                         Belegung[m][n] = nichtich;
                         if (gewinn() == nichtich) {
                             if (ich == kreischen) {
                                 paintKreis(g, m*100, n*100);
                                 Belegung[m][n] = ich;
                                 gesetzt2 = true;
                             }
                             else {
                                 paintKreuz(g, m*100, n*100);
                                 Belegung[m][n] = ich;
                                 gesetzt2 = true;
                             }

                         }
                         else
                             Belegung[m][n] = leer;
                     }
                 }
             }

             if (gesetzt2 == false) {
                 alleszufaellig(g, ich);
             }
         }

         try {

             Thread.sleep(1000);

         } catch (Exception e) { e.printStackTrace(); }


     }


    public void paint (Graphics g) {
        paintSpielfeld(g, 0, 0);       // zeichnen des Spielfeldes

        int weristdran;
        int zufall = (int) Math.floor(Math.random()*2);

        if (zufall == 1)
        weristdran = kreischen;
        else
        weristdran = kreuzchen;




        while ((gewinn() == leer) && (nochwelchefrei() != 0)) {
            ichsetzte(g, weristdran);
            if (weristdran == kreischen)
                weristdran = kreuzchen;
            else
                weristdran = kreischen;
        }

        paintBelegung(g);

        wowurdegewonnen(g);



    }



}


