Programacion Juego - Java

Hola compañeros tengo algunos problemas al querer programar un juego en java, bueno en realidad mi problema empieza al querer comparar dos imagenes que tengo en los JButton.

 //Aqui comparo las imagenes del boton 1 y del boton 2 es decir Canica1_1 con Canica1_2 aqui es donde esta el problema ya que no             compara las imagenes se pasa directo al else
    private void Validar1ActionPerformed(java.awt.event.ActionEvent evt) {                                        

        if(Canica1_1.getIcon().toString().equals(Canica1_2.getIcon().toString())){
            JOptionPane.showMessageDialog(this, "Imagenes repetidas");
        }else{
            JOptionPane.showMessageDialog(this, "Imagenes no repetidas ");
           
        }
    }

Aqui esta el codigo de todo lo que eh realizado hasta hoy

import java.io.IOException;
import java.net.URL;
import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;

String Arrelgo_Imagen[]={"/Imagenes/Cereza.png","/Imagenes/Girasol.png","/Imagenes/Lanzador.png", "/Imagenes/Nuez.jpg"
    , "/Imagenes/Papa_Mina.png", "/Imagenes/Soplador.png"};
    /** Creates new form Principal_Game */
    public Principal_Game() {
        initComponents();
        setSize(1050,620);

        Intento2.setEnabled(false);
        Canica2_1.setEnabled(false);
        Canica2_2.setEnabled(false);
        Canica2_3.setEnabled(false);
        Canica2_4.setEnabled(false);
        Validar2.setEnabled(false);

    }

//Este es un Boton
 private void Canica1_1ActionPerformed(java.awt.event.ActionEvent evt) {                                          

            if(evt.getSource()==Canica1_1){
            int ra=(int) (Math.random()*6); //generamos número aleatorio
                        //indicamos que nuestra imagen está en local y mandamos la ruta
                        //previamente declarada
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                Canica1_1.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

           

       
    }                                        
    //Aqui comparo las imagenes del boton 1 y del boton 2 es decir Canica1_1 con Canica1_2 aqui es donde esta el problema ya que no             compara las imagenes se pasa directo al else
    private void Validar1ActionPerformed(java.awt.event.ActionEvent evt) {                                        

        if(Canica1_1.getIcon().toString().equals(Canica1_2.getIcon().toString())){
            JOptionPane.showMessageDialog(this, "Imagenes repetidas");
        }else{
            JOptionPane.showMessageDialog(this, "Imagenes no repetidas ");
           
        }
    }                                        

    private void Canica1_2ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        if(evt.getSource()==Canica1_2){
            int ra=(int) (Math.random()*6); //generamos número aleatorio
                        //indicamos que nuestra imagen está en local y mandamos la ruta
                        //previamente declarada
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                Canica1_2.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }
    }                                        

    private void Canica1_3ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        if(evt.getSource()==Canica1_3){
            int ra=(int) (Math.random()*6); //generamos número aleatorio
                        //indicamos que nuestra imagen está en local y mandamos la ruta
                        //previamente declarada
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                Canica1_3.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }
    }                                        

    private void Canica1_4ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        if(evt.getSource()==Canica1_4){
            int ra=(int) (Math.random()*6); //generamos número aleatorio
                        //indicamos que nuestra imagen está en local y mandamos la ruta
                        //previamente declarada
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                Canica1_4.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }
    }

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Podrías publicar el

Podrías publicar el stacktrace de tu error?
Podrías ser más descriptivo?
Podrías colocar tu código entre tags de <code> y </code>

Imagen de arterzatij

y por que...

comparar imagenes y no mejor un tipo de dato mas facil de comparar...

te recomiendo un enum si no son muchas las imagenes y dentro del enum alamcenas la ruta de dicha imagen...

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

ok gracias por la aportacion

ok gracias por la aportacion amigo en un momento corrigo

Más bien si las compara y

Más bien si las compara y siempre dice que no son iguales.

1. Intenta debugguear o imprimir el valor que tiene en ese momento
Canica1_1.getIcon().toString()
y
Canica1_2.getIcon().toString()
Para que visualmente compares si son o no distintos, probablemente el método toString() esté imprimiendo algún dato extra (como la hora de creación) que los hace distintos siempre y aún no te has dado cuenta.

    private void Validar1ActionPerformed(java.awt.event.ActionEvent evt) {  
        System.out.println("Canica1_1.getIcon().toString() = " + Canica1_1.getIcon().toString() );
        System.out.println("Canica1_2.getIcon().toString() = " + Canica1_2.getIcon().toString() );
                                   
        if(Canica1_1.getIcon().toString().equals(Canica1_2.getIcon().toString())){
            JOptionPane.showMessageDialog(this, "Imagenes repetidas");
        }else{
            JOptionPane.showMessageDialog(this, "Imagenes no repetidas ");            
        }
    }

2. Un punto de mejora. El código que tienes para las canicas 1, 2, 3, 4 y es idéntico ( o casi ) y solo varía la canica a la cual se le pone la imagen. Mejor sería usar un solo código y no hace copy/paste

    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
        if ( evt.getSource() ==Canica1_1
            | evt.getSource() ==Canica1_2
            | evt.getSource() ==Canica1_3
            | evt.getSource() ==Canica1_4) {

           // supongo que CanicaN_M es de tipo JButton
            JButton canica = evt.getSource();

            int ra=(int) (Math.random()*6); //generamos número aleatorio
                        //indicamos que nuestra imagen está en local y mandamos la ruta
                        //previamente declarada
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                canica.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

Y puedes asociar ese listener para los cuatro botones.

Más aún, si solo los botoner canica tienen ese listener, ni siquiera hay que comparar si el source es originado por ese botón:

    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          

           // supongo que CanicaN_M es de tipo JButton
            JButton canica = evt.getSource();

            int ra=(int) (Math.random()*6); //generamos número aleatorio
                        //indicamos que nuestra imagen está en local y mandamos la ruta
                        //previamente declarada
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                canica.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }
    }

En vez de Math.random() * 6 utiliza la clase random para el número aleatorio:

    Random random = new Random();
    ...
    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
           // supongo que CanicaN_M es de tipo JButton
            JButton canica = evt.getSource();

            int ra= random.nextInt( 6 );
            URL url=this.getClass().getResource(Arrelgo_Imagen[ra]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                canica.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

Ni siquiera hace falta almacenar ese número:

    Random random = new Random();
    ...
    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
           // supongo que CanicaN_M es de tipo JButton
            JButton canica = evt.getSource();

            URL url=this.getClass().getResource(Arrelgo_Imagen[random.nextInt( 6 )]);
            try {
                Image img=ImageIO.read(url); //leemos la imagen
                canica.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

O el URL

    Random random = new Random();
    ...
    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
           // supongo que CanicaN_M es de tipo JButton
            JButton canica = evt.getSource();

            try {
                Image img=ImageIO.read(this.getClass().getResource(Arrelgo_Imagen[random.nextInt( 6 )]));
                canica.setIcon(new ImageIcon(img)); //la asignamos al JLabel de Java
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

O la imagen:

    Random random = new Random();
    ...
    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
           // supongo que CanicaN_M es de tipo JButton
            JButton canica = evt.getSource();

            try {
                canica.setIcon(new ImageIcon(ImageIO.read(this.getClass().getResource(Arrelgo_Imagen[random.nextInt( 6 )]))));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

Ya exagerando , ni siquiera la canica:

    Random random = new Random();
    ...
    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
            try {
                evt.getSource().setIcon(new ImageIcon(ImageIO.read(this.getClass().getResource(Arrelgo_Imagen[random.nextInt( 6 )]))));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

Aunque este último ya no es tan legible, mejor sería:

    Random random = new Random();
    ...
    private void actionPerformed(java.awt.event.ActionEvent evt) {                                          
            try {
                evt.getSource().setIcon(
                    new ImageIcon(
                        ImageIO.read(
                            this.getClass().getResource(
                                Arrelgo_Imagen[random.nextInt( 6 )]
                            )
                        )
                    )
                );
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

Y llegando a este punto la pregunta que surge es: ¿porque crear cada vez la imagen si siempre van a ser 6, mejor sería crearlas todas desde el principio:

// No queremos un arreglo de cadenas,
//String Arrelgo_Imagen[]={"/Imagenes/Cereza.png","/Imagenes/Girasol.png","/Imagenes/Lanzador.png", "/Imagenes/Nuez.jpg"
//    , "/Imagenes/Papa_Mina.png", "/Imagenes/Soplador.png"};

// Más bien queremos un arreglo de imagenes
Icon [] imagenes;
private void initImages() {
    imagenes = new Icon[6];
    imagenes[0] = getImage("/Imagenes/Cereza.png");
    imagenes[1] = getImage("/Imagenes/Girasol.png");
    imagenes[2] = getImage("/Imagenes/Lanzador.png");
    imagenes[3] = getImage("/Imagenes/Nuez.jpg");
    imagenes[4] = getImage("/Imagenes/Papa_Mina.png");
    imagenes[5] = getImage("/Imagenes/Soplador.png");
}

private ImageIcon getImage( String path ) {
            try {
                return new ImageIcon(ImageIO.read(this.getClass().getResource(path))));
            } catch (IOException e1) {
                System.out.println( "No se pudo leer la imagen " + path + ", error = + " e1.getMessage());
                return null; // o una imagen vacía
            }
        }
}

Y así el código del  actionListener ya no queda tan ridículo, ahora solo sería:

public void actionPerformed(ActionEvent e ) {
    e.getSource().setIcon( imagenes[random.nextInt(6)]);
}

Además que se están creando las imagenes desde el principio, y el programa es más eficiente al no crear nuevos objetos que representan lo mismo cada vez.

Tu comparación podría ser ahora:

    private void Validar1ActionPerformed(ActionEvent evt) {      
        if ( canica1.getIcon().equals(canica2.getIcon()) {
            JOptionPane.showMessageDialog(this, "Imagenes repetidas");
        }else{
            JOptionPane.showMessageDialog(this, "Imagenes no repetidas ");            
        }
    }

3. Por último, en Java la convención es que solo el nombre de las clases comiencen con mayúsculas, los métodos y variables van con minúsculas y sin guiones bajos:

validarActionPerformed, canicaNM, PrincipalGame, canicaActionPerformed

Pero, primero fíjate bien porque no esta comparando correctamente dos cadenas, al imprimir su valor.

Muchas gracias por tu

Muchas gracias por tu respuesta, me ayudo de mucho espero un día poder aportar tanto como tu lo hiciste gracias y ya estoy en esto, y también gracias por la convención en Java.

realice este codigo private

realice este codigo

private void Validar1ActionPerformed(java.awt.event.ActionEvent evt) {  
        System.out.println("Canica1_1.getIcon().toString() = " + Canica1_1.getIcon().toString() );
        System.out.println("Canica1_2.getIcon().toString() = " + Canica1_2.getIcon().toString() );
                                   
        if(Canica1_1.getIcon().toString().equals(Canica1_2.getIcon().toString())){
            JOptionPane.showMessageDialog(this, "Imagenes repetidas");
        }else{
            JOptionPane.showMessageDialog(this, "Imagenes no repetidas ");            
        }
}

y este fue el resultado al dar clic al Boton las imagenes eran las mismas pero al parecer guarda una URL diferente o una direccion en memoria diferente

Canica1javax.swing.ImageIcon@c1b161
CAnica2javax.swing.ImageIcon@645ccb

Yeap, por eso nunca evalua

Yeap, por eso nunca evalua como cierto que la imagen uno y la imagen dos son iguales.

Intenta comparando las imagenes en vez de su string

if ( canica.getIcon().equals(canica2.getIcon()) {
...

aun en las mismas amigo sigo

aun en las mismas amigo sigo sin poder comparar las imágenes un amigo me dijo que con un método de mnemonicos O.o en realidad se me hizo raro pero mañana veré eso a y por cierto aun no he podido comprender muy bien tu código espero me puedas contactar, te dejo mi correo felipe.0707@hotmail.com, Saludos y gracias por responder :D.

Y porque no por aquí? Así si

Y porque no por aquí?

Así si alguien tiene algún problema similar lo puede ver en el foro.

Trata de aislar el problema, haz algo como esto:

class EjemploComparacion {
    public static void main( String ... args ) {
        ImageIcon a = new ImageIcon( .... el código aqui de omo crear una imagen ) ;
        ImageIcon b = new ImageIcon( .... el código aqui de omo crear una imagen ) ;
        System.out.println( "Debe de ser true " + a.equals(b));
    }
}

Eso se puede ayudar a entender porque lo que crees que es verdadero no lo está siendo.

Saludos.

Muchas gracias por tu ayuda

Muchas gracias por tu ayuda al fin pude realizar la comparación atreves de Mnemonicos ahora no se si conozcan alguna función para poder des habilitar pero que la imagen que tenga el botón no sea a escala de grises, es decir des habilito el botón pero la imagen que tiene se vuelve a escala de grises y eso es lo que no quiero lo que quiero es que la imagen conserve su color original pero que el botón ya no funcione no se si me doy a entender

Unas cuantas comas m'as

Unas cuantas comas m'as hubieran ayudado jejejej.

Si, lo unico que tienes que hacer es quitarle el ActionListener al boton.

No veo porque no te funcionaba el codigo antes, o porque habrias de comparar por mnemonicos, pero que bueno que ya te funciono.