Juego del ahorcado

Jugo del ahorcado en Java.

Descargar código fuente y .jar ejecutable


Ahorcado.java

package ahorcado;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

/**
 * 
 * @author Horacio Bono
 */
public class Ahorcado extends JFrame {
    private static final long serialVersionUID = 1L;
    final AreaDibujo areaDibujo;
    final JTextField txtPalabra;
    final JTextField txtNombre;
    final JButton btnNuevaPalabra;
    final JButton btnNombre;
    final JLabel[] letras;

    String nombre;
    String palabraSecreta;
    String palabraOculta;
    
    Ahorcado() {
        super("Ahorcado");

        setBounds(100, 100, 800, 650);
        JPanel contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        areaDibujo = new AreaDibujo();
        areaDibujo.setBounds(276, 60, 450, 450);
        contentPane.add(areaDibujo);
        
        txtPalabra = new JTextField();
        txtPalabra.setFont(new Font("Tahoma", Font.BOLD, 26));
        txtPalabra.setEditable(false);
        txtPalabra.setBounds(276, 510, 450, 50);
        txtPalabra.setHorizontalAlignment(JLabel.CENTER);
        contentPane.add(txtPalabra);
        txtPalabra.setColumns(50);
        
        txtNombre = new JTextField();
        txtNombre.setFont(new Font("Tahoma", Font.BOLD, 16));
        txtNombre.setHorizontalAlignment(SwingConstants.CENTER);
        txtNombre.setEditable(false);
        txtNombre.setBounds(360, 23, 366, 26);
        contentPane.add(txtNombre);
        txtNombre.setColumns(10);
        
        nombre = "ALGUIEN";
        txtNombre.setText(nombre);
        
        btnNombre = new JButton("Nombre");
        btnNombre.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                ingresarNombre();
            }
        });
        btnNombre.setHorizontalAlignment(SwingConstants.CENTER);
        btnNombre.setFont(new Font("Tahoma", Font.PLAIN, 11));
        btnNombre.setBounds(276, 23, 74, 23);
        contentPane.add(btnNombre);

        // Agrega un MouseListener a los JLabel de las letras
        // para que respondan a un clic
        MouseListener clicLetra = new MouseListener() {
            @Override
            public void mousePressed(MouseEvent e) { }

            @Override
            public void mouseExited(MouseEvent e) { }

            @Override
            public void mouseEntered(MouseEvent e) { }

            @Override
            public void mouseReleased(MouseEvent e) { }

            @Override
            public void mouseClicked(MouseEvent e) { 
                JLabel l = (JLabel)e.getSource();
                if(l.getBackground() == Color.YELLOW) {
                    l.setBackground(Color.ORANGE);
                        // Recupera el único carácter del JLabel
                    char letra = l.getText().charAt(0);
                    if(!evaluarLetra(letra)) {
                        areaDibujo.colgar();
                    }
                    // Muestra la palabra oculta
                    mostrarPalabra();
                    
                    if(palabraOculta.equals(palabraSecreta)) {
                        JOptionPane.showMessageDialog(null, 
                            "¡Felicitaciones, " + nombre + 
                            ", ganaste!", "Ahorcado",
                            JOptionPane.INFORMATION_MESSAGE);
                        iniciar();
                    } else if(areaDibujo.getPartes() == 6) {
                        JOptionPane.showMessageDialog(null, 
                            "¡Lo lamento, " + nombre + 
                            ", perdiste!\nLa palabra era " +
                            palabraSecreta, "Ahorcado",
                            JOptionPane.ERROR_MESSAGE);
                        iniciar();
                    }
                }
            }
        };
        
        letras = new JLabel[27];
        JPanel panelLetras = new JPanel();
        panelLetras.setBounds(75, 60, 90, 270);
        contentPane.add(panelLetras);
        panelLetras.setLayout(new GridLayout(9, 3, 3, 3));
        
        btnNuevaPalabra = new JButton("Elegir palabra");
        btnNuevaPalabra.setActionCommand("");
        btnNuevaPalabra.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ingresarPalabra();
            }
        });
        btnNuevaPalabra.setBounds(55, 23, 134, 23);
        btnNuevaPalabra.setEnabled(true);
        contentPane.add(btnNuevaPalabra);
        
        int i = 0;
        // Letras de 'A' hasta 'N'
        while(i < 14) {
            letras[i] = new JLabel("" + (char)('A' + i)); 
            i++;
        }
        
        // Letra 'Ñ'
        letras[i++] = new JLabel("" + 'Ñ');;

        // Letras de 'O' hasta 'Z'
        while(i < 27) {
            letras[i] = new JLabel("" + (char)('@' + i));;
            i++;
        }
        
        for(JLabel l : letras) {
            l.setHorizontalAlignment(JLabel.CENTER);
            l.setOpaque(true);
            l.addMouseListener(clicLetra);
            panelLetras.add(l);
        }
        
        iniciar();
    }
    
    void ingresarNombre() {
        // Pide el nombre del jugador 
        String n = JOptionPane.showInputDialog(null, 
        "Ingresá tu nombre", 
            "Ahorcado", JOptionPane.PLAIN_MESSAGE);
        
        if(n == null || n.equals("")) {
            nombre = "ALGUIEN";
        } else {
            nombre = n.toUpperCase();
        }
        
        // Muestra el nombre del jugador 
        txtNombre.setText(nombre);
    }
    
    void ingresarPalabra() {
        // Pide la palabra secreta 
        String palabra = JOptionPane.showInputDialog(null, 
            "Ingresá la palabra secreta para " + nombre + 
            "\n(sin espacios ni tildes)", 
            "Ahorcado", JOptionPane.PLAIN_MESSAGE);
        
        if(palabra == null || palabra.equals("")) {
            palabraSecreta = "";
        } else {
            // Pone la palabra en mayúsculas 
            palabraSecreta = palabra.toUpperCase();
            // Oculta la palabra con guiones 
            ocultarPalabra();
            // Inicia el juego
            jugar();
        }
    }
    
    void mostrarPalabra() {
        String str = "";

        for(char c : palabraOculta.toCharArray()) {
            str += " " + c;
        }

        txtPalabra.setText(str);
    }
    
    void ocultarPalabra() {
        int tam = palabraSecreta.length();
        String str = "_";
        
        while(--tam > 0) {
            str += '_';
        }
        
        palabraOculta = str;
    }
    
    boolean evaluarLetra(char l) {
        char[] secreta = palabraSecreta.toCharArray();
        char[] oculta = palabraOculta.toCharArray();
        boolean existe = false;

        for(int i = 0; i < secreta.length; i++) {
            if(secreta[i] == l) {
                oculta[i] = l; 
                existe = true;
            }
        }
        
        palabraOculta = new String(oculta);
        
        return existe;
    }
    
    void jugar() {
        for(JLabel l : letras) {
            l.setBackground(Color.YELLOW);
        }

        // Muestra la palabra oculta
        mostrarPalabra();
        btnNombre.setEnabled(false);
        btnNuevaPalabra.setEnabled(false);
        
    }
    
    void iniciar() {
        for(JLabel l : letras) {
            l.setBackground(Color.LIGHT_GRAY);
        }

        areaDibujo.iniciar();
        txtPalabra.setText("");
        btnNombre.setEnabled(true);
        btnNuevaPalabra.setEnabled(true);
    }

    public static void main(String[] args) {
        new Ahorcado().setVisible(true);
    }
}

AreaDibujo.java

package ahorcado;

import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;

/**
 * 
 * @author Horacio Bono

*/
public class AreaDibujo extends JPanel {
    private static final long serialVersionUID = 1L;
    private int partes;

    /**
     * Create the panel.
     */
    public AreaDibujo() {
        setBackground(Color.WHITE);
        setLayout(null);
        iniciar();
    }
    
    @Override
    public void paintComponent(Graphics g) { 
        super.paintComponent(g);
        new DibujoAhorcado(g, getSize(), partes);
    }
    
    public void iniciar() {
        partes = 0;
        repaint();
    }
    
    public void colgar() {
        partes++;
        repaint();
    }
    
    public int getPartes() {
        return partes;
    }
}

DibujoAhorcado.java

package ahorcado;

import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;

/**
 * 
 * @author Horacio Bono
 */
public class DibujoAhorcado {
    
    Dimension size;

    public DibujoAhorcado(Graphics g, Dimension dim, int partes) {
        this.size = dim;
        
        String jpg = "Arbol450.jpg";
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File(jpg));
            g.drawImage(img, 0, 0, null);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null,    
            "El archivo de imagen '" + jpg + "' no se encuentra");
        }

        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, 
            BasicStroke.JOIN_ROUND));
        
        int ejeX = (int)(dim.width * .6);
        int rama = (int)(dim.height * .44);
        int y = (int)(dim.height * .47);
        int h = (int)(dim.height * .15);
        int h2 = h >> 1;
        int h4 = h >> 2;

        if(partes >= 0) {
            // 0. Cuerda
            g2d.drawLine(ejeX, rama, ejeX, y);
            g2d.drawLine(ejeX, y, ejeX, y+h2);
        }
        
        if(partes > 0) {
            // 1. Cabeza
            g2d.drawOval(ejeX-h4, y+h2, h2, h2);
        }
        
        if(partes > 1) {
            // 2. Cuerpo
            y += h;
            g2d.drawLine(ejeX, y, ejeX, y+h);
        }
        
        if(partes > 2) {
            // 3. Brazo izquierdo
            g2d.drawLine(ejeX, y, ejeX-h2, y+h);
        }
        
        if(partes > 3) {
            // 4. Brazo derecho
            g2d.drawLine(ejeX, y, ejeX+h2, y+h);
        }
        
        if(partes > 4) {
            // 5. Pierna izquierda
            y += h;
            g2d.drawLine(ejeX, y, ejeX-h2, y+h);
        }
        
        if(partes > 5) {
            // 6. Pierna derecha
            g2d.drawLine(ejeX, y, ejeX+h2, y+h);
        }
        
        g2d.dispose();
    }

}


Comentarios

Entradas populares de este blog

Fractales

Vida

Permutaciones, combinaciones, variaciones y particiones