import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;
/**
 * Tic-Tac-Toe against human or CPU.
 * 
 */
public class TicTacToe {
    //....Random....\\
    static Random rd = new Random();
    
    //....Buttons....\\
    static JButton butEasy  = new JButton("Easy");
    static JButton butHard  = new JButton("Hard");
    static JButton butHvH   = new JButton("Vs. A Friend");
    static JButton butX     = new JButton("X");
    static JButton butO     = new JButton("O");
    static JButton butA     = new JButton("");
    static JButton butB     = new JButton("");
    static JButton butC     = new JButton("");
    static JButton butD     = new JButton("");
    static JButton butE     = new JButton("");
    static JButton butF     = new JButton("");
    static JButton butG     = new JButton("");
    static JButton butH     = new JButton("");
    static JButton butI     = new JButton("");

    static JButton butA1    = new JButton("");
    static JButton butB1    = new JButton("");
    static JButton butC1    = new JButton("");
    static JButton butD1    = new JButton("");
    static JButton butE1    = new JButton("");
    static JButton butF1    = new JButton("");
    static JButton butG1    = new JButton("");
    static JButton butH1    = new JButton("");
    static JButton butI1    = new JButton("");
    
    static JButton butSame = new JButton("");
   
    //....Labels....\\
    static JLabel  mssg    = new JLabel ("Please choose a difficulty.");
    static JLabel or = new JLabel("- Or -");

    //....Panels....\\
    static JPanel main    = new JPanel();
    static JPanel message = new JPanel();
    private static class ButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            String letter;
            String turn;

            //....Character Selection....\\
            if (evt.getSource() == butEasy || evt.getSource() == butHard || evt.getSource() == butHvH) {
                characterSelection();
            }
            
            //....Game Setup....\\
            if (evt.getSource() == butX || evt.getSource() == butO) {
                ticTacToeSetup(or);
            }
            
            //....Easy CPU....\\
            if (evt.getSource() == butEasy) {
                
            }
            
            //....Hard CPU....\\
            if (evt.getSource() == butHard) {

            }   
            
            //....Vs. a Friend....\\
            if (evt.getSource() == butHvH) {
                
            }
            //....Choose....\\
            if (evt.getSource() == butX) {
                mssg.setText("It is X's turn.");
            } else if (evt.getSource() == butO) {
                mssg.setText("It is O's turn.");
            }        
            //....Turn....\\
            if (mssg.getText() == "It is X's turn.") {
                letter = "X";
                turn   = "It is O's turn.";
            } else {
                letter = "O";
                turn   = "It is X's turn.";
            }
            
            //....Placing Characters....\\
            if (evt.getSource() == butA) {
                butA.setText(letter);
                mssg.setText(turn);
                butA1 = butA;
                butA  = butSame;
            } else if (evt.getSource() == butB) {
                butB.setText(letter);
                mssg.setText(turn);
                butB1 = butB;
                butB  = butSame;
            } else if (evt.getSource() == butC) {
                butC.setText(letter);
                mssg.setText(turn);
                butC1 = butC;
                butC  = butSame;
            } else if (evt.getSource() == butD) {
                butD.setText(letter);
                mssg.setText(turn);
                butD1 = butD;
                butD  = butSame;
            } else if (evt.getSource() == butE) {
                butE.setText(letter);
                mssg.setText(turn);
                butE1 = butE;
                butE  = butSame;
            } else if (evt.getSource() == butF) {
                butF.setText(letter);
                mssg.setText(turn);
                butF1 = butF;
                butF  = butSame;
            } else if (evt.getSource() == butG) {
                butG.setText(letter);
                mssg.setText(turn);
                butG1 = butG;
                butG  = butSame;
            } else if (evt.getSource() == butH) {
                butH.setText(letter);
                mssg.setText(turn);
                butH1 = butH;
                butH  = butSame;
            } else if (evt.getSource() == butI) {
                butI.setText(letter);
                mssg.setText(turn);
                butI1 = butI;
                butI = butSame;
            }
            //....Ref....\\

            
            //....Winner....\\
            if ((butA1.getText() == (turn) && butB1.getText() == (turn) && butC1.getText() == (turn)) ||
                (butA1.getText() == (turn) && butE1.getText() == (turn) && butI1.getText() == (turn)) ||
                (butA1.getText() == (turn) && butD1.getText() == (turn) && butG1.getText() == (turn)) ||
                (butB1.getText() == (turn) && butE1.getText() == (turn) && butH1.getText() == (turn)) ||
                (butC1.getText() == (turn) && butF1.getText() == (turn) && butI1.getText() == (turn)) ||
                (butC1.getText() == (turn) && butE1.getText() == (turn) && butG1.getText() == (turn)) ||
                (butD1.getText() == (turn) && butE1.getText() == (turn) && butF1.getText() == (turn)) ||
                (butG1.getText() == (turn) && butH1.getText() == (turn) && butI1.getText() == (turn))) {
                 mssg.setText(turn + " Wins!");
                 butA = butSame;
                 butB = butSame;
                 butC = butSame;
                 butD = butSame;
                 butE = butSame;
                 butF = butSame;
                 butG = butSame;
                 butH = butSame;
                 butI = butSame;
            } else if ((butA1.getText() == (letter) && butB1.getText() == (letter) && butC1.getText() == (letter)) ||
                (butA1.getText() == (letter) && butE1.getText() == (letter) && butI1.getText() == (letter)) ||
                (butA1.getText() == (letter) && butD1.getText() == (letter) && butG1.getText() == (letter)) ||
                (butB1.getText() == (letter) && butE1.getText() == (letter) && butH1.getText() == (letter)) ||
                (butC1.getText() == (letter) && butF1.getText() == (letter) && butI1.getText() == (letter)) ||
                (butC1.getText() == (letter) && butE1.getText() == (letter) && butG1.getText() == (letter)) ||
                (butD1.getText() == (letter) && butE1.getText() == (letter) && butF1.getText() == (letter)) ||
                (butG1.getText() == (letter) && butH1.getText() == (letter) && butI1.getText() == (letter))) {
                 mssg.setText(letter + " Wins!");
                 butA = butSame;
                 butB = butSame;
                 butC = butSame;
                 butD = butSame;
                 butE = butSame;
                 butF = butSame;
                 butG = butSame;
                 butH = butSame;
                 butI = butSame;
            } else if ((butA1.getText() == ("X") || butA1.getText() == ("O")) &&
                (butB1.getText() == ("X") || butB1.getText() == ("O")) &&
                (butC1.getText() == ("X") || butC1.getText() == ("O")) &&
                (butD1.getText() == ("X") || butD1.getText() == ("O")) &&
                (butE1.getText() == ("X") || butE1.getText() == ("O")) &&
                (butF1.getText() == ("X") || butF1.getText() == ("O")) &&
                (butG1.getText() == ("X") || butG1.getText() == ("O")) &&
                (butH1.getText() == ("X") || butH1.getText() == ("O")) &&
                (butI1.getText() == ("X") || butI1.getText() == ("O"))){
                 mssg.setText("It's a tie!");
            }

        }
    }
          public static void main(String[] args) {
       //....Font....\\
       Font t = new Font("Courier",Font.BOLD,48);
       Font d = new Font("Courier",Font.BOLD,24);
       Font o = new Font("Courier",Font.BOLD,48);
       butA.setFont(t);
       butB.setFont(t);
       butC.setFont(t);
       butD.setFont(t);
       butE.setFont(t);
       butF.setFont(t);
       butG.setFont(t);
       butH.setFont(t);
       butI.setFont(t);
       butX.setFont(t);
       or.setFont(o);
       butO.setFont(t);
       butEasy.setFont(d);
       butHard.setFont(d);
       butHvH.setFont(d);
    
       //....Listener....\\
       ButtonHandler listener = new ButtonHandler();
       butA.addActionListener(listener);
       butB.addActionListener(listener);
       butC.addActionListener(listener);
       butD.addActionListener(listener);
       butE.addActionListener(listener);
       butF.addActionListener(listener);
       butG.addActionListener(listener);
       butH.addActionListener(listener);
       butI.addActionListener(listener);
       butX.addActionListener(listener);
       butO.addActionListener(listener);
       butEasy.addActionListener(listener);
       butHvH.addActionListener(listener);
       butHard.addActionListener(listener);

       //....Layout....\\
       main.setLayout(new GridLayout(4,1));
       
       //....message....\\
       message.add(mssg);
     
       //....main....\\
       main.add(butEasy);
       main.add(butHard);
       main.add(butHvH);
       main.add(message);

       //....Window....\\
       JFrame window  = new JFrame("Tic-Tac-Toe");
       window.setContentPane(main);
       window.setSize(375,500);
       window.setLocation(100,100);
       window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
       window.setVisible(true);
    }
    public static void characterSelection() {
        //....Remove....\\
        main.remove(butEasy);
        main.remove(butHard);
        main.remove(butHvH);
        main.remove(message); //This must be removed, then added again so it will remain on the bottom
        
        //....Add....\\
        main.add(butX);
        main.add(or);
        main.add(butO);
        main.add(message);
        mssg.setText("Please choose a character.");  
    }
    public static void ticTacToeSetup(JLabel or) {    
        //....Remove....\\
        main.remove(butX);
        main.remove(butO);
        main.remove(or);
        main.remove(message);
        
        //....Layout....\\
        main.setLayout(new GridLayout(4,4));
        
        //....Add....\\
        main.add(butA);
        main.add(butB);
        main.add(butC);
        main.add(butD);
        main.add(butE);
        main.add(butF);
        main.add(butG);
        main.add(butH);
        main.add(butI);
        main.add(message);
    }
}