• +34 685 967 885
  • +34 695 898 191
  • antgarprats@gmail.com
  • Antonio García Prats

tres en raya programada en java

Tres en raya programado en java

Tic Tac Toe (Tres en Raya) es un juego sencillo y popular que ha existido durante siglos. Su origen se remonta a la época romana, conocido como el juego «Terni Lapilli». En su forma moderna, se juega en una cuadrícula de 3×3, y el objetivo es alinear tres símbolos iguales (ya sea ‘X’ o ‘O’) en fila, columna o diagonal. Mi objetivo en mostraros como hacer el tres en raya programado en java.

Reglas del juego

-Se juega en un tablero de 3×3.

-Dos jugadores se turnan para colocar su símbolo (X u O) en un cuadro vacío.

-Gana el primer jugador que alinee tres de sus símbolos horizontal, vertical o diagonalmente.

-Si el tablero se llena y ningún jugador ha ganado, se declara un empate.

Codigo fuente del juego tres en raya programado en java

Voy a proporcionar el código fuente completo y luego explicaré cada parte.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TicTacToe extends JFrame {
    private JButton[][] buttons = new JButton[3][3]; // Matriz para los botones del tablero
    private boolean xTurn = true; // Indica si es el turno de 'X'

    public TicTacToe() {
        setTitle("Tic Tac Toe"); // Título de la ventana
        setSize(400, 400); // Tamaño de la ventana
        setDefaultCloseOperation(EXIT_ON_CLOSE); // Cierra la aplicación al cerrar la ventana
        setLayout(new GridLayout(3, 3)); // Diseño de la cuadrícula 3x3

        // Crear los botones del tablero
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                buttons[i][j] = new JButton();
                buttons[i][j].setFont(new Font("Arial", Font.BOLD, 60)); // Fuente grande para los símbolos
                buttons[i][j].setFocusPainted(false); // Quitar el borde de enfoque
                buttons[i][j].addActionListener(new ButtonClickListener(i, j)); // Agregar listener a cada botón
                add(buttons[i][j]); // Agregar botón a la ventana
            }
        }
    }

    private class ButtonClickListener implements ActionListener {
        private int row, col; // Posición del botón en la cuadrícula

        public ButtonClickListener(int row, int col) {
            this.row = row;
            this.col = col;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // Si el botón ya tiene un símbolo, no hacer nada
            if (!buttons[row][col].getText().isEmpty()) {
                return;
            }

            // Establecer el símbolo según el turno
            if (xTurn) {
                buttons[row][col].setText("X");
            } else {
                buttons[row][col].setText("O");
            }

            // Cambiar el turno
            xTurn = !xTurn;

            // Verificar si hay un ganador o empate
            if (checkWinner()) {
                JOptionPane.showMessageDialog(null, "¡Ganador: " + (xTurn ? "O" : "X") + "!");
                resetBoard();
            } else if (isBoardFull()) {
                JOptionPane.showMessageDialog(null, "¡Empate!");
                resetBoard();
            }
        }

        private boolean checkWinner() {
            // Verificar filas, columnas y diagonales
            return checkRow(row) || checkCol(col) || checkDiagonals();
        }

        private boolean checkRow(int row) {
            return buttons[row][0].getText().equals(buttons[row][1].getText()) &&
                   buttons[row][0].getText().equals(buttons[row][2].getText()) &&
                   !buttons[row][0].getText().isEmpty();
        }

        private boolean checkCol(int col) {
            return buttons[0][col].getText().equals(buttons[1][col].getText()) &&
                   buttons[0][col].getText().equals(buttons[2][col].getText()) &&
                   !buttons[0][col].getText().isEmpty();
        }

        private boolean checkDiagonals() {
            return (buttons[0][0].getText().equals(buttons[1][1].getText()) &&
                    buttons[0][0].getText().equals(buttons[2][2].getText()) &&
                    !buttons[0][0].getText().isEmpty()) ||
                   (buttons[0][2].getText().equals(buttons[1][1].getText()) &&
                    buttons[0][2].getText().equals(buttons[2][0].getText()) &&
                    !buttons[0][2].getText().isEmpty());
        }

        private boolean isBoardFull() {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (buttons[i][j].getText().isEmpty()) {
                        return false;
                    }
                }
            }
            return true;
        }

        private void resetBoard() {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    buttons[i][j].setText("");
                }
            }
            xTurn = true; // Reiniciar el turno a 'X'
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            TicTacToe game = new TicTacToe();
            game.setVisible(true); // Hacer visible la ventana
        });
    }
}

Explicación del código tres en raya programado en java

Importación de librerías:

javax.swing.*: Para crear la interfaz gráfica con botones y ventanas.

java.awt.*: Para diseños y fuentes.

java.awt.event.*: Para manejar eventos como clics en botones.

Clase principal TicTacToe:

-Extiende JFrame, lo que convierte a la clase en una ventana gráfica.

Atributos principales:

buttons: Matriz de botones para representar el tablero.

xTurn: Variable booleana que indica si es el turno de ‘X’.

Constructor TicTacToe:

-Configura el título, tamaño y diseño de la ventana.

-Crea los botones y les asigna una fuente grande y un listener para manejar los clics.

Clase interna ButtonClickListener:

-Maneja los eventos de clic en cada botón.

-Verifica si el botón está vacío antes de colocar el símbolo.

-Alterna el turno y verifica si alguien ha ganado o si hay empate.

Métodos para verificar el ganador:

checkRow, checkCol, checkDiagonals: Comprueban si hay tres símbolos iguales en fila, columna o diagonal.

isBoardFull: Comprueba si el tablero está lleno.

Método resetBoard:

-Limpia el tablero para empezar un nuevo juego.

Método main:

Lanza la interfaz gráfica utilizando SwingUtilities.invokeLater para garantizar que el hilo de la interfaz gráfica se maneje correctamente.

Ejecución en Eclipse

Crea un nuevo proyecto Java en Eclipse.

1.Agrega una clase con el nombre TicTacToe.

2.Copia y pega el código completo.

3.Ejecuta el programa como una aplicación Java. Verás una ventana emergente con el tablero del juego.

Os invito a descargaros el código en java desde mi perfil de github. ¡Disfruta de tu juego Tic Tac Toe con interfaz gráfica!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *