Comunidad de diseño web y desarrollo en internet online

Problema con Array Bidimensional

Citar            
MensajeEscrito el 23 Ago 2009 04:09 pm
Hola!

Verán, estoy realizando una aplicación en el que recojo cierta información de elementos desde un XML. La aplicación consiste en arrastrar los elementos a un tablero en el escenario que tendrá las dimensiones que haya indicado el usuario al iniciar la aplicación. Bien, hasta ahí todo bien. El tablero que se crea se corresponde con una Matriz de N x M (array bidimensional) la cual me ayuda a saber que elementos hay en el tablero y dónde están situados, si hay un número 0 en tablero[i][j], es que está libre esa posición, y si hay un 1 es que está ocupada.

El problema viene cuando voy a colocar un elemento en el tablero. Al soltar el elemento que estoy arrastrando en el tablero debe comprobarse si esa posicion en la Matriz está a 0 para poder colocarlo, pero la comprobación ' tablero[i][j] == 0 ' siempre me da como resultado 'false' porque a la hora de comprobar con el trace, tablero[i][j] me muestra unsigned.

Os pongo el código para crear el tablero:

Código ActionScript :

class Parque {
   
   // PROPIEDADES
   
   private var n:Number;   //dimension x del tablero del parque
   private var m:Number;   //dimension y del tablero del parque
   
   private var tablero:Array = null;   //Matriz (array de arrays) del parque (0 casilla vacia, 1 casilla ocupada)
   private var suelo:MovieClip = null;
   
   private var fichas:Array = null;
   
   
   // CONSTRUCTOR
   
   public function Parque (tamX:Number, tamY:Number) {
      n = tamX;
      m = tamY;
      //creamos el tablero y lo inicializamos todo a 0
      tablero = new Array(n);
      var i:Number;
      var j:Number;
      for (i = 0; i < n; i++){
         tablero[i] = new Array(m);
         for (j = 0; j < m; j++){
            tablero[i][j] = 0;
         }
      }
   }
        ...
}


Y el código que comprueba si el sitio está vacio:

Código ActionScript :

//Comprobar si hay hueco libre al situarlo
   public function haySitio(posx:Number, posy:Number, ancho:Number, alto:Number):Boolean {
      var valido:Boolean = true;
      var i:Number = 0;
      var j:Number = 0;
      
      var xx:Number;
      var yy:Number;
      xx = (posx - getPosX()) / 20;
      yy = (posy - getPosY()) / 20;
      var posxfinal:Number = xx + ancho;
      var posyfinal:Number = yy + alto;

      for (i = xx; i < posxfinal; i++) {
         for (j = yy; j < posyfinal; j++) {
            valido = valido && (tablero[i][j] == 0);
         }
      }
      
      return (valido);
   }

Espero que me puedan echar una mano, gracias! :)

Por Reverendo

26 de clabLevel



Genero:Masculino  

Málaga

firefox
Citar            
MensajeEscrito el 30 Ago 2009 01:30 pm
Ese método "haysitio" lo ejecuto cuando hago stopDrag en el objeto que estoy arrastrando de forma que, si devuelve true, le daré al objeto las posiciones X,Y adecuadas. Pero da siempre "false" porque descubrí haciendo trace(tablero[i][j]) que por cada posición de i y de j, tablero[i][j] devuelve "undefined" (no unsigned como dije antes, que tuve un lapsus), lo cual no se porque, porque al hacer startDrag le digo ke me imprima por pantalla (con el trace denuevo) los valores de tablero y me da los valores (0 ó 1) correctamente.
Todavía no he conseguido saber porque me sale este error, espero que me ayuden...

Por Reverendo

26 de clabLevel



Genero:Masculino  

Málaga

firefox
Citar            
MensajeEscrito el 31 Ago 2009 05:29 am
Hola Reverendo,

Hay una cosa en tu código que no consigo entender: porque recorres parte de la matriz cuando buscas si el sitio está vacío?
Entiendo lo siguiente: tienes una matriz en la que cada fila y columna se relaciona con una área del tablero, es decir, si hacemos stopDrag en (0,0), miraremos el valor de tablero[0][0], pero también (supongo) si hacemos stopDrag en (0,1.1) o (2.4,6), no? Supongo que me explico? Lo que no entiendo, y por eso no sé como ayudarte, es qué es lo que haces en tu método. Parece que encuentras una X e Y iniciales y finales y recorres la matriz por esas columnas y filas. Si haces eso el resultado que devuelves será el del último valor consultado. Igualmente, podrías comentar el metodo un poco? A ver si damos con el problema.

Saludos,
Lîtus

Por lîtus

8 de clabLevel



 

--> x <--

firefox
Citar            
MensajeEscrito el 02 Sep 2009 07:38 pm
Si, verás. El objeto que arrastro al tablero lo cojo de una lista de objetos, y cada uno de éstos tiene una superficie determinada, es decir, un ancho y un alto, que no serán el mismo para todos los objetos. Lo que pretendo al cambiar los balores de tablero a 1, es dejar reflejado en la matriz las casillas que cubren los objetos en el tablero.

Como ejemplo, si tengo el siguiente tablero y objeto y le arrastro el objeto quedaría de la siguiente forma por ejemplo:

Código :

0 0 0 0 0 0 0 0 0 0                                     0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0        1 1 1 1 1 1       ->         0 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0        1 1 1 1 1 1                  0 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0                                     0 0 0 0 0 0 0 0 0 0

       tablero                    objeto           tablero con objeto situado

Perdonad la ilustración rudimentaria... xD

Por eso escribo sólo en una parte del tablero. Empiezo a escribir en un X e Y, y termino de escribir en un Xfinal y un Yfinal.
La cosa es que la función para escribir la superficie que cubre el objeto si funciona correctamente. Lo que no me funciona es antes de escribir que compruebo la zona que voy a escribir, cuando recorro esa parte del tablero mirando que sean ceros cada casilla (para saber que no hay ningun objeto en la superficie donde voy a lotarlo) pero esa comprobación me da siempre false porque dentro de la función de esa comprobación tablero[i][j] me da como resultado undefined...

Espero haber aclarado mejor lo que quiero hacer y mi problema.

Por Reverendo

26 de clabLevel



Genero:Masculino  

Málaga

firefox
Citar            
MensajeEscrito el 02 Sep 2009 08:48 pm
Hola,
prueba a cambiar la línea:

Código ActionScript :

valido = valido && (tablero[i][j] == 0);

por:

Código ActionScript :

if (tablero[i][j] != 0) valido = false;

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Sep 2009 10:55 pm
Nada, aunque es más eficiente hacerlo así (sobre todo si lo pongo dentro de un while para que no siga iterando), la función no va. No sé por qué.

Le he colocado la siguiente instrucción de trace justo delante de la instrucción que he cambiado poniendo lo que me dijiste:

Código ActionScript :

trace("valido ("+valido+") && "+tablero[i][j]+" == 0 ("+(tablero[i][j] == 0)+")");
Y ésta me devuelve por pantalla lo siguiente:

Código :

valido (false) && undefined == 0 (false)

Cuando ahí, tablero[i][j] debería darme 0 ó otro número...

Por Reverendo

26 de clabLevel



Genero:Masculino  

Málaga

firefox
Citar            
MensajeEscrito el 03 Sep 2009 07:31 am
Hola,
he modificado un poco tu clase para probar y sí que funciona:

Código ActionScript :

class Parque { 
    
   // PROPIEDADES 
    
   private var n:Number;   //dimension x del tablero del parque 
   private var m:Number;   //dimension y del tablero del parque 
    
   private var tablero:Array = null;   //Matriz (array de arrays) del parque (0 casilla vacia, 1 casilla ocupada) 
   private var suelo:MovieClip = null; 
    
   private var fichas:Array = null; 
    
    
   // CONSTRUCTOR 
    
   public function Parque (tamX:Number, tamY:Number) { 
      n = tamX; 
      m = tamY; 
      //creamos el tablero y lo inicializamos todo a 0 
      tablero = new Array(n); 
      var i:Number; 
      var j:Number; 
      for (i = 0; i < n; i++){ 
         tablero[i] = new Array(m); 
         for (j = 0; j < m; j++){ 
            tablero[i][j] = 0; 
         } 
      } 
     
     //Esto es para hacer pruebas:
     tablero[3][3] = 1;
   }
   
   public function haySitio(posx:Number, posy:Number, ancho:Number, alto:Number):Boolean { 
      var valido:Boolean = true; 
     
     var xx:Number = posx;
     var yy:Number = posy;
      var posxfinal:Number = xx + ancho; 
      var posyfinal:Number = yy + alto; 
 
      for (var i:Number = xx; i < posxfinal; i++) { 
         for (var j:Number = yy; j < posyfinal; j++) { 
            valido = valido && (tablero[i][j] == 0); 
         } 
      } 
       
      return (valido); 
   }
}

Y en el .fla:

Código ActionScript :

import Parque;
var parque:Parque = new Parque(10, 10);

trace(parque.haySitio(2, 2, 4, 4));

En las pruebas que he hecho funciona bien, así que me imagino que el fallo estará en las funciones getPosX() y getPosY(). tablero[i][j] sólo me devuelve undefined si se le pasa un objeto de tamaño mayor que el tablero, en cuyo caso haySitio devuelve false, así que no hay problema.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 04 Sep 2009 03:44 pm
Ey, si que funciona. Al decirme eso me he fijado y ya descubrí mi error. Lo que pasaba era un error y descuido bastante tonto.

En efecto, el problema estaba cuando calculaba las posiciones a la hora de recorrer el array, aunque no en la función getPosX() y getPosY(). Simplemente me descuidé y llamaba a la función haySitio con las posiciones reales del elemento en el escritorio y estas posiciones son números con decimales mientras que en el array las posiciones son números enteros y no hice la conversión y, por lo tanto, se daban situaciones como tablero[2.34][1.05] y esto, claro, da undefined porque no lo encuentra en el array.

Muchas gracias Isidoro por ayudarme a dar con el problema. Un saludo!! :)

Por Reverendo

26 de clabLevel



Genero:Masculino  

Málaga

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.