En este Consejo rápido, te mostraré cómo implementar el algoritmo de shuffle de Fisher-Yates. Una vez que hayamos aprendido cómo funciona, lo utilizaremos para barajar una baraja de cartas virtual.
Nota: Aunque este tutorial está escrito con JavaScript, debes poder usar las mismas técnicas y conceptos en casi cualquier entorno de desarrollo de juegos.
Hay varias formas de barajar un conjunto de elementos, como se muestra en esta publicación. Si bien todas estas son opciones válidas, el único método que siempre he usado es el implementado por el algoritmo de Shuffle de Fisher-Yates..
Me gusta este método porque hace una mezcla "in situ" sin la necesidad de crear una nueva matriz (o cualquier estructura de datos que esté usando).
Si le dio a la página de Wikipedia una lectura rápida, habrá visto que menciona un par de métodos diferentes para implementar el algoritmo. El que usaremos se llama "Método moderno":
Para mezclar una matriz a de n elementos (índices 0… n-1): para i desde (n - 1) hasta 1, establezca j en un entero aleatorio con 0 ≤ j ≤ i intercambie a [j] y a [i ]
He reunido una demostración visual que muestra los pasos que toma el algoritmo. Esperemos que haga más clara la explicación anterior:
Traduciendo esto en una para
el bucle se vería así:
var someArray = [1,2,3,4,5,6,7,8,9]; var theLength = someArray.length - 1; var toSwap; // El índice que intercambiaremos (es decir, el número aleatorio) var temp; // Una variable temporal para mantener la referencia a la variable de índice a la que apunta para (i = theLength; i> 0; i--) toSwap = Math.floor (Math.random () * i); temp = someArray [i]; someArray [i] = someArray [toSwap]; someArray [toSwap] = temp;
La razón por la que necesitamos el temperatura
La variable es porque necesitamos tener una referencia al primer elemento. Si no tuviéramos una referencia al primer elemento, entonces cuando intercambiamos el segundo elemento con el primero, perderíamos el primer elemento. Dado que el primer elemento ahora es igual al segundo, cuando intercambiamos el primero con el segundo, "sería el segundo elemento", ya que el segundo elemento ahora está en el lugar del primero. Al tener una referencia al primer elemento, podemos establecer el segundo elemento igual en su lugar..
La demostración anterior es agradable para una representación visual de cómo funciona el algoritmo, pero para usarlo en el mundo real, ahora lo usaremos para barajar algunas tarjetas virtuales. A continuación se muestra el código.
$ (function () var serverString = "http://source.tutsplus.com/gamedev/authors/JamesTyner/FisherYates/src/images/"; var cards = []; var i; para (i = 1; i <= 13; i++) cards.push("c" + i); //console.log(cards); function drawCards() $("#holder").empty(); for (i = 0; i < cards.length; i++) $("#holder").append(""); drawCards (); $ (" # shuffle "). on ('click', shuffle); var theLength = cards.length - 1; var toSwap; var tempCard; function shuffle () console.log ( "Cartas antes de barajar:" + cartas); para (i = theLength; i> 0; i--) toSwap = Math.floor (Math.random () * i); tempCard = cards [i]; cards [i ] = cards [toSwap]; cards [toSwap] = tempCard; console.log ("Cards after shuffle:" + cards); drawCards (););
Aquí creamos un mazo de trece cartas, y luego las barajamos cuando se presiona el botón de barajar. El algoritmo Fisher-Yates Shuffle se implementa en el barajar()
función.
He creado otra demostración para mostrar esto en acción, pero también puedes probarlo con los archivos incluidos en los recursos descargables de este tutorial..
El algoritmo de Shuffle de Fisher-Yates es una de las varias formas de implementar la mezcla en sus aplicaciones. No hay necesidad de crear nuevas matrices, ya que hace el orden aleatorio en su lugar. Soy un gran fan de este algoritmo aleatorio, y tal vez ahora también lo estés..
Gracias por leer y espero que hayan encontrado útil este tutorial..