Ayuda applet en Java

Topic created · 9 Mensajes · 2108 Visitas
  • Muy buenas noches a todos! es mi primera consulta espero puedan ayudarme y asi insentivarme para poder ayudarles en alguna oportunidad desde ya muchas gracias 🙂

    Tengo el siguiente programa en Java sobre un buscaminas(bastante basico) lo tengo casi listo pero me falla en algo... no logro entender que sucede....

    Cuando uno hace click en algun cuadrado, reviza la cantidad de bombas y pone el numero de bombas que hay al rededor, pero si colocas el click justo donde hay una bomba, la marca con X y pone todas de color rojo( las que tenian bombas) hasta ahi todo bien, pero cuando no tiene NINGUNA BOMBA al rededor falla el juego....

    adjunto el codigo del buscaminas!

    import java.awt.*;
    import java.applet.*;
    import java.awt.event.*;
    
    public class Buscamina extends Applet implements ActionListener
    {
        private Button b[][]=new Button[5][5];//matris de botones
        private Button Comenzar = new Button("Comenzar");//boton comenzar
        private Button Otravez = new Button("Otra vez");//boton volver a jugar
        private int A[][]=new int[5][5];//matriz con bombas
        private int i,j,x=150,y=80,f,c,aux,v;//variables varias
        private Color Z = new Color(211,211,211);//color gris
        private Color Y = new Color(160,82,45);//color cafe
        private Color X = new Color(198,226,255);//color celeste
        private Image F[]=new Image[5];//arreglo de imagenes
        private AudioClip SonidoActual;//sonido
        private boolean w;//variable para determinar si se gano o no
        
        
        public void init()
        {
            this.setLayout(null);
            this.setSize(400,283);//configuracion de pantalla por defecto
            Comenzar.setBounds(260,200,100,30);//modificacion de posicion y tamaño de boton comenzar
            Comenzar.setBackground(X);//modificacion a color celeste del boton comenzar
            Otravez.setBounds(260,240,100,30);//modificacion de posicion y tamaño de boton otravez
            Otravez.setBackground(Y);//modificacion a color cafe de boton otravez
            Comenzar.addActionListener(this);//agregar actionListener a boton comenzar
            Otravez.addActionListener(this);//agregar actionListener a boton otravez
            add(Comenzar);//agregar boton comenzar a la pantalla
            add(Otravez);//agregar boton otravez a la pantalla
            
            //setBackground(Color.black);
            
            for(i=0;i
  • Antes de nada, ¿por qué no haces que la matriz de bombas sea una matriz de booleanos en vez de números enteros? Así gastas menos memoria, solo la que te hace falta, porque una bomba tiene dos opciones: estar o no estar xD.

    Ahora yendo al programa... No entiendo muy bien por qué después de revisar los cuadros de alrededor no encontró ninguna debes usar el mismo método para todos los de alrededor, creo que eso deberías quitarlo, porque te puede dar error por dos motivos:

    • El programa entrará en un bucle infinito si alguna de las de alrededor tampoco tiene bombas, porque si llamas al método BBC para las casillas contiguas significa que en esta no hay nada alrededor, y lo que ocurrirá es que la primera llamará al método BBC para la segunda, y la segunda otra vez para la primera y así indefinidamente...
    • Llamas a la función BBC para todas las bombas de alrededor sin comprobar si te sales de los límites del array... Eso te puede dar problemas también.
      Un saludo, y espero que te sirva :wiii:
  • Muchas gracias por responder!

    bueno, en cuanto a lo de la matriz con numeros en vez de booleanos es temporal mientras veo lo del nivel de dificultad porque no seria la gracia tener el campo completo lleno de minas ( en caso de que todos fueran bombas) eso lo corregire luego xD

    lo del metodo... aludia a la recursividad pero creo que esta mal utilizado, pues si te fijas al jugar en un buscaminas cuando no tienes bombas se autorevizan los otros como si los hubieras apretado! quizas ahi es donde tengo la falla debo ver como utilizar bien la recursividad alguna sugerencia ?

    En cuanto a algun bucle infinito no he tenido nunca de todas las veces que lo he probado... analizare tambien esa situacion.

    Gracias por tu tiempo! 🙂

  • No entiendo para qué te hace falta la recursividad. Cada vez que pinchas en una casilla compruebas si hay una bomba ahí o no, y si no hay bomba compruebas las que hay alrededor para mostrar el numerito... No entiendo para qué necesitas comprobar también cuántas bombas tienen alrededor las de alrededor _xD_

  • Hola, bueno nose exactamente si habra que utilizar la recursividad en este caso pero... se supone que si no tengo ninguna bomba ( es la variable v el contador para ellas en el metodo BBC ) debo buscar al rededor de ella si hay bombas por ejemplo...

    0 *0 0 0 0
    0 0 0 1 0
    1 0 0 0 0
    0 0 0 0 0

    si hago click en el *0 deberia aparecer en blanco , pero despues en cada una de su alrededor deberia buscar si hay bombas( asi lo hace el juego original de windows para que te fijes bien ) y ahi es donde fallamos... tengo puesto un IF para cuando sea v = 0 y ahi hacer esas consultas aun no comprendo porque no lo hace como debiera xD .... pero bueno ahorame he fijado (cambie un poco el codigo inicial) que se me va en diagonal hacia arriba cuando no hay ninguno xD cosa loca jajaja

    el codigo es

      if(v==0){
                if( (i>0)  && (j>0)  ){  BBC(i-1, j-1);  }
                if( (i>0)            ){  BBC(i-1,j);     }
                if( (i>0)  && (j
  • Aaaaaah ya acabo de entender para qué necesitas aplicar ese ese método a las casillas de alrededor xDDD, pero no entiendo bien tu forma de hacerlo, te voy a decir cómo lo haría yo. Esto me recuerda a un problema que hice hace poco que se llamaba el algoritmo del pintor. Si lo quieres hacer de forma recursiva lo que haría yo es:

    Hacer que b sea un array de una clase que herede de JButton (por ejemplo Casilla, o como prefieras xD) pero que además de los campos propios de JButton tenga un booleano público que sea algo así como comprobado, y de paso puedes hacerte otro campo también booleano que sea bomba (si tiene una bomba o no) y te ahorras la matriz para esa función. Entonces, al invocar al método BBC para todas las casillas lo que haces es:

    Primero comprobar que las casillas de alrededor no han sido comprobadas (que su campo comprobado vale false). Si eso se cumple entonces comprueba si tienen bomba y le suman 1 a v. Después, si v es 0 lo primero de todo es poner el campo comprobado a true, para evitar que las casillas de alrededor vuelvan a comprobar esta celda porque se crearía un bucle infinito. Una vez hecho eso ya puedes aplicar el método BBC a todas las casillas de alrededor, y ya está.

    Si quieres hacerlo más eficiente aún, añades a la clase Casilla otro campo, esta vez un int, "bombasAlrededor". Entonces nada más generar el tablero cuentas cuántas bombas tienen alrededor todas las casillas y lo guardas en ese campo, de esa forma no tienes que comprobarlo más veces, ahorrándote bastante tiempo de CPU, sobre todo en tableros grandes.

    Un saludo, a ver si te sirve 😛

  • @Hawkings said:

    Hacer que b sea un array de una clase que herede de JButton (por ejemplo Casilla, o como prefieras xD) pero que además de los campos propios de JButton tenga un booleano público que sea algo así como comprobado, y de paso puedes hacerte otro campo también booleano que sea bomba (si tiene una bomba o no) y te ahorras la matriz para esa función.

    En cuanto a campos te refieres a Variables ?

    O hacer una clase casilla que herede al buscaminas ?

  • class Casilla extends JButton {
    public bool bomba, comprobado;
    public int bombasAlrededor;
    }

    Me refiero a eso xD

  • aaaaaaaaah! ahora comprendo jajaja no se me habia ocurrido , ok , dentro de los proximos dias lo programare y te cuento que onda! muchas gracias por tu tiempo y los conocimientos se agradece mucho! :wiii: