Foros del Web » Programación para mayores de 30 ;) » Java »

Error en el Juego Gato

Estas en el tema de Error en el Juego Gato en el foro de Java en Foros del Web. Hola, recien estoy iniciando a programar en Java. Y mi maestro me pidio un Juego en gato, lo hice en jFrame. puse 9 labels y ...
  #1 (permalink)  
Antiguo 28/09/2012, 10:16
 
Fecha de Ingreso: diciembre-2005
Ubicación: Jalisco
Mensajes: 31
Antigüedad: 18 años, 4 meses
Puntos: 0
Error en el Juego Gato

Hola, recien estoy iniciando a programar en Java.
Y mi maestro me pidio un Juego en gato, lo hice en jFrame.
puse 9 labels y 9 botones, cuando presiono el boton se pone 'X' u 'O'
iniciando 'X'... Nos pidio que hicieramos jugar contra la computadora y nos enseño
a crear un Random.... pero cuando juego contra la computadora siempre se me
traba el programa y no encuentro el error.
a ver si alguien puede ayudarme
......

turno=0 // Lo puse para que el programa inicie escribiendo 'X' y despues cambia de valor para escribir 'O'

esta es la imagen del gato


y este es el codigo

Solo pongo lo que hace la el random, y un boton cuando yo presiono los demas botones son iguales.

Código:
    public String random(){
            int lo;
       lo=r.nextInt(limit+1);
       
       while(lo>0){
           if((!"X".equals(jLabel1.getText())) || (!"X".equals(jLabel2.getText()))
           || (!"X".equals(jLabel3.getText())) || (!"X".equals(jLabel4.getText()))
           || (!"X".equals(jLabel5.getText())) || (!"X".equals(jLabel6.getText()))
           || (!"X".equals(jLabel7.getText())) || (!"X".equals(jLabel8.getText()))
           || (!"X".equals(jLabel9.getText())) || (!"O".equals(jLabel1.getText()))
           || (!"O".equals(jLabel2.getText())) || (!"O".equals(jLabel3.getText()))
           || (!"O".equals(jLabel4.getText())) || (!"O".equals(jLabel5.getText()))
           || (!"O".equals(jLabel6.getText())) || (!"O".equals(jLabel7.getText()))
           || (!"O".equals(jLabel8.getText())) || (!"O".equals(jLabel9.getText()))){
           switch(lo){
               case 1:{
                   if (("X".equals(jLabel1.getText())) || ("O".equals(jLabel1.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel1.setText("O");
                   lo=0;
                   turno=0;
                   }
                   }
                   break;
                      }
               case 2:{ 
                   if (("X".equals(jLabel4.getText())) || ("O".equals(jLabel4.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel4.setText("O");
                   lo=0;
                   turno=0;
                   }
                   }
               break;
                      }
                   case 3:{ 
                       if (("X".equals(jLabel2.getText())) || ("O".equals(jLabel2.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel2.setText("O");
                   lo=0;
                   turno=0;
               }
                       }
                 break;
                   }
                   case 4:{ 
                 if (("X".equals(jLabel3.getText())) || ("O".equals(jLabel3.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel3.setText("O");
                   lo=0;
                   turno=0;
               }   
                 }
               break;
                   }
                   case 5:{
                       if (("X".equals(jLabel5.getText())) || ("O".equals(jLabel5.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel5.setText("O");
                   lo=0;
                   turno=0;
               }
                       }
               break;
                       }
                   case 6:{ 
                       if (("X".equals(jLabel6.getText())) || ("O".equals(jLabel6.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel6.setText("O");
                   lo=0;
                   turno=0;
               }
                       }
               break;
                   }
                   case 7:{ 
                       if (("X".equals(jLabel7.getText())) || ("O".equals(jLabel7.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel7.setText("O");
                   lo=0;
                   turno=0;
               }
                       }
               break;
                   }
                   case 8:{ 
                       if (("X".equals(jLabel8.getText())) || ("O".equals(jLabel8.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel8.setText("O");
                   lo=0;
                   turno=0;
               }
                       }
               break;
                   }
                   case 9:{ 
                       if (("X".equals(jLabel9.getText())) || ("O".equals(jLabel9.getText())) || turno==0){
                    break;
                     }
                   else{
                   if(turno==1){
                   jLabel9.setText("O");
                   lo=0;
                   turno=0;
               }
                       }
               break;
                   }
           }
                  }
       }
    return null;
    }
   
    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
        if (("X".equals(jLabel1.getText())) || ("O".equals(jLabel1.getText()))){
            return;
        }
        else{
        if(turno==0){
        jLabel1.setText("X");
        turno=1;}
        else{
        jLabel1.setText("O");
        turno=0;}
        if (b==1){
       random();
        }
      compar(); 
        }
    }                                     
    private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        System.exit(0);
    }                                         

    private void jButton11ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        borrar();
    }                                         

    private void jRadioButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                              
        jLabel11.setText("Humano vs Computadora");
        b=1;
    }                                             

    private void jRadioButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                              
        jLabel11.setText("Humano vs Humano");
    }
Gracias.
  #2 (permalink)  
Antiguo 28/09/2012, 11:12
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Error en el Juego Gato

Así de primera instancia me suena a que el problema podría ser el método "compar()", pero necesitaría saber en qué parte se traba, si pone algo o inmediatamente iniciado el programa para asegurarlo ¿podrías poner el código de ese método y decirnos dónde se traba?

Adicionalmente a esto, la variable "limit" en qué valor comienza y porqué la usas cómo limit+1
  #3 (permalink)  
Antiguo 28/09/2012, 11:29
 
Fecha de Ingreso: diciembre-2005
Ubicación: Jalisco
Mensajes: 31
Antigüedad: 18 años, 4 meses
Puntos: 0
Respuesta: Error en el Juego Gato

Código:
public String compar() {
     if(("X".equals(jLabel1.getText()) && "X".equals(jLabel4.getText()) && "X".equals(jLabel2.getText()))
     || ("X".equals(jLabel1.getText()) && "X".equals(jLabel5.getText()) && "X".equals(jLabel9.getText()))
     || ("X".equals(jLabel1.getText()) && "X".equals(jLabel3.getText()) && "X".equals(jLabel7.getText()))
     || ("X".equals(jLabel3.getText()) && "X".equals(jLabel5.getText()) && "X".equals(jLabel6.getText()))
     || ("X".equals(jLabel7.getText()) && "X".equals(jLabel8.getText()) && "X".equals(jLabel9.getText()))
     || ("X".equals(jLabel7.getText()) && "X".equals(jLabel5.getText()) && "X".equals(jLabel2.getText()))
     || ("X".equals(jLabel4.getText()) && "X".equals(jLabel5.getText()) && "X".equals(jLabel8.getText()))
     || ("X".equals(jLabel2.getText()) && "X".equals(jLabel6.getText()) && "X".equals(jLabel9.getText()))){
    JOptionPane.showMessageDialog(null, "Ganaste X");  
        borrar();
}
else if(("O".equals(jLabel1.getText()) && "O".equals(jLabel4.getText()) && "O".equals(jLabel2.getText()))
     || ("O".equals(jLabel1.getText()) && "O".equals(jLabel5.getText()) && "O".equals(jLabel9.getText()))
     || ("O".equals(jLabel1.getText()) && "O".equals(jLabel3.getText()) && "O".equals(jLabel7.getText()))
     || ("O".equals(jLabel3.getText()) && "O".equals(jLabel5.getText()) && "O".equals(jLabel6.getText()))
     || ("O".equals(jLabel7.getText()) && "O".equals(jLabel8.getText()) && "O".equals(jLabel9.getText()))
     || ("O".equals(jLabel7.getText()) && "O".equals(jLabel5.getText()) && "O".equals(jLabel2.getText()))
     || ("O".equals(jLabel4.getText()) && "O".equals(jLabel5.getText()) && "O".equals(jLabel8.getText()))
     || ("O".equals(jLabel2.getText()) && "O".equals(jLabel6.getText()) && "O".equals(jLabel9.getText()))){
    JOptionPane.showMessageDialog(null, "Ganaste O"); 
        borrar();
}
    return null;
    }
Pues apenas tengo dias programando....
El maestro nos dijo que utilicemos eso como Random
y pusieramos limit=9..... ya que seria el numero de labels que tengo...


El programa se traba, cuando presiono el boton para que escriba la 'X'
pero no siempre es en la misma...
  #4 (permalink)  
Antiguo 28/09/2012, 11:36
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Error en el Juego Gato

Entonces es limit+1 el problema, según el api de java tenemos que:

nextInt(int n):

Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.

lo que significa que haces nextInt(10) ya que limit+1 = 10, y nextInt te devuelve un número entre 0 - 9, cuando te devuelve el 0 no entra a ningun case y nunca sale del while.
  #5 (permalink)  
Antiguo 28/09/2012, 11:39
 
Fecha de Ingreso: diciembre-2005
Ubicación: Jalisco
Mensajes: 31
Antigüedad: 18 años, 4 meses
Puntos: 0
Respuesta: Error en el Juego Gato

entonces el problema es limit+1 y el while =x ?
  #6 (permalink)  
Antiguo 28/09/2012, 11:45
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Error en el Juego Gato

La variable "lo" según la condicional del SHITCH debe estar entre 1-9 así que solicita el nextInt(limit) y eso te dará "lo" entre 0-8, y antes de iniciar el while haz un "lo++" o incrementa lo en uno, eso debería ser suficiente.
  #7 (permalink)  
Antiguo 28/09/2012, 11:53
 
Fecha de Ingreso: diciembre-2005
Ubicación: Jalisco
Mensajes: 31
Antigüedad: 18 años, 4 meses
Puntos: 0
Respuesta: Error en el Juego Gato

Puse que me imprima el numero que saca.... y puse la 'X' en la label #1

entonces el random me dio 1
y alli se me trabo....

ahora creo que se traba cuando la label esta ocupada....
  #8 (permalink)  
Antiguo 28/09/2012, 12:03
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Error en el Juego Gato

claro, porque en el case tienes:

Código Java:
Ver original
  1. case 1:{
  2.              if (("X".equals(jLabel1.getText())) || ("O".equals(jLabel1.getText())) || turno==0){
  3.                     break;
  4.              }
l
como es 1 y jLabel1 tiene un valor entra al if y hace el break; saliendo del switch pero regresando por la acción del while de manera infinita, necesitas hacer que cuando esto pase te entregue un nuevo número aleatorio y lo tienes que poner en lo, recuerda incrementarlo en 1 porque si te sale 0 y no haces el incremento saldrá del while y no hará nada.
  #9 (permalink)  
Antiguo 28/09/2012, 12:12
 
Fecha de Ingreso: diciembre-2005
Ubicación: Jalisco
Mensajes: 31
Antigüedad: 18 años, 4 meses
Puntos: 0
Respuesta: Error en el Juego Gato

muchas gracias.... yo habia puedo antes de....

if (("X".equals(jLabel1.getText())) || ("O".equals(jLabel1.getText())) || turno==0){
break;
}


lo puse asi...

if (("X".equals(jLabel1.getText())) || ("O".equals(jLabel1.getText())) || turno==0){
lo=0;
break;
}

pero si estaba ocupado el numero no ponia nada... y ahora puse que creara otro numero random, y si esta ocupado, lo pone en otro lugar... muchas gracias =)..... seguire programando mas, ya me gusto mucho la programacion

saludos.

Etiquetas: gato, juego, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:06.