Comunidad de diseño web y desarrollo en internet online

Array Shuffle duda con while

Citar            
MensajeEscrito el 09 Jun 2014 04:01 am
aqui dejo un code que saque de un e-book que se llama ActionScript 3.0 Game Programming University 2e
me lo estoy leyendo poco a poco pero tengo una duda con el while que es la siguiente, x cierto deje comentarizado el code si me equivoco el algo por favor corrijanme

Código :

var startDeck:Array = new Array(); // crear un array vacio 
for(var cardNum:int=0;cardNum<52;cardNum++) // inicia un ciclo desde 0 hasta 51
{
   startDeck.push(cardNum); // agrega n numero a la ultima posicion del array
} 
trace("Unshuffled:",startDeck); // imprime por consola el array 

// shuffle into new array
var shuffledDeck:Array = new Array(); // crea un 2do array vacio
while (startDeck.length > 0) // esto es lo que no entendiendo
{
   var r:int = Math.floor(Math.random()* startDeck.length); // genera un numero random entero que va desde 0 hasta 51
   shuffledDeck.push(startDeck[r]); // agrega el numero random a la ultima posicion del array
   startDeck.splice(r,1); // se ubica en la posicion R que es el numero random generado anteriormente, luego elimina
   // los elementos que se encuentra desde esa posicion hasta la 1
}
trace("Shuffled:", shuffledDeck); // imprime el 2do array


Código :

while (startDeck.length > 0) //

no entiendo la condicion del while dice:
51>0 ?
si esto arroja un valor booleano = verdadero ingresa en el while pero no entiendo porque no tiene
incremento (++) o decremebto (--)
1) el while se ejecuta 51 veces? si esto es asi:
a)como lleva la cuenta si no tiene el operador ++ o --
por ejemplo asi:

Código :

var w:Number = 0; // el while inicia en 0
while ( w < 10) // cuando w sea menos a 10 ejecutate
{
   trace(w,"hola") // imprime w, que es el numero n de 0 a 9 y la palabra hola
   w++ // incrementa + 1 la variable w

}

b) como se comparte ese while?
no entiendo de verdad, por favor aclárenme esta duda.

Por Jenniferp

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Jun 2014 06:34 am
La cuestión en este caso no es llevar la cuenta de las iteracciones del while sino asegurarte que saldrás alguna vez de él, es decir que terminará alguna vez para no entrar en un bucle infinito.

Esta condición en principio está asegurada ya que con splice te estas asegurando que en cada iteracción eliminas un elemento. Yo creo que con startDeck.splice(r,1); eliminas un sólo elemento cada vez y es el que estuviera en la posición r.
Una vez eliminado la siguiente vez que se evalue el while , su longitud será 1 menos y así hasta que finalmente lo dejes vacío por lo que saldrías del while.

Intenta hacer un debug y podrás ver poco a poco lo que te comento; puedes poner un valor más bajo por ejemplo 5 o 6 en vez de 51.

Saludos

Por empardopo

71 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2014 05:25 pm
gracias por responder, todavía no logro entender como sale del ciclo infinito

Por Jenniferp

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Jun 2014 05:35 am
A ver si así lo ves mejor

Código Flex :

var shuffledDeck:Array = new Array(); // crea un 2do array vacio
var longitud:int = startDeck.length;
while ( longitud > 0) // esto es lo que no entendiendo
{
   var r:int = Math.floor(Math.random()* startDeck.length); // genera un numero random entero que va desde 0 hasta 51
   shuffledDeck.push(startDeck[r]); // agrega el numero random a la ultima posicion del array
   startDeck.splice(r,1); 
   longitud =  startDeck.length;
   trace(longitud);
}
trace("Shuffled:", shuffledDeck); // imprime el 2do array


Te he metido una variable llamada longitud que será igual al número de elementos del array startDeck.
Al comenzar el bucle tendrá 51 elementos pero despues del primer splice desciende una unidad. Como ahora estoy usando la variable tengo que actualizarla al nuevo valor y por eso la actualizo.
El bucle vuelve a ejecutarse pero ahora longitud vale 50. Volvemos a quitar un elemento y actualizamos, etc, etc. Es decir en cada pasada longitud vale una unidad menos hasta que llegue a cero y saldremos del while.
Ahora te he puesto un trace a la variable debug, pruébalo para verlo más claro.

Saludos

Por empardopo

71 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Jun 2014 11:05 am
Muchísimas gracias ya pude entender! gracias de verdad!!!!

Por Jenniferp

9 de clabLevel



 

chrome

 

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