Juego de memoria en un JFrame - Java - Plurasin

23 mayo 2012

Juego de memoria en un JFrame - Java

Bueno el post de momento no tendrá el código completo, sera mas que todo comentarios de como realizar el juego con algunos códigos de ejemplo. El programa sera realizado en netbeans .



El juego de memoria es bien simple, te presenta una cantidad de espacios (12) que al darles click revelan una imagen oculta, la cual tiene una pareja entre las demás imágenes ocultas, cuando se encuentra un par este queda visible, y si no se encuentra el par, las imágenes descubiertas se vuelven a ocultar.


Como siempre basándonos en una versión "light" del juego, pues veremos cuales son los pasos que debe seguir nuestro juego para ser funcional:

  • Primero hay que generar el orden de las imágenes, y controlar que no se repitan mas de 2 veces las imágenes.
  • Controlar que cada vez que demos click (a los label) estos muestren la imagen.
  • Determinar si las imágenes son iguales para que queden visibles, caso contrario ocultarlas nuevamente.
  • Finalmente terminar el juego una vez todas las imágenes hayan sido descubiertas con sus respectivas parejas.
Para almacenar las imagenes usaremos los jLabel con su propiedad setIcon, por tanto las imagenes que usemos deben ser de un mismo tamaño y no muy grandes, ya que el jLabel se acomoda a la imagen.

Lo primero que haremos sera tener 2 arrays de enteros, el primero de 12 espacios para guardar las posiciones de nuestras imagenes, y el segundo de 6 para controlar que no se repitan mas de 2 veces las imagenes en las 12 posiciones.



        //declaramos los arrays
        int posicion[] = new int[12];
        int control[] = new int[6];
        //los llenamos de ceros
        for(int x=0;x<12;x++)
            posicion[x]=0;
        for(int x=0;x<6;x++)
            control[x]=0;
        //declaramos nuestro random para generar las posiciones aleatorias
        //generamos un valor aleatorio del 0 al 5, que representara a las imagenes
        Random r = new Random();
        int posIma;
        //comenzamos el llenado
        for(int x=0;x<12;x++){
            //generamos un valor aleatorio del 0 al 5, que representara a las imagenes
            posIma = r.nextInt(6);
            //comprobamos que el numero maximo se encuentre 2 veces
            if(control[posIma]<2){
                //guardamos el numero
                posicion[x]=posIma+1;
                //aumentamos el valor de control
                control[posIma]++;
            }else{
                x--;//disminuimos x para que no cuente este bucle
            }
        }

Teniendo en cuenta que nuestras imágenes deben tener por nombres los números del 1 al 6, pues este array nos servirá para colocar las imágenes en nuestros jLabel, cada vez que se active el evento mouseClicked, de la siguiente manera:



//esto va luego del package
import javax.swing.ImageIcon;


//colocamos la imagen en nuestro jLabel
jLabel1.setIcon(new ImageIcon(getClass().getResource(pos[0]+".jpg"))); 


lo malo de este método es que tendremos que usar esta linea para cada jLabel (jLabel1,Jlabel2,etc) y respectivamente cambiar el indice de nuestro array (siempre un numero menos que nuestro jLabel. Ejm: jLabel2 --> pos[1]

ademas necesitaremos una imagen por defecto que represente que la imagen esta volteada, puede ser una imagen en blanco o quizás un signo de interrogación.

Para comprobar si las imágenes volteadas son iguales se puede usar un par de variables auxiliares que tomen el valor del pos[x] cuando las imágenes sean reveladas, y estos 2 valores serian enviados a una funcion que se encargue de compararlas, por tanto si son iguales las imagenes quedan reveladas y si son distintas las imagenes volveran a ser volteadas.

**************
El juego terminado ya esta disponible para descarga, se le agrego 3 juegos de imágenes para variar un poco el juego ademas de un timer que nos permitirá saber cuanto se demora uno en descubrir todas las parejas.

Descargar: http://www.mediafire.com/?boo2guzzntm8oak



18 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Muchas gracias! Me sirvió mucho para un proyecto de la U! bendiciones!

    ResponderEliminar
  3. Buenas Kevin, usted me podria pasar el archivo, igual me serviria de mucho para un proyecto de la U. ravaa6@gmail.com
    Gracias

    ResponderEliminar
  4. buenisimo pero que mala onda que digan que lo hicieron "itssnp" cuando ni siquiera pongan creditos

    ResponderEliminar
    Respuestas
    1. el codigo fue netamente creacion mia, la imagen que use para ilustrar el post si la saque de internet en el apuro de subirlo en esos dias, salu2

      Eliminar
  5. Hank Mooddy: la codificacion esta muy bueno y entendible!!!
    me seria de mucha ayuda si me pasa el codigo completo .. Necesito algo de ayuda para un trabajo que tengo que hacer.... mi correo es apu2420@gmail.com

    ResponderEliminar
    Respuestas
    1. al final de post hay un enlace de Mediafire para poder descargar el proyecto ya terminado, salu2

      Eliminar
    2. Acabo de probarlo y esta funcionando normal

      Eliminar
  6. Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.(ImageIcon.java:205)
    at a3d.Parejas.initComponents(Parejas.java:44)
    at a3d.Parejas.(Parejas.java:25)
    at a3d.Principal.main(Principal.java:12)

    que hago? :(

    ResponderEliminar
  7. si mal no recuerdo cuando se hace un cambio en las imagenes, habia que utilizar rebuild para que funcionaran de nuevo, porque en su momento mas alla del problema de las imagenes todo corria bien.

    ResponderEliminar
  8. Podria pasarme el codigo documentado?
    No entiendo
    for(int cant=0;cant<12;cant++){
    img = r.nextInt(6);
    if (num[img]<2){
    num[img]++;
    cot[cant]=img+1;
    }else{
    cant--;

    ResponderEliminar
    Respuestas
    1. ahora que reviso el post veo que en la que explicación que escribí cambie ligeramente los nombres de las variables para que se entendiera mejor, el codigo siguiente es el que corresponde con el codigo que copiaste:

      for(int x=0;x<12;x++){
      //generamos un valor aleatorio del 0 al 5, que representara a las imagenes
      posIma = r.nextInt(6);
      //comprobamos que el numero maximo se encuentre 2 veces
      if(control[posIma]<2){
      //guardamos el numero en posicion
      posicion[x]=posIma+1;
      //aumentamos el valor de control
      control[posIma]++;
      }else{//en caso ya exista la pareja
      x--;//disminuimos x para que no cuente este bucle
      }
      }

      Eliminar
  9. Muchas gracias, me sirvio como ejemplo que buscaba!!

    ResponderEliminar
  10. I have read your blog its very attractive and impressive. I like it your blog.

    Java Training in Chennai

    ResponderEliminar