package GUI;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TresRaya extends JFrame implements MouseListener 
{
    private int contador = 0;
    private boolean activo = true;
    // Se declara e inicializa el array de botones.
    //(En esteo caso 9 botones)
    JButton[] botones = new JButton[9];
    
    //Se crean las etiquetas para mostrar en la GUI.
    JLabel mensaje = new JLabel("Turno del jugador 1");
    
    //Se declara e inicializa el botón de nueva partida.
    JButton boton = new JButton("Nueva Partida");
    
    //Se declaran e inicializan los paneles.
    JPanel panelsuperior = new JPanel();
    JPanel panelinferior = new JPanel();
    
    //Se declaran e inicializan los botones.
    JButton boton11 = new JButton();
    JButton boton12 = new JButton();
    JButton boton13 = new JButton();
    JButton boton21 = new JButton();
    JButton boton22 = new JButton();
    JButton boton23 = new JButton();
    JButton boton31 = new JButton();
    JButton boton32 = new JButton();
    JButton boton33 = new JButton();

    //--------------------------------------------------------------------------------------- 
    
    public int comprobar() 
    {
        if ((boton11.getText().equals("X") && boton12.getText().equals("X") && boton13.getText().equals("X"))
                || (boton21.getText().equals("X") && boton22.getText().equals("X") && boton23.getText().equals("X"))
                || (boton31.getText().equals("X") && boton32.getText().equals("X") && boton33.getText().equals("X"))
                || (boton11.getText().equals("X") && boton21.getText().equals("X") && boton31.getText().equals("X"))
                || (boton12.getText().equals("X") && boton22.getText().equals("X") && boton32.getText().equals("X"))
                || (boton13.getText().equals("X") && boton23.getText().equals("X") && boton33.getText().equals("X"))
                || (boton11.getText().equals("X") && boton22.getText().equals("X") && boton33.getText().equals("X"))
                || (boton13.getText().equals("X") && boton22.getText().equals("X") && boton31.getText().equals("X"))) {

            return 1;
        } 
        else if ((boton11.getText().equals("O") && boton12.getText().equals("O") && boton13.getText().equals("O"))
                || (boton21.getText().equals("O") && boton22.getText().equals("O") && boton23.getText().equals("O"))
                || (boton31.getText().equals("O") && boton32.getText().equals("O") && boton33.getText().equals("O"))
                || (boton11.getText().equals("O") && boton21.getText().equals("O") && boton31.getText().equals("O"))
                || (boton12.getText().equals("O") && boton22.getText().equals("O") && boton32.getText().equals("O"))
                || (boton13.getText().equals("O") && boton23.getText().equals("O") && boton33.getText().equals("O"))
                || (boton11.getText().equals("O") && boton22.getText().equals("O") && boton33.getText().equals("O"))
                || (boton13.getText().equals("O") && boton22.getText().equals("O") && boton31.getText().equals("O"))) 
        {
            return 2;
        } 
        else 
        {
            return 0;
        }
    }

    //--------------------------------------------------------------------------------------- 
    //Se crea y utiliza una función.
    TresRaya() 
    {

        //Para poder añadir [PANELES, BOTONES, ETIQUETAS...] es necesario un panel de base.
        
        //Se está obteniendo el panel base.
        
        //Se utiliza this, porque se hereda de JFRAME
        
        //Método generado en JFRAME this.getContentPane()
        //Puesto que estamos heredando podemos utilizar.
        Container panelBase = this.getContentPane();
        
        //Se define el tamaño del JFRAME
        this.setBounds(250, 50, 450, 600); 
        //Se define el título del JFRAME.
        this.setTitle("Juego de las tres en raya (*)");
        //Se define la imagen de icono de JFRAME.
        this.setIconImage(new ImageIcon("C:\\Users\\Diurno\\Desktop\\tres.png").getImage());

        mensaje.setFont(new Font("Comic Sans MS", Font.BOLD, 40));
        mensaje.setHorizontalAlignment(JLabel.CENTER);

        boton.setFont(new Font("Comic Sans MS", Font.BOLD, 40));
        boton.setHorizontalAlignment(JLabel.CENTER);
        boton.setForeground(Color.BLUE);
        boton.setEnabled(false);

        panelsuperior.setLayout(new GridLayout(2, 1)); 
        panelsuperior.setBackground(Color.GREEN);

        //Se añade al panel MENSAJE  y BOTÓN
        panelsuperior.add(mensaje);
        panelsuperior.add(boton);
        
        //Se añade una acción al botón [VER DESPUÉS]
        boton.addMouseListener(this);


        //Asignamos cada botón al array 
        botones[0] = boton11;
        botones[1] = boton12;
        botones[2] = boton13;
        botones[3] = boton21;
        botones[4] = boton22;
        botones[5] = boton23;
        botones[6] = boton31;
        botones[7] = boton32;
        botones[8] = boton33;

        //Se recorre cada botón
        for (JButton b : botones) 
        {
            b.setFont(new Font("Comic Sans MS", Font.BOLD, 40));
            b.setHorizontalAlignment(JLabel.CENTER);
            b.setForeground(Color.RED);

            b.addMouseListener(this);
            
            panelinferior.add(b);

        }

        panelinferior.setLayout(new GridLayout(3, 3));

        /*panelinferior.add(boton11);
        panelinferior.add(boton12);
        panelinferior.add(boton13);
        panelinferior.add(boton21);
        panelinferior.add(boton22);
        panelinferior.add(boton23);
        panelinferior.add(boton31);
        panelinferior.add(boton32);
        panelinferior.add(boton33);*/

        
        //Se añade visibilidad con todos los paneles que estamos trabajando.
        panelsuperior.setVisible(true);
        panelinferior.setVisible(true);

        //panelBase.setLayout(new GridLayout(2, 1));
        
        panelBase.setLayout(new GridLayout(2, 1));
        panelBase.add(panelsuperior);
        panelBase.add(panelinferior);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    //----------------------------------------------------------------------------
    
    public static void main(String[] args) 
    {
        TresRaya base = new TresRaya();
    }

    //-----------------------------------------------------------------------
    
    @Override
    public void mouseClicked(MouseEvent e) 
    {
        if (((JButton) e.getSource()).getText().equals("") && activo) 
        {
            if (contador % 2 == 0) 
            {
                ((JButton) e.getSource()).setText("O");
                mensaje.setText("Turno del jugador 2");
                panelsuperior.setBackground(Color.YELLOW);
            } 
            else 
            {
                ((JButton) e.getSource()).setText("X");
                mensaje.setText("Turno del jugador 1");
                panelsuperior.setBackground(Color.GREEN);
            }
     
            //---------------------------------------------------------
            
            // BASICAMENTE ES SOLO SE USA PARA VER QUIEN GANA, PIERDE O EMPATA.
            if (comprobar() == 1) 
            {
                mensaje.setText("Vence JUGADOR1");
                activo = false;
                boton.setEnabled(true);
            }
            if (comprobar() == 2) 
            {
                mensaje.setText("Vence JUGADOR2");
                activo = false;
                boton.setEnabled(true);
            }
            if (comprobar() != 1 && comprobar()!=2 && contador == 8) 
            {
                mensaje.setText("EMPATE!!!");
                activo = false;
                boton.setEnabled(true);
            }
            contador++;
        }

        if (((JButton) e.getSource()) == boton) 
        {
            contador = 0;
            activo = true;
            mensaje.setText("Turno del jugador 1");
            boton.setEnabled(false);

            for (JButton b : botones) 
            {
                b.setText("");
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) 
    {
    }

    @Override
    public void mouseReleased(MouseEvent e) 
    {
    }

    @Override
    public void mouseEntered(MouseEvent e) 
    {
    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
    }
    
    //------------------------------------------------------------------------- 
} 

// AQUI ESTA EL CODIGO CON LOS COMENTARIOS.

/*
package GUI;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TresRaya extends JFrame implements MouseListener {

    // Contador de turnos (sirve para saber si juega X u O)
    private int contador = 0;

    // Controla si la partida sigue activa
    private boolean activo = true;

    // Array para manejar los 9 botones del tablero
    JButton[] botones = new JButton[9];

    // Mensaje superior que indica el turno o el resultado
    JLabel mensaje = new JLabel("Turno del jugador 1");

    // Botón para reiniciar la partida
    JButton boton = new JButton("Nueva Partida");

    // Paneles para organizar la interfaz
    JPanel panelsuperior = new JPanel();
    JPanel panelinferior = new JPanel();

    // Botones individuales del tablero (3x3)
    JButton boton11 = new JButton();
    JButton boton12 = new JButton();
    JButton boton13 = new JButton();
    JButton boton21 = new JButton();
    JButton boton22 = new JButton();
    JButton boton23 = new JButton();
    JButton boton31 = new JButton();
    JButton boton32 = new JButton();
    JButton boton33 = new JButton();

    //---------------------------------------------------------------------------------------
    // Método que comprueba si hay un ganador
    // Devuelve:
    // 1 → gana X
    // 2 → gana O
    // 0 → nadie ha ganado aún
    public int comprobar() {

        // Combinaciones ganadoras para X
        if ((boton11.getText().equals("X") && boton12.getText().equals("X") && boton13.getText().equals("X"))
                || (boton21.getText().equals("X") && boton22.getText().equals("X") && boton23.getText().equals("X"))
                || (boton31.getText().equals("X") && boton32.getText().equals("X") && boton33.getText().equals("X"))
                || (boton11.getText().equals("X") && boton21.getText().equals("X") && boton31.getText().equals("X"))
                || (boton12.getText().equals("X") && boton22.getText().equals("X") && boton32.getText().equals("X"))
                || (boton13.getText().equals("X") && boton23.getText().equals("X") && boton33.getText().equals("X"))
                || (boton11.getText().equals("X") && boton22.getText().equals("X") && boton33.getText().equals("X"))
                || (boton13.getText().equals("X") && boton22.getText().equals("X") && boton31.getText().equals("X"))) {

            return 1;

        // Combinaciones ganadoras para O
        } else if ((boton11.getText().equals("O") && boton12.getText().equals("O") && boton13.getText().equals("O"))
                || (boton21.getText().equals("O") && boton22.getText().equals("O") && boton23.getText().equals("O"))
                || (boton31.getText().equals("O") && boton32.getText().equals("O") && boton33.getText().equals("O"))
                || (boton11.getText().equals("O") && boton21.getText().equals("O") && boton31.getText().equals("O"))
                || (boton12.getText().equals("O") && boton22.getText().equals("O") && boton32.getText().equals("O"))
                || (boton13.getText().equals("O") && boton23.getText().equals("O") && boton33.getText().equals("O"))
                || (boton11.getText().equals("O") && boton22.getText().equals("O") && boton33.getText().equals("O"))
                || (boton13.getText().equals("O") && boton22.getText().equals("O") && boton31.getText().equals("O"))) {

            return 2;

        } else {
            return 0;
        }
    }

    //---------------------------------------------------------------------------------------
    // Constructor: aquí se crea toda la interfaz del juego
    TresEnRaya() {

        Container panelBase = this.getContentPane();

        // Configuración de la ventana
        this.setBounds(250, 250, 450, 600);
        this.setTitle("Juego de las tres en raya");
        this.setIconImage(new ImageIcon("C:\\Users\\Diurno\\Desktop\\tres.png").getImage());

        // Configuración del mensaje superior
        mensaje.setFont(new Font("Comic Sans MS", Font.BOLD, 40));
        mensaje.setHorizontalAlignment(JLabel.CENTER);

        // Configuración del botón de nueva partida
        boton.setFont(new Font("Comic Sans MS", Font.BOLD, 40));
        boton.setHorizontalAlignment(JLabel.CENTER);
        boton.setForeground(Color.BLUE);
        boton.setEnabled(false); // Solo se activa cuando termina la partida

        // Panel superior con mensaje y botón
        panelsuperior.setLayout(new GridLayout(2, 1));
        panelsuperior.setBackground(Color.GREEN);
        panelsuperior.add(mensaje);
        panelsuperior.add(boton);
        boton.addMouseListener(this);

        // Guardamos los botones en un array para manejarlos más fácilmente
        botones[0] = boton11;
        botones[1] = boton12;
        botones[2] = boton13;
        botones[3] = boton21;
        botones[4] = boton22;
        botones[5] = boton23;
        botones[6] = boton31;
        botones[7] = boton32;
        botones[8] = boton33;

        // Configuración de cada botón del tablero
        for (JButton b : botones) {
            b.setFont(new Font("Comic Sans MS", Font.BOLD, 40));
            b.setHorizontalAlignment(JLabel.CENTER);
            b.setForeground(Color.RED);
            b.addMouseListener(this); // Detecta clics
        }

        // Panel inferior con el tablero 3x3
        panelinferior.setLayout(new GridLayout(3, 3));
        panelinferior.add(boton11);
        panelinferior.add(boton12);
        panelinferior.add(boton13);
        panelinferior.add(boton21);
        panelinferior.add(boton22);
        panelinferior.add(boton23);
        panelinferior.add(boton31);
        panelinferior.add(boton32);
        panelinferior.add(boton33);

        // Añadimos los paneles a la ventana
        panelBase.setLayout(new GridLayout(2, 1));
        panelBase.add(panelsuperior);
        panelBase.add(panelinferior);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    //----------------------------------------------------------------------------

    public static void main(String[] args) {
        // Inicia el juego
        TresEnRaya base = new TresEnRaya();
    }

    //-----------------------------------------------------------------------
    @Override
    public void mouseClicked(MouseEvent e) {

        // Si se hace clic en un botón vacío y la partida sigue activa
        if (((JButton) e.getSource()).getText().equals("") && activo) {

            // Turno del jugador según el contador
            if (contador % 2 == 0) {
                ((JButton) e.getSource()).setText("O");
                mensaje.setText("Turno del jugador 2");
                panelsuperior.setBackground(Color.YELLOW);
            } else {
                ((JButton) e.getSource()).setText("X");
                mensaje.setText("Turno del jugador 1");
                panelsuperior.setBackground(Color.GREEN);
            }

            // Comprobación de ganador o empate
            if (comprobar() == 1) {
                mensaje.setText("Vence JUGADOR1");
                activo = false;
                boton.setEnabled(true);
            }
            if (comprobar() == 2) {
                mensaje.setText("Vence JUGADOR2");
                activo = false;
                boton.setEnabled(true);
            }
            if (comprobar() == 0 && contador == 8) {
                mensaje.setText("EMPATE!!!");
                activo = false;
                boton.setEnabled(true);
            }

            contador++;
        }

        // Si se hace clic en el botón de nueva partida
        if (((JButton) e.getSource()) == boton) {

            contador = 0;
            activo = true;
            mensaje.setText("Turno del jugador 1");
            boton.setEnabled(false);

            // Limpia el tablero
            for (JButton b : botones) {
                b.setText("");
            }
        }
    }

    @Override public void mousePressed(MouseEvent e) {}
    @Override public void mouseReleased(MouseEvent e) {}
    @Override public void mouseEntered(MouseEvent e) {}
    @Override public void mouseExited(MouseEvent e) {}

    //-------------------------------------------------------------------------
}*/