/**************************************************
 * -----> THIS WAS WRITTEN 4 YEARS AFTER THE CODE <----
 *
 * Author: Maan Ashgar
 * This is my first graphical game, a tic-tac-toe.
 * This was a project for one of my projects which started my passion
 * for game programming.
 * Writing this code, I was young and totally noobish, and I wrote the 
 * whole thing myself, so please excuse how bad this code really is!!
 * there is alot of refacroting needed, alot of comments to add and
 * alot of places where the code can be improved.
 * This game totally work, there is a small bug in it that start a game
 * where O (the cpu) just win, then start another game.
 * HAVE FUN!
 */



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.util.Random;


public class TTT extends JFrame implements ActionListener{
 int[][] location =new int[3][3];
//inaitual values of t,tiecounter.
    int t=0; 
    int tieCountar=0;
    int myTurn=0;
    int move=0;
    
 //adding the buttons to the board!
 private JButton jb0= new JButton("");
    private JButton jb1= new JButton("");
    private JButton jb2= new JButton("");
    private JButton jb3= new JButton(""); 
    private JButton jb4= new JButton("");
    private JButton jb5= new JButton("");
    private JButton jb6= new JButton("");
    private JButton jb7= new JButton("");
    private JButton jb8= new JButton("");
   //adding labels to showthe X & O 
    private JLabel jl0=new JLabel("    ");
    private JLabel jl1=new JLabel("    ");
    private JLabel jl2=new JLabel("    ");
    private JLabel jl3=new JLabel("    ");
    private JLabel jl4=new JLabel("    ");
    private JLabel jl5=new JLabel("    ");
    private JLabel jl6=new JLabel("    ");
    private JLabel jl7=new JLabel("    ");
    private JLabel jl8=new JLabel("    ");
    private Font font= new Font("SansSerif",Font.BOLD,55);
    
        
    public TTT(){
     Container board=getContentPane();
     setTitle("Tic Tac Toe");
     //GridLayout to resimple the Tic-Tac-Toe board
     board.setLayout(new GridLayout(0,3,3,3));
     board.add(jb0);
     board.add(jb1);
     board.add(jb2);
     board.add(jb3);
     board.add(jb4);
     board.add(jb5);
     board.add(jb6);
     board.add(jb7);
     board.add(jb8);
     
     jb0.setBackground(Color.white);
     jb1.setBackground(Color.white);
     jb2.setBackground(Color.white);
     jb3.setBackground(Color.white);
     jb4.setBackground(Color.white);
     jb5.setBackground(Color.white);
     jb6.setBackground(Color.white);
     jb7.setBackground(Color.white);
     jb8.setBackground(Color.white);

     //adding labels to the buttons
     jb0.add(jl0);
     jl0.setFont(font);
     jb1.add(jl1);
     jl1.setFont(font);
     jb2.add(jl2);
     jl2.setFont(font);
     jb3.add(jl3);
     jl3.setFont(font);
     jb4.add(jl4);
     jl4.setFont(font);
     jb5.add(jl5);
     jl5.setFont(font);
     jb6.add(jl6);
     jl6.setFont(font);
     jb7.add(jl7);
     jl7.setFont(font);
     jb8.add(jl8); 
     jl8.setFont(font);         
     
     //adding listeners to the buttons
     jb0.addActionListener(this);
     jb1.addActionListener(this);
     jb2.addActionListener(this);
     jb3.addActionListener(this);
     jb4.addActionListener(this);
     jb5.addActionListener(this);
     jb6.addActionListener(this);
     jb7.addActionListener(this);
     jb8.addActionListener(this);
     setSize(300,300);
     setLocation(300,200);
     setResizable(false);
     setVisible(true);

    }
//a seconde constractor to take data from the previse game

 public TTT(int a,Point xy,int o){
  location =new int[3][3];
  tieCountar=0;
        t=a;
        move=0;
     Container board=getContentPane();
     //GridLayout to resimple the Tic-Tac-Toe board
     board.setLayout(new GridLayout(0,3,3,3));
     board.add(jb0);
     board.add(jb1);
     board.add(jb2);
     board.add(jb3);
     board.add(jb4);
     board.add(jb5);
     board.add(jb6);
     board.add(jb7);
     board.add(jb8);
     
     jb0.setBackground(Color.white);
     jb1.setBackground(Color.white);
     jb2.setBackground(Color.white);
     jb3.setBackground(Color.white);
     jb4.setBackground(Color.white);
     jb5.setBackground(Color.white);
     jb6.setBackground(Color.white);
     jb7.setBackground(Color.white);
     jb8.setBackground(Color.white);
     
     jb0.add(jl0);
     jl0.setFont(font);
     jb1.add(jl1);
     jl1.setFont(font);
     jb2.add(jl2);
     jl2.setFont(font);
     jb3.add(jl3);
     jl3.setFont(font);
     jb4.add(jl4);
     jl4.setFont(font);
     jb5.add(jl5);
     jl5.setFont(font);
     jb6.add(jl6);
     jl6.setFont(font);
     jb7.add(jl7);
     jl7.setFont(font);
     jb8.add(jl8); 
     jl8.setFont(font);        
     
     //adding listeners to the buttons
     jb0.addActionListener(this);
     jb1.addActionListener(this);
     jb2.addActionListener(this);
     jb3.addActionListener(this);
     jb4.addActionListener(this);
     jb5.addActionListener(this);
     jb6.addActionListener(this);
     jb7.addActionListener(this);
     jb8.addActionListener(this);
     setSize(300,300); 
//to start at the exacte location of the previes one
  setLocation(xy);
     setResizable(false);
     setVisible(true);
     
     if(o==1){myTurn();}

    }


    public static void main(String[] args){
     new TTT();
    
     
     
     
    }
    public void actionPerformed(ActionEvent e){
    
     if (e.getSource() == jb0)
    {   int turn=turn();
     setLocation(0,0,turn);
     jl0.setText(icon(turn));
     checkLocation(turn);
        jb0.removeActionListener(this);
        jb0.setEnabled(false);
        if(turn==1){myTurn();}
    
    }
    if (e.getSource() == jb1)
    {   int turn=turn();
     setLocation(0,1,turn);
     jl1.setText(icon(turn));
     checkLocation(turn);
     jb1.removeActionListener(this);
     jb1.setEnabled(false);
     if(turn==1){myTurn();}
     
    }
    if (e.getSource() == jb2)
    { int turn=turn();
     setLocation(0,2,turn);
     jl2.setText(icon(turn));
     checkLocation(turn);
     jb2.removeActionListener(this);
     jb2.setEnabled(false);
     if(turn==1){myTurn();}
     
    }
    if (e.getSource() == jb3)
    { int turn=turn();
     setLocation(1,0,turn);
     jl3.setText(icon(turn));
     checkLocation(turn);
     jb3.removeActionListener(this);
     jb3.setEnabled(false);
     if(turn==1){myTurn();}
    
    }
    if (e.getSource() == jb4)
    { int turn=turn();
     setLocation(1,1,turn);
     jl4.setText(icon(turn));
     checkLocation(turn);
     jb4.removeActionListener(this);
     jb4.setEnabled(false);
     if(turn==1){myTurn();}
     
    }
    if (e.getSource() == jb5)
    { int turn=turn();
     setLocation(1,2,turn);
     jl5.setText(icon(turn));
     checkLocation(turn);
     jb5.removeActionListener(this);
     jb5.setEnabled(false);
     if(turn==1){myTurn();}
     //
     
    }
    if (e.getSource() == jb6)
    { int turn=turn();
     setLocation(2,0,turn);
     jl6.setText(icon(turn));
     checkLocation(turn);
     jb6.removeActionListener(this);
     jb6.setEnabled(false);
     if(turn==1){myTurn();}
    
    }
    if (e.getSource() == jb7)
    { int turn=turn();
     setLocation(2,1,turn);
     jl7.setText(icon(turn));
     checkLocation(turn);
     jb7.removeActionListener(this);
     jb7.setEnabled(false);
     if(turn==1){myTurn();}
     
    }
    if (e.getSource() == jb8)
    { int turn=turn();
     setLocation(2,2,turn);
     jl8.setText(icon(turn));
     checkLocation(turn);
     jb8.removeActionListener(this);
     jb8.setEnabled(false);
  if (turn==1){myTurn();}
      
    }
}
    
        // swithching turns between X & O
    public int turn(){
     int a=t%2;
     t++;
     tieCountar++;
     return a+1;
    }
        // put the move in the array
    public void setLocation(int x,int y, int turn){
        location[x][y]=turn;
     }
     //check the array if there is any wins or tie
    public void checkLocation(int turn){
     if(((location[0][0]==turn)&&(location[0][1]==turn)&&(location[0][2]==turn))
       ||((location[1][0]==turn)&&(location[1][1]==turn)&&(location[1][2]==turn))
       ||((location[2][0]==turn)&&(location[2][1]==turn)&&(location[2][2]==turn))
          ||((location[0][0]==turn)&&(location[1][0]==turn)&&(location[2][0]==turn))
       ||((location[0][1]==turn)&&(location[1][1]==turn)&&(location[2][1]==turn))
       ||((location[0][2]==turn)&&(location[1][2]==turn)&&(location[2][2]==turn))
       ||((location[0][0]==turn)&&(location[1][1]==turn)&&(location[2][2]==turn))
       ||((location[0][2]==turn)&&(location[1][1]==turn)&&(location[2][0]==turn))){
        if (turn==1){
                JOptionPane.showMessageDialog(new JFrame(),"X WIN","Tic Tac Toe",JOptionPane.PLAIN_MESSAGE );
                new TTT(t,getLocationOnScreen(),1);
                dispose();
        }
        else if (turn==2){
  JOptionPane.showMessageDialog(new JFrame() ,"O WIN","Tic Tac Toe",JOptionPane.PLAIN_MESSAGE);
         new TTT(t,getLocationOnScreen(),0);
         dispose();
        }
           }
        else if(tieCountar==9){
         JOptionPane.showMessageDialog(new JFrame() ,"Tie","Tic Tac Toe",JOptionPane.PLAIN_MESSAGE);
         new TTT(t,getLocationOnScreen(),turn);
         dispose();
     }
    }
    //Send X & O to the label of the button
    public String icon(int a){

     if (a==1){
      return " X";
     }
     else{
     return " O";}
     
    }
    // the computer turn and what to do
    public void myTurn(){
     //try to win
      if(location[0][0]==0&&location[0][1]==2&&location[0][2]==2){
      jb0.doClick() ;
         }
         else if(location[0][0]==0&&(location[1][0]==2)&&(location[2][0]==2)){
      jb0.doClick() ;
         }
         else if(location[0][0]==0&&(location[1][1]==2)&&(location[2][2]==2)){
      jb0.doClick() ;
         }
         //
      else if(location[0][1]==0&&(location[0][0]==2)&&(location[0][2]==2)){
      jb1.doClick() ;
         }
         else if(location[0][1]==0&&(location[1][1]==2)&&(location[2][1]==2)){
      jb1.doClick() ;
         }
      //
      else if(location[0][2]==0&&(location[0][1]==2)&&(location[0][0]==2)){
      jb2.doClick() ;
         }
         else if(location[0][2]==0&&(location[1][2]==2)&&(location[2][2]==2)){
      jb2.doClick() ;
         }
         else if(location[0][2]==0&&(location[1][1]==2)&&(location[2][0]==2)){
      jb2.doClick() ;
         }
   //
      else if(location[1][0]==0&&(location[0][0]==2)&&(location[2][0]==2)){
      jb3.doClick() ;
         }
         else if(location[1][0]==0&&(location[1][1]==2)&&(location[1][2]==2)){
      jb3.doClick() ;
         }
   //
      else if(location[1][1]==0&&(location[1][0]==2)&&(location[1][2]==2)){
      jb4.doClick() ;
         }
         else if(location[1][1]==0&&(location[0][1]==2)&&(location[2][1]==2)){
      jb4.doClick() ;
         }
         else if(location[1][1]==0&&(location[0][2]==2)&&(location[2][0]==2)){
      jb4.doClick() ;
         }
         else if(location[1][1]==0&&(location[0][0]==2)&&(location[2][2]==2)){
      jb4.doClick() ;
         }
   //
      else if(location[1][2]==0&&(location[0][2]==2)&&(location[2][2]==2)){
      jb5.doClick() ;
         }
         else if(location[1][2]==0&&(location[1][0]==2)&&(location[1][1]==2)){
      jb5.doClick() ;
         }
      //
      else if(location[2][0]==0&&(location[0][0]==2)&&(location[1][0]==2)){
      jb6.doClick() ;
         }
         else if(location[2][0]==0&&(location[2][1]==2)&&(location[2][2]==2)){
      jb6.doClick() ;
         }
         else if(location[2][0]==0&&(location[1][1]==2)&&(location[0][2]==2)){
      jb6.doClick() ;
         }
   //
      else if(location[2][1]==0&&(location[0][1]==2)&&(location[1][1]==2)){
      jb7.doClick() ;
         }
         else if(location[2][1]==0&&(location[2][0]==2)&&(location[2][2]==2)){
      jb7.doClick() ;
         }
   //      
      else if(location[2][2]==0&&(location[0][2]==2)&&(location[1][2]==2)){
      jb8.doClick() ;
         }
         else if(location[2][2]==0&&(location[2][0]==2)&&(location[2][1]==2)){
      jb8.doClick() ;
         }
         else if(location[2][2]==0&&(location[1][1]==2)&&(location[0][0]==2)){
      jb8.doClick() ;
         }
   //
     //if win is not possible, try to block
      else if(location[0][0]==0&&(location[0][1]==1)&&(location[0][2]==1)){
      jb0.doClick() ;
         }
         else if(location[0][0]==0&&(location[1][0]==1)&&(location[2][0]==1)){
      jb0.doClick() ;
         }
         else if(location[0][0]==0&&(location[1][1]==1)&&(location[2][2]==1)){
      jb0.doClick() ;
         }
   //
      else if(location[0][1]==0&&(location[0][0]==1)&&(location[0][2]==1)){
      jb1.doClick() ;
         }
         else if(location[0][1]==0&&(location[1][1]==1)&&(location[2][1]==1)){
      jb1.doClick() ;
         }
   //
      else if(location[0][2]==0&&(location[0][1]==1)&&(location[0][0]==1)){
      jb2.doClick() ;
         }
         else if(location[0][2]==0&&(location[1][2]==1)&&(location[2][2]==1)){
      jb2.doClick() ;
         }
         else if(location[0][2]==0&&(location[1][1]==1)&&(location[2][0]==1)){
      jb2.doClick() ;
         }
   //
      else if(location[1][0]==0&&(location[0][0]==1)&&(location[2][0]==1)){
      jb3.doClick() ;
         }
         else if(location[1][0]==0&&(location[1][1]==1)&&(location[1][2]==1)){
      jb3.doClick() ;
         }
   //
      else if(location[1][1]==0&&(location[1][0]==1)&&(location[1][2]==1)){
      jb4.doClick() ;
         }
         else if(location[1][1]==0&&(location[0][1]==1)&&(location[2][1]==1)){
      jb4.doClick() ;
         }
         else if(location[1][1]==0&&(location[0][2]==1)&&(location[2][0]==1)){
      jb4.doClick() ;
         }
         else if(location[1][1]==0&&(location[0][0]==1)&&(location[2][2]==1)){
      jb4.doClick() ;
         }
   //
      else if(location[1][2]==0&&(location[0][2]==1)&&(location[2][2]==1)){
      jb5.doClick() ;
         }
         else if(location[1][2]==0&&(location[1][0]==1)&&(location[1][1]==1)){
      jb5.doClick() ;
         }
   //
      else if(location[2][0]==0&&(location[0][0]==1)&&(location[1][0]==1)){
      jb6.doClick() ;
         }
         else if(location[2][0]==0&&(location[2][1]==1)&&(location[2][2]==1)){
      jb6.doClick() ;
         }
         else if(location[2][0]==0&&(location[1][1]==1)&&(location[0][2]==1)){
      jb6.doClick() ;
         }
   //
      else if(location[2][1]==0&&(location[0][1]==1)&&(location[1][1]==1)){
      jb7.doClick() ;
         }
         else if(location[2][1]==0&&(location[2][0]==1)&&(location[2][2]==1)){
      jb7.doClick() ;
         }
   //
      else if(location[2][2]==0&&(location[0][2]==1)&&(location[1][2]==1)){
      jb8.doClick() ;
         }
         else if(location[2][2]==0&&(location[2][0]==1)&&(location[2][1]==1)){
      jb8.doClick() ;
         }
         else if(location[2][2]==0&&(location[1][1]==1)&&(location[0][0]==1)){
      jb8.doClick() ;
         }
   //
     //can't win or block, random choise
   else{
      JButton[] B={jb4,jb2,jb5,jb3,jb1,jb0,jb6,jb7,jb8};
      Random g=new Random();
      while(move<10){
       int r=g.nextInt(9);
       if(B[r].isEnabled()){
        B[r].doClick() ;
        move=0;
        break;
       }
        move++;
       }
     }
     
    }
}