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!