import java.awt.*;
import java.awt.event.*;

public class TicTac extends Frame {
  static Spielfeld brett;
    final  int leer = 0;
    final  int kreischen = 1;
    final  int kreuzchen = 2;
    int[][] Belegung = {{leer, leer, leer},
                        {leer, leer, leer},
                        {leer, leer, leer}};
  static Button Neuanfang;
    static Button Ende;

    public TicTac() {
        setTitle("TicTacToe-Spiel");
        this.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        setLayout(new FlowLayout());
        add(Neuanfang = new Button("Neustart"));
        Neuanfang.addActionListener(new Neuzeichnen());
        add(Ende = new Button("Ende"));
        Ende.addActionListener(new Schluss());
        add(brett = new Spielfeld(0,0,this));
        setVisible(true);
        pack();
        setBackground(Color.lightGray);

    }
    public class Neuzeichnen implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            if (e.paramString().indexOf("=Neustart")!=-1){
                for(int i=0;i<3;i++) {
                    for (int j = 0; j <3; j++) {
                        Belegung[i][j] = leer;
                    }
                }
                brett.repaint();
            }
        }
    }

    public class Schluss implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            if (e.paramString().indexOf("=Ende")!=-1)
                System.exit(0);
        }
    }



    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(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) {
                            Belegung[i][j] = kreischen;
                        }
                        else {
                            Belegung[i][j] = kreuzchen;
                        }
                        return;
                    }
                    else zweiterzaehler++;
                }
    }


    public void ichsetzte(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) {
                             gesetzt1 = true;
                         }
                         else {
                         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) {
                                 Belegung[m][n] = ich;
                                 gesetzt2 = true;
                             }
                             else {
                                 Belegung[m][n] = ich;
                                 gesetzt2 = true;
                             }

                         }
                         else
                             Belegung[m][n] = leer;
                     }
                 }
             }

             if (gesetzt2 == false) {
                 alleszufaellig(ich);
             }
         }

         try {

             Thread.sleep(1000);

         } catch (Exception e) { e.printStackTrace(); }


    }


    class Spielfeld extends Canvas {
        TicTac mypr;
        int x, y;

        Spielfeld(int anfang1, int anfang2, Frame myframe) {
            x = anfang1;
            y = anfang2;
            setSize(300,300);
            setBackground(Color.white);
            mypr = (TicTac)myframe;

        }

        public void paint(Graphics g) {
            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);        // Spielfeld wird gezeichnet


            int weristdran;
            int zufall = (int) Math.floor(Math.random()*2);

            if (zufall == 1)
                weristdran = kreischen;
            else
                weristdran = kreuzchen;



            while ((gewinn() == leer) && (nochwelchefrei() != 0)) {
                ichsetzte(weristdran);

                for (int i = 0; i <= 2; i++) {
                    for (int j = 0; j <= 2; j++) {
                        if (Belegung[i][j] == kreischen) {
                            g.setColor(Color.green);
                            g.drawOval(i*100+10,j*100+10,80,80);
                        }
                        if (Belegung[i][j] == kreuzchen) {
                            g.setColor(Color.green);
                            g.drawLine(i*100+10,j*100+10,i*100+90,j*100+90);
                            g.drawLine(i*100+90,j*100+10,i*100+10,j*100+90);
                        }
                    }
                }

                if (weristdran == kreischen)
                    weristdran = kreuzchen;
                else
                    weristdran = kreischen;
            }


            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) {

                            g.setColor(Color.red);
                            g.drawOval(i*100+9,0+9,82,82);
                            g.drawOval(i*100+10,0+10,80,80);
                            g.drawOval(i*100+11,0+11,78,78);
                            g.drawOval(i*100+9,100+9,82,82);
                            g.drawOval(i*100+10,100+10,80,80);
                            g.drawOval(i*100+11,100+11,78,78);
                            g.drawOval(i*100+9,200+9,82,82);
                            g.drawOval(i*100+10,200+10,80,80);
                            g.drawOval(i*100+11,200+11,78,78);

                        }
                        else {
                            g.setColor(Color.red);
                            g.drawLine(i*100+11,0*100+9,i*100+91,0*100+89);
                            g.drawLine(i*100+89,0*100+9,i*100+11,0*100+91);
                            g.drawLine(i*100+10,0*100+10,i*100+90,0*100+90);
                            g.drawLine(i*100+90,0*100+10,i*100+10,0*100+90);
                            g.drawLine(i*100+9,0*100+11,i*100+89,0*100+91);
                            g.drawLine(i*100+91,0*100+11,i*100+9,0*100+89);
                            g.drawLine(i*100+11,100+9,i*100+91,100+89);
                            g.drawLine(i*100+89,100+9,i*100+11,100+91);
                            g.drawLine(i*100+10,100+10,i*100+90,100+90);
                            g.drawLine(i*100+90,100+10,i*100+10,100+90);
                            g.drawLine(i*100+9,100+11,i*100+89,100+91);
                            g.drawLine(i*100+91,100+11,i*100+9,100+89);
                            g.drawLine(i*100+11,200+9,i*100+91,200+89);
                            g.drawLine(i*100+89,200+9,i*100+11,200+91);
                            g.drawLine(i*100+10,200+10,i*100+90,200+90);
                            g.drawLine(i*100+90,200+10,i*100+10,200+90);
                            g.drawLine(i*100+9,200+11,i*100+89,200+91);
                            g.drawLine(i*100+91,200+11,i*100+9,200+89);


                        }
                    }
                }

                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) {

                            g.setColor(Color.red);
                            g.drawOval(0+9,i+9,82,82);
                            g.drawOval(0+10,i+10,80,80);
                            g.drawOval(0+11,i+11,78,78);
                            g.drawOval(100+9,i+9,82,82);
                            g.drawOval(100+10,i+10,80,80);
                            g.drawOval(100+11,i+11,78,78);
                            g.drawOval(200+9,i+9,82,82);
                            g.drawOval(200+10,i+10,80,80);
                            g.drawOval(200+11,i+11,78,78);

                        }
                        else {
                            g.setColor(Color.red);
                            g.drawLine(0*100+11,i*100+9,0*100+91,i*100+89);
                            g.drawLine(0*100+89,i*100+9,0*100+11,i*100+91);
                            g.drawLine(0*100+10,i*100+10,0*100+90,i*100+90);
                            g.drawLine(0*100+90,i*100+10,0*100+10,i*100+90);
                            g.drawLine(0*100+9,i*100+11,0*100+89,i*100+91);
                            g.drawLine(0*100+91,i*100+11,0*100+9,i*100+89);
                            g.drawLine(1*100+11,i*100+9,1*100+91,i*100+89);
                            g.drawLine(1*100+89,i*100+9,1*100+11,i*100+91);
                            g.drawLine(1*100+10,i*100+10,1*100+90,i*100+90);
                            g.drawLine(1*100+90,i*100+10,1*100+10,i*100+90);
                            g.drawLine(1*100+9,i*100+11,1*100+89,i*100+91);
                            g.drawLine(1*100+91,i*100+11,1*100+9,i*100+89);
                            g.drawLine(2*100+11,i*100+9,2*100+91,i*100+89);
                            g.drawLine(2*100+89,i*100+9,2*100+11,i*100+91);
                            g.drawLine(2*100+10,i*100+10,2*100+90,i*100+90);
                            g.drawLine(2*100+90,i*100+10,2*100+10,i*100+90);
                            g.drawLine(2*100+9,i*100+11,2*100+89,i*100+91);
                            g.drawLine(2*100+91,i*100+11,2*100+9,i*100+89);



                        }
                }
                }

                if ((Belegung[0][0] == wer) && (Belegung[1][1] == wer) && (Belegung[2][2] == wer)) {  // die 1. Diagonale
                    if (wer == kreischen) {

                        g.setColor(Color.red);
                        g.drawOval(0+9,0+9,82,82);
                        g.drawOval(0+10,0+10,80,80);
                        g.drawOval(0+11,0+11,78,78);
                        g.drawOval(100+9,100+9,82,82);
                        g.drawOval(100+10,100+10,80,80);
                        g.drawOval(100+11,100+11,78,78);
                        g.drawOval(200+9,200+9,82,82);
                        g.drawOval(200+10,200+10,80,80);
                        g.drawOval(200+11,200+11,78,78);

                }
                    else {
                        g.setColor(Color.red);
                        g.drawLine(0*100+11,0*100+9,0*100+91,0*100+89);
                        g.drawLine(0*100+89,0*100+9,0*100+11,0*100+91);
                        g.drawLine(0*100+10,0*100+10,0*100+90,0*100+90);
                        g.drawLine(0*100+90,0*100+10,0*100+10,0*100+90);
                        g.drawLine(0*100+9,0*100+11,0*100+89,0*100+91);
                        g.drawLine(0*100+91,0*100+11,0*100+9,0*100+89);
                        g.drawLine(1*100+11,1*100+9,1*100+91,1*100+89);
                        g.drawLine(1*100+89,1*100+9,1*100+11,1*100+91);
                        g.drawLine(1*100+10,1*100+10,1*100+90,1*100+90);
                        g.drawLine(1*100+90,1*100+10,1*100+10,1*100+90);
                        g.drawLine(1*100+9,1*100+11,1*100+89,1*100+91);
                        g.drawLine(1*100+91,1*100+11,1*100+9,1*100+89);
                        g.drawLine(2*100+11,2*100+9,2*100+91,2*100+89);
                        g.drawLine(2*100+89,2*100+9,2*100+11,2*100+91);
                        g.drawLine(2*100+10,2*100+10,2*100+90,2*100+90);
                        g.drawLine(2*100+90,2*100+10,2*100+10,2*100+90);
                        g.drawLine(2*100+9,2*100+11,2*100+89,2*100+91);
                        g.drawLine(2*100+91,2*100+11,2*100+9,2*100+89);


                    }

            }

                if ((Belegung[0][2] == wer) && (Belegung[1][1] == wer) && (Belegung[2][0] == wer)) {  // die 2. Diagonale
                    if (wer == kreischen) {

                        g.setColor(Color.red);
                        g.drawOval(0+9,200+9,82,82);
                        g.drawOval(0+10,200+10,80,80);
                        g.drawOval(0+11,200+11,78,78);
                        g.drawOval(100+9,100+9,82,82);
                        g.drawOval(100+10,100+10,80,80);
                        g.drawOval(100+11,100+11,78,78);
                        g.drawOval(200+9,0+9,82,82);
                        g.drawOval(200+10,0+10,80,80);
                        g.drawOval(200+11,0+11,78,78);

                    }
                    else {

                        g.setColor(Color.red);
                        g.drawLine(0+11,200+9,0+91,200+89);
                        g.drawLine(0+89,200+9,0+11,200+91);
                        g.drawLine(0+10,200+10,0+90,200+90);
                        g.drawLine(0+90,200+10,0+10,200+90);
                        g.drawLine(0+9,200+11,0+89,200+91);
                        g.drawLine(0+91,200+11,0+9,200+89);
                        g.drawLine(100+11,100+9,100+91,100+89);
                        g.drawLine(100+89,100+9,100+11,100+91);
                        g.drawLine(100+10,100+10,100+90,100+90);
                        g.drawLine(100+90,100+10,100+10,100+90);
                        g.drawLine(100+9,100+11,100+89,100+91);
                        g.drawLine(100+91,100+11,100+9,100+89);
                        g.drawLine(200+11,0+9,200+91,0+89);
                        g.drawLine(200+89,0+9,200+11,0+91);
                        g.drawLine(200+10,0+10,200+90,0+90);
                        g.drawLine(200+90,0+10,200+10,0+90);
                        g.drawLine(200+9,0+11,200+89,0+91);
                        g.drawLine(200+91,0+11,200+9,0+89);


                    }
                }
        }




        }


    }

    public static void main (String args[]) {
        TicTac Ho = new TicTac();
        Ho.setSize(400,400);
        Ho.show();
    }

}


