Problema con el inicio del programa

Iniciado por TheFICBoss, 2 Agosto 2013, 15:17 PM

0 Miembros y 1 Visitante están viendo este tema.

TheFICBoss

Hola, buenos dias!
Pues bien, yo tengo este código:

Código (java) [Seleccionar]
package Ajedrez;

public class Tablero {
Pieza array[][]=new Pieza[7][7];
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 static void main(String args[]){
Tablero mitabla= new Tablero();
//System.out.print(mitabla.toString());
}
}
class Pieza {
Piezas pz;
Colores cl;
public Pieza() {
 this.pz=null;
 this.cl=null;
}

}

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


TheFICBoss

NO se porque la funcion iniciarPartida me la copió asi, está mal.

No me deja ponerla bien...

1mpuls0

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.
abc

Alien-Z

#3
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 (java) [Seleccionar]
         Pieza array[][]=new Pieza[7][7];
        array[j]=new Pieza();
...
        array [1].pz=Piezas.CABALLO;
        array [2].pz=Piezas.ALFIL;
        array [3].pz=Piezas.DAMA;
        array [4].pz=Piezas.REY;
...
        array [7].cl=Colores.NEGRO;
        array [6].pz=Piezas.PEON;
        array [6].cl=Colores.NEGRO;


Se debe utlizar de la siguiente forma:

Código (java) [Seleccionar]
array[COLUMNA][FILA] = new Pieza();

Un saludo.

TheFICBoss

#4
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

Alien-Z

#5
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 (java) [Seleccionar]
public class Tablero {
  Pieza array[][]=new Pieza[7][7];
  public Tablero(){  
     for(int i=0;i<8;i++)
        for(int j=0;j<8;j++)
           array[ i][j]=new Pieza();
       
  }


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 (java) [Seleccionar]
  public Pieza() {
    this.pz=null;
    this.cl=null;
  }


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.

TheFICBoss


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

TheFICBoss

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].

Alien-Z

#8
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?.

TheFICBoss



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