Foro de elhacker.net

Programación => Java => Mensaje iniciado por: TheFICBoss en 2 Agosto 2013, 15:17 pm



Título: Problema con el inicio del programa
Publicado por: TheFICBoss en 2 Agosto 2013, 15:17 pm
Hola, buenos dias!
Pues bien, yo tengo este código:

Código
  1. package Ajedrez;
  2.  
  3. public class Tablero {
  4. Pieza array[][]=new Pieza[7][7];
  5. public Tablero(){
  6. for(int i=0;i<8;i++)
  7. for(int j=0;j<8;j++)
  8. array[ i][j]=new Pieza();
  9.  
  10. }
  11. void iniciarPartida(){
  12. for(int i=0;i<8;i+=7){
  13. array [ i][0].pz=Piezas.TORRE;
  14. array [ i][1].pz=Piezas.CABALLO;
  15. array [ i][2].pz=Piezas.ALFIL;
  16. array [ i][3].pz=Piezas.DAMA;
  17. array [ i][4].pz=Piezas.REY;
  18. array [ i][5].pz=Piezas.ALFIL;
  19. array [ i][6].pz=Piezas.CABALLO;
  20. array [ i][7].pz=Piezas.TORRE;
  21. }
  22. for(int i=0;i<8;i++){
  23. array [7][ i].cl=Colores.NEGRO;
  24. array [6][ i].pz=Piezas.PEON;
  25. array [6][ i].cl=Colores.NEGRO;
  26. array [1][ i].pz=Piezas.PEON;
  27. array [1][ i].cl=Colores.BLANCO;
  28. array [0 ][ i ].cl=Colores.BLANCO;
  29. }
  30.  
  31. }
  32. }
  33. public static void main(String args[]){
  34. Tablero mitabla= new Tablero();
  35. //System.out.print(mitabla.toString());
  36. }
  37. }
  38. class Pieza {
  39. Piezas pz;
  40. Colores cl;
  41. public Pieza() {
  42.  this.pz=null;
  43.  this.cl=null;
  44. }
  45.  
  46. }
enum Piezas{REY,DAMA,ALFIL,CABALLO,TORRE,PEON};
enum Colores{BLANCO,NEGRO};


Y cuando lo ejecuto me da el sgte. error:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
   at Ajedrez.Tablero.<init>(Tablero.java:8)
   at Ajedrez.Tablero.main(Tablero.java:78)

Yo creo que es del arranque, que no sabe muy bien donde empezar a ejecutarse. Lo digo por que me da fallo en la main y he estado indagando por ahi y es lo que me aparecía.

Agradecería cualquier ayuda.

Un saludo a todos! :D



Título: Re: Problema con el inicio del programa
Publicado por: TheFICBoss en 2 Agosto 2013, 15:24 pm
NO se porque la funcion iniciarPartida me la copió asi, está mal.

No me deja ponerla bien...


Título: Re: Problema con el inicio del programa
Publicado por: 1mpuls0 en 2 Agosto 2013, 16:38 pm
Para eliminar caracteres extraños, copia tu código primero a un BLOC DE NOTAS después del bloc de notas copialo aquí.
Utiliza las etiquetas GeSHi.

Saludos.


Título: Re: Problema con el inicio del programa
Publicado por: Alien-Z en 3 Agosto 2013, 16:57 pm
El error está en que no se puede acceder a una posición de un array bidimensional si solo indicas una de las dimensiones. Lo tienes en casi todo el código así:

Código
  1.         Pieza array[][]=new Pieza[7][7];
  2.         array[j]=new Pieza();
  3. ...
  4.         array [1].pz=Piezas.CABALLO;
  5.         array [2].pz=Piezas.ALFIL;
  6.         array [3].pz=Piezas.DAMA;
  7.         array [4].pz=Piezas.REY;
  8. ...
  9.         array [7].cl=Colores.NEGRO;
  10.         array [6].pz=Piezas.PEON;
  11.         array [6].cl=Colores.NEGRO;

Se debe utlizar de la siguiente forma:

Código
  1. array[COLUMNA][FILA] = new Pieza();

Un saludo.


Título: Re: Problema con el inicio del programa
Publicado por: TheFICBoss en 4 Agosto 2013, 01:09 am
Si ya lo se, eso es lo que mencione que me copiara mal...

En realidad ya lo tengo array[ i ][1] ...

Lo acabo de corregir (al fin -.-), ahora es tal cual mi código.

Gracias a todos


Título: Re: Problema con el inicio del programa
Publicado por: Alien-Z en 4 Agosto 2013, 15:26 pm
Ya me parecía a mi que eso te lo debía haber indicado el IDE. Ahora que lo miro detenidamente me he fijado donde falla:

Código
  1. public class Tablero {
  2.   Pieza array[][]=new Pieza[7][7];
  3.   public Tablero(){  
  4.      for(int i=0;i<8;i++)
  5.         for(int j=0;j<8;j++)
  6.            array[ i][j]=new Pieza();
  7.  
  8.   }

Creas un array de tamaño 7x7 pero pones como condición de continuación en los bucles que "i, j"sea  menor que "8, 8", por tanto el bucle intentará acceder a la posición "array[7][7]" sin embargo el array va desde array[0][0] hasta array[6][6]; te sales de él e intentas acceder a una posición que no existe. La condición de continuación debe ser "i < 7".

Y un pequeño matiz:

Código
  1.   public Pieza() {
  2.     this.pz=null;
  3.     this.cl=null;
  4.   }

No es necesario utilizar "this" en este constructor porque las variables no están siendo ocultadas, debes utilizarlo cuando por ejemplo recibes como parámetro una variable con el mismo nombre que un atributo miembro y quieras distinguirlos:

this.pz -> atributo del objeto
pz -> Variable que me han pasado como parámetro

Un saludo.


Título: Re: Problema con el inicio del programa
Publicado por: TheFICBoss en 4 Agosto 2013, 23:30 pm

Lo del this que me dices lo puse después, al principio ya lo tenía sin él. 

Muchas gracias por tu respuesta, que descuido más tonto...

Antes lo tenía declarado así, y también fallaba:  Pieza array[][];

Un saludo y gracias de nuevo! :D


Título: Re: Problema con el inicio del programa
Publicado por: TheFICBoss en 5 Agosto 2013, 00:23 am
Si no es mucho pedir, me pueden ayudar con esta función?

    public String toString(){
      String FEN = null;
      for(int i=7;i>=0;i--){
         for(int j=0;j<8;j++){
            switch(array[ i ][j].pz){ ------> FALLA AQUÍ
               case TORRE:
                  if(array[ i ][j].cl==Colores.BLANCO)
                     FEN=FEN+"T";
                  else
                     FEN=FEN+"t";
                  break;
               case CABALLO:
                  if(array[ i ][j].cl==Colores.BLANCO)
                     FEN=FEN+"C";
                  else
                     FEN=FEN+"c";
                  break;
               case ALFIL:
                  if(array[ i ][j].cl==Colores.BLANCO)
                     FEN=FEN+"A";
                  else
                     FEN=FEN+"a";
                  break;
               case DAMA:
                  if(array[ i ][j].cl==Colores.BLANCO)
                     FEN=FEN+"D";
                  else
                     FEN=FEN+"d";
                  break;
               case REY:
                  if(array[ i ][j].cl==Colores.BLANCO)
                     FEN=FEN+"R";
                  else
                     FEN=FEN+"r";
                  break;
               default:
                  FEN=FEN+"1";
                  break;
            }
         }
         FEN=FEN+"/";
      }
         
      return FEN;
   }

Me da exactamente el mismo fallo que antes, pero esta vez he revisado bien los bucles FOR y ahi no puede estar el fallo, por que mi array lo declaré como [8][8].


Título: Re: Problema con el inicio del programa
Publicado por: Alien-Z en 5 Agosto 2013, 00:39 am
No veo dónde puede fallar. En el switch se puede usar variables de tipo Enum, Integer y String, y por lo que has mostrado en los otros posts puedo suponer que "array[j].pz" sigue siendo un Enum, por tanto es correcto.

¿Has inicializado correctamente todas las posiciones del array?. ¿Podrías poner el código completo separado por módulos y utilizando las etiquetas code?.


Título: Re: Problema con el inicio del programa
Publicado por: TheFICBoss en 5 Agosto 2013, 01:48 am
Código:

package Ajedrez;

public class Tablero {
Pieza array[][]=new Pieza[8][8];
public Tablero(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
array[i][j]=new Pieza();
}
}
}
void iniciarPartida(){
for(int i=0;i<8;i+=7){
array[i][0].pz=Piezas.TORRE;
array[i][1].pz=Piezas.CABALLO;
array[i][2].pz=Piezas.ALFIL;
array[i][3].pz=Piezas.DAMA;
array[i][4].pz=Piezas.REY;
array[i][5].pz=Piezas.ALFIL;
array[i][6].pz=Piezas.CABALLO;
array[i][7].pz=Piezas.TORRE;
}
for(int i=0;i<8;i++){
array[7][i].cl=Colores.NEGRO;
array[6][i].pz=Piezas.PEON;
array[6][i].cl=Colores.NEGRO;
array[1][i].pz=Piezas.PEON;
array[1][i].cl=Colores.BLANCO;
array[0][i].cl=Colores.BLANCO;
}

}
public String toString(){
String FEN = null;
for(int i=7;i>=0;i--){
for(int j=0;j<8;j++){
switch(array[i][j].pz){             //    Falla aqui
case TORRE:
if(array[i][j].cl==Colores.BLANCO)
FEN=FEN+"T";
else
FEN=FEN+"t";
break;
case CABALLO:
if(array[i][j].cl==Colores.BLANCO)
FEN=FEN+"C";
else
FEN=FEN+"c";
break;
case ALFIL:
if(array[i][j].cl==Colores.BLANCO)
FEN=FEN+"A";
else
FEN=FEN+"a";
break;
case DAMA:
if(array[i][j].cl==Colores.BLANCO)
FEN=FEN+"D";
else
FEN=FEN+"d";
break;
case REY:
if(array[i][j].cl==Colores.BLANCO)
FEN=FEN+"R";
else
FEN=FEN+"r";
break;
default:
FEN=FEN+"1";
break;
}
}
FEN=FEN+"/";
}

return FEN;
}
public static void main(String args[]){
Tablero mitabla= new Tablero();
mitabla.iniciarPartida();
String abc=mitabla.toString();
System.out.print(abc);
}
}
class Pieza {
Piezas pz;
Colores cl;
public Pieza() {
//pz=Piezas.ALFIL;
//cl=Colores.BLANCO;
  pz=null;
  cl=null;
 
}

}
enum Piezas{REY,DAMA,ALFIL,CABALLO,TORRE,PEON};
enum Colores{BLANCO,NEGRO};


Aqui te dejo el código. Por cierto, no sabía que había una etiqueta code para esto, mucho más cómodo.

Un saludo! :D


Título: Re: Problema con el inicio del programa
Publicado por: TheFICBoss en 10 Agosto 2013, 16:12 pm
Ya encontré el fallo! No puedo declarar pz=null en el constructor de Pieza.

Saludos :D


Título: Re: Problema con el inicio del programa
Publicado por: Alien-Z en 11 Agosto 2013, 16:30 pm
Ya encontré el fallo! No puedo declarar pz=null en el constructor de Pieza.

Saludos :D

En teoría si deberías poder inicializarlo a null, otra cosa es que luego intentes usarlo sin haberle asignado ningún valor.

Un saludo.