Páginas

NIMADRES

Juego del Ahorcado en Java

El ahorcado (también llamado colgado) es un juego de lápiz y papel, en el que el objetivo es adivinar una palabra o frase.
A estas Alturas quiero suponer que muchos ya saben como es que funciona este juego, muchas veces como ayuda suele darse el tema al cual pertenece la palabra, en este caso no sera así. 
Esta vez lo que hice fue un Ahorcado poco convencional referente al juego, en el cual la diferencia es que no se muestra el dibujo que va apareciendo por partes y al final se ahorca. Se me ocurrió la idea de simular el juego de Mortal Kombat haciendo que dos personajes muy conocidos se peleen entre si con imágenes gif.





Estas son Algunas de las imágenes que se pueden apreciar, también tiene la opción de agregar sonido pero eso es solo si el jugador lo desea, sino simplemente se puede jugar en silencio, ademas si se desea agregar varios sonidos como los golpes o fatalityes ya esta una función genérica en la cual la puedes mandar llamar cuando quieras indicando el nombre del archivo (incluir la ruta en caso de que el archivo de sonido no se encuentre en la misma carpeta), pues ya solo falta el código fuente que se puede compilar desde consola.

import java.awt.*;
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Ahorcado extends JFrame implements ActionListener,KeyListener {
    private Toolkit kit = Toolkit.getDefaultToolkit();
    private int contador = 0;
    public Image imagenFondo = kit.getImage("Imagen.jpg");
    public JLabel label = new JLabel();
    public JLabel labelLlenado;
    public JLabel Dibujo = new JLabel(new ImageIcon(getClass().
            getResource("scorpions1.gif")));
    public JLabel Dibujo2 = new JLabel(new ImageIcon(getClass().
            getResource("Liu_kang.gif")));
    public JLabel logo = new JLabel(new ImageIcon(getClass().
            getResource("logo.gif")));
    public JLabel titulo = new JLabel();
    public int X = 100;
    public int Y = 300;
    public int largo = 350;
    public int ancho = 100;
    public JMenuBar barra = new JMenuBar();
    public JMenu menu2 = new JMenu("Archivo");
    public JMenu menu = new JMenu("Categorias");
    public JMenu menuIformacion = new JMenu("Ver");
    public JMenuItem item[] = new JMenuItem[6];
    public String palabrasPeleadores[] = {"scorpions", "subzero","kano","sonya",
                                          "cage","rayden","cyrax","sector",
                                          "ermac","nightwolf","jax","borrachio",
                                          "boraicho","reptile","kunglao",
                                          "kitana","smoke","jade","kabal",
                                          "stryker"};
    public String palabrasBoss[] = {"goro", "shaokahn","shangtsung","kintaro",
                                    "sheeva", "baraka","motaro","shinnok",
                                    "quanchi","blaze","mileena","sindel"};
    String pantalla2;
    static String palabra_ = null ;
    char []palabras_display;
    char []palabra_actual;
    int randon;
    char dato;
    int error = 0;
    panel inicio = new panel("inicio.jpg");
    panel p = new panel("mortal.jpg"); 

    public Ahorcado() {
        initComponents();
        setBounds(150, 50, 800, 640);
        setTitle("NIMADRES");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false);
        repaint();
        setIconImage(getIconImage());
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(item[0])){
            Random rnd = new Random();
            palabra_=palabrasPeleadores[rnd.nextInt(palabrasPeleadores.length)];
            palabra_actual =  palabra_.toCharArray();
            palabras_display = new char[palabra_actual.length];
            for(int i = 0;i < palabras_display.length; i++){
                palabras_display[i] = '_';      
            }
            pantalla2 = String.valueOf(palabras_display);
            System.out.println(palabra_);
            labelLlenado.setText(pantalla2);
            menu.setEnabled(false);
        }
        if(e.getSource().equals(item[1])){
            Random rnd = new Random();
            palabra_ = palabrasBoss[rnd.nextInt(palabrasBoss.length)];
            palabra_actual =  palabra_.toCharArray();
            palabras_display = new char[palabra_actual.length];
            for(int i = 0;i < palabras_display.length; i++){
                palabras_display[i] = '_';      
            }
            pantalla2 = String.valueOf(palabras_display);
            System.out.println(palabra_);
            labelLlenado.setText(pantalla2);
            menu.setEnabled(false);
        }
        if(e.getSource().equals(item[2])){
            add(p);
            inicio.setVisible(false);
            labelLlenado.setText("");
            error = 0;
            menu.setEnabled(true);
            titulo.setIcon(null);
            titulo.setText("");
            Dibujo.setIcon(null);
            Dibujo2.setIcon(null);
        }
        if(e.getSource().equals(item[3])){
            if(contador == 0)
                playSound("audio.wav");
            contador++;
        }
        if(e.getSource().equals(item[4])){
                try {
                if (Desktop.isDesktopSupported()) {
                    Desktop desktop = Desktop.getDesktop();
                    if (desktop.isSupported(Desktop.Action.BROWSE)) {
                        desktop.browse(new 
                           URI("http://programacionparacoccidio.blogspot.mx"));
                    }
                }
            } catch (URISyntaxException uRISyntaxException) {
            } catch (IOException iOException) {
            }  
        }
        if(e.getSource().equals(item[5])){
            System.exit(0);
        }
        repaint();
    }
    public void keyTyped(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
    }
    public void keyPressed(KeyEvent e) {
        if(error != 6 && !Ganador()){
            char teclado = e.getKeyChar();
            boolean encontrado = false;
            dato = teclado;
            for(int i=0;i<palabra_actual.length;i++) {
                if(palabra_actual[i]==dato){
                    palabras_display[i]=dato;
                    encontrado = true;
                }
            }
            if(!encontrado)
                error ++;
            pantalla2=String.valueOf(palabras_display);
            labelLlenado.setText(pantalla2);
            System.err.println(error);
            Ahorcar();
            Ganador();
        }
    }
    public Image getIconImage() {
        Image iconoVentana = Toolkit.getDefaultToolkit().
                getImage(ClassLoader.getSystemResource("icono.png"));
        return iconoVentana;
    }
    public void initComponents() {
        p.setLayout(null);
        labelLlenado = new JLabel();
        labelLlenado.setBounds(X, Y, largo, ancho);
        labelLlenado.setForeground(Color.red);
        labelLlenado.setFont(new Font("chiller", 1, 60));
        titulo.setBounds(250, 100, largo, ancho);
        titulo.setForeground(Color.red);
        titulo.setFont(new Font("chiller", 1, 60));
        p.add(labelLlenado);
        Dibujo.setBounds(500, 200, 200, 200);
        Dibujo2.setBounds(400, 200, 200, 200);
        logo.setBounds(350, 5, 50, 50);
        p.add(logo);
        p.add(titulo);
        p.add(Dibujo2);
        p.add(Dibujo);
        Dibujo2.setVisible(false);
        Menu();
        add(inicio);
    }
    public void Menu() {
        item[0] = new JMenuItem("Peleadores");
        item[1] = new JMenuItem("Boss");
        item[2] = new JMenuItem("Nuevo");
        item[3] = new JMenuItem("Musica de fondo");
        item[4] = new JMenuItem("<html><a href="+""+">Sitio Web</a></html>");
        item[5] = new JMenuItem("Salir");
        menu2.add(item[2]);
        menu2.add(item[3]);
        menu2.add(item[5]);
        menu.add(item[0]);
        menu.add(item[1]);
        menuIformacion.add(item[4]);
        barra.add(menu2);
        barra.add(menuIformacion);
        barra.add(menu);        
        add(barra, BorderLayout.NORTH);
        item[0].addActionListener(this);
        item[1].addActionListener(this);
        item[2].addActionListener(this);
        item[3].addActionListener(this);
        item[4].addActionListener(this);
        item[5].addActionListener(this);
        addKeyListener(this);
        menu.setEnabled(false);
    }
    public static synchronized void playSound(final String url) {
        new Thread(new Runnable() { 
            public void run() {
                try {
                    Clip clip = AudioSystem.getClip();
                    AudioInputStream inputStream = AudioSystem.
                      getAudioInputStream(Main.class.getResourceAsStream(url));
                    clip.open (inputStream);
                    clip.start();
                }
                catch (Exception e) {
                    System.err.println(e.getMessage());
                }
            }
        }).start();
    }
    public void Ahorcar(){
        Dibujo.setBounds(500, 200, 200, 200);
        switch(error){
            case 1:
                  Dibujo.setIcon(new ImageIcon(getClass().
                          getResource("scorpions1.gif")));
                  break;
            case 2:
                  titulo.setIcon(new ImageIcon(getClass().
                          getResource("fight.gif")));
                  Dibujo.setIcon(new ImageIcon(getClass().
                          getResource("scorpions1.gif")));
                  Dibujo2.setIcon(new ImageIcon(getClass().
                          getResource("Liu_kang_1.gif")));
                  Dibujo2.setVisible(true);
                  break;
            case 3:
                  Dibujo.setIcon(new ImageIcon(getClass().
                          getResource("scopions2.gif")));
                  Dibujo2.setIcon(new ImageIcon(getClass().
                          getResource("luikangGolpeado.gif")));
                  break;
            case 4:
                  Dibujo.setIcon(new ImageIcon(getClass().
                          getResource("scorpions3.gif")));
                  Dibujo2.setIcon(new ImageIcon(getClass().
                          getResource("liu_KangGolpe.gif")));
                  break;
            case 5:
                  Dibujo.setIcon(new ImageIcon(getClass().
                          getResource("scorpionsPerdiendo.gif")));
                  titulo.setIcon(new ImageIcon(getClass().
                          getResource("finishHim.gif")));
          Dibujo2.setIcon(new ImageIcon(getClass().
                          getResource("Liu_kang_1.gif")));
                  break;
            case 6:
                  try{
                      Thread t = new Thread(new fatalty());
                      t.start();
                      break;
                  }catch(Exception e){}
                  break;
            default:
                  Dibujo.setIcon(new ImageIcon(getClass().
                          getResource("scorpions1.gif")));
        }
    }
    public boolean Ganador(){
        for(int i = 0; i < palabras_display.length; i ++) {
            if(palabras_display[i] != palabra_.charAt(i))
                break;
            if(i == palabras_display.length - 1){
                Dibujo.setIcon(new ImageIcon(getClass().
                        getResource("scorpionsWins.gif")));
                if(error > 1)
                    Dibujo2.setIcon(new ImageIcon(getClass().
                            getResource("liuMuerto.gif")));
                titulo.setIcon(null);
                titulo.setText("YOU WIN!");
                Dibujo.setBounds(500, 160, 200, 200);
                return true;
            }
        }
        return false;
    }
    class fatalty implements Runnable{
        int x = 2;
        public void run() {
            do{
                try {
                    titulo.setIcon(new ImageIcon(getClass().
                            getResource("fatality_1.gif")));
                    Dibujo.setBounds(350, 50, 350, 300);
                    Dibujo2.setVisible(false);
                    Dibujo.setIcon(new ImageIcon(getClass().
                            getResource("_fatality_.gif")));
                    repaint();
                    Thread.sleep((x--)*1795);
                    if(x == 0){
                        /*Dibujo.setBounds(350, 200, 200, 200);
                        Dibujo.setIcon(new ImageIcon(getClass().
                         * getResource("liukangWin.png")));*/
                        break;
                    }
                } catch (InterruptedException ex) {
                    Logger.getLogger(Ahorcado.class.getName()).
                            log(Level.SEVERE, null, ex);
                }
            }while(true);
        }
    }
    class panel extends JPanel {
        private Image imagen;
        public panel() {
        }
        public panel(String nombreImagen) {
            if (nombreImagen != null) {
                imagen = new ImageIcon(getClass().
                        getResource(nombreImagen)).getImage();
            }
        }
        public panel(Image imagenInicial) {
            if (imagenInicial != null) {
                imagen = imagenInicial;
            }
        }
        public void setImagen(String nombreImagen) {
            if (nombreImagen != null) {
                imagen = new ImageIcon(getClass().
                        getResource(nombreImagen)).getImage();
            } else {
                imagen = null;
            }
            repaint();
        }
        public void setImagen(Image nuevaImagen) {
            imagen = nuevaImagen;
            repaint();
        }
        public void paint(Graphics g) {
            if (imagen != null) {
                g.drawImage(imagen, 0, 0, getWidth(), getHeight(), this);
                setOpaque(false);
            } else {
                setOpaque(true);
            }
            super.paint(g);
        }
    }
}
Ahora solo es cuestión de agregar la clase Principal del mismo juego en otro archivo (Main.java)
import javax.swing.UIManager;
public class Main{
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            java.awt.EventQueue.invokeLater(new Runnable(){
                public void run(){
                    new Ahorcado().setVisible(true);
                }
            });
        }
        catch(Exception e) {}
    }
}
Ya para finalizar les dejo las imágenes que yo utilice para hacer este juego y el audio lo dejare en un link de google docs.                                                     Link del Audio



















4 comentarios:

  1. ¿AMIGO, Y DÓNDE DESCARGO EL CÓDIGO COMPLETO O EL PAQUETE?

    ResponderEliminar
    Respuestas
    1. no subi ningun paquete, lo que hice fue pasar el codigo tal cual, lo que puedes hacer es copiar el codigo tal cual y guardarlo en dos Archivos.
      -Ahorcado.java
      -Main.java
      descarga las imagenes que estan en gif
      todo eso lo guardas en una misma carpeta

      al final solo compila desde consola

      >javac Main.java
      >java Main

      y listo, ahh tambien el audio, ese si lo puedes descargar del link que deje arriba.

      Eliminar
  2. Creo que e hizo falta la imagen: Imagen.jpg, invocada en la linea 31 de la clase Ahorcado.
    Saludos.

    ResponderEliminar
    Respuestas
    1. hola, primeramente gracias por visitar el blog, segundo tienes mucha razón jejeje pero sabes el problema no esta en mandar llamar la imagen sino que ni siquiera tiene ninguna función útil toda esa linea, ya verifique el código nuevamente y creo que se me paso, ya que esa linea la usaba para el fondo de pantalla, pero después implemente la clase de panel para ajustar mejor la imagen, y se me fue y ahí quedo, gracias por verificar!

      Eliminar