Astuce Mélangez les cartes (ou n’importe quel élément) avec l’algorithme de mélange de Fisher-Yates

Dans ce petit conseil, je vais vous montrer comment implémenter l'algorithme de lecture aléatoire Fisher-Yates. Une fois que nous aurons appris son fonctionnement, nous l’utiliserons pour mélanger un jeu de cartes virtuel..

Remarque: Bien que ce tutoriel soit écrit en JavaScript, vous devriez pouvoir utiliser les mêmes techniques et concepts dans presque tous les environnements de développement de jeux..


1. Introduction à l'algorithme

Il existe plusieurs façons de mélanger un ensemble d'éléments, comme illustré dans ce post. Bien que toutes ces options soient valables, la seule méthode que j’ai toujours utilisée est celle mise en œuvre par l’algorithme Fisher-Yates Shuffle..

J'aime cette méthode car elle effectue un mélange "en place" sans qu'il soit nécessaire de créer un nouveau tableau (ou quelque structure de données que vous utilisiez)..


2. Utilisation de l'algorithme

Si vous avez parcouru rapidement la page Wikipédia, vous aurez déjà vu qu'elle mentionne différentes méthodes d'implémentation de l'algorithme. Celui que nous utiliserons s'appelle la "méthode moderne":

Pour mélanger un tableau a de n éléments (indices 0… n-1): pour i de (n - 1) jusqu'à 1, définissez j sur un entier aléatoire avec 0 ≤ j ≤ i, échangez a [j] et a [i ]
  1. Vous commencez avec le dernier élément de la liste (la carte du dessus dans le paquet, si vous voulez).
  2. Vous choisissez un autre élément au hasard entre le premier et le sélectionné.
  3. Vous échangez ces deux éléments.
  4. Vous choisissez l’avant-dernier élément de la liste (la deuxième carte du paquet) et répétez les étapes 1 à 3 jusqu’à atteindre le bas du paquet..

J'ai mis en place une démonstration visuelle montrant les étapes de l'algorithme. Espérons que cela clarifie l'explication ci-dessus:


Traduire cela en un pour La boucle ressemblerait à ceci:

var someArray = [1,2,3,4,5,6,7,8,9]; var theLength = someArray.length - 1; var toSwap; // L'indice que nous allons échanger (c'est-à-dire le nombre aléatoire) var temp; // Une variable temporaire pour conserver la référence à la variable d'index i sur laquelle pointe pour (i = la longueur; i> 0; i--) toSwap = Math.floor (Math.random () * i); temp = someArray [i]; someArray [i] = someArray [toSwap]; someArray [toSwap] = temp; 

La raison pour laquelle nous avons besoin de temp variable est parce que nous devons avoir une référence au premier élément. Si nous n'avions pas de référence au premier élément, nous perdrions le premier lorsque nous échangions le deuxième élément contre le premier. Puisque le premier élément est maintenant égal au deuxième, lorsque nous échangerons le premier avec le second, il s'agirait du "deuxième élément", car le deuxième élément est maintenant à la place du premier. En ayant une référence au premier élément, nous pouvons alors définir le deuxième élément à la place.


3. Mettre l'algorithme en pratique

La démonstration ci-dessus est intéressante pour une représentation visuelle du fonctionnement de l’algorithme, mais pour l’utiliser concrètement, nous allons maintenant l’utiliser pour mélanger des cartes virtuelles. Ci-dessous le code.

$ (function () var serverString = "http://source.tutsplus.com/gamedev/authors/JamesTyner/FisherYates/src/images/"; var cartes = []; var i; pour (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 ('clic', shuffle); var theLength = cards.length - 1; var toSwap; var tempCard; function shuffle () console.log ( "Cartes avant shuffle:" + cartes); pour (i = la longueur; i> 0; i--) toSwap = Math.floor (Math.random () * i); tempCard = cartes [i]; cartes [i ] = cartes [toSwap]; cartes [toSwap] = tempCard; console.log ("Cartes après lecture aléatoire:" + cartes); drawCards (););

Ici, nous créons un jeu de treize cartes, puis nous les mélangeons lorsque vous appuyez sur le bouton de lecture aléatoire. L’algorithme Fisher-Yates Shuffle est implémenté dans le mélanger () une fonction.

J'ai créé une autre démo pour montrer cela en action, mais vous pouvez aussi l'essayer vous-même avec les fichiers inclus dans les ressources téléchargeables de ce tutoriel..


4. Conclusion

L’algorithme Fisher-Yates Shuffle est l’un des moyens d’implémenter le brassage au sein de vos applications. Il n'est pas nécessaire de créer de nouveaux tableaux, car le shuffle est en place. Je suis un grand fan de cet algorithme de lecture aléatoire, et peut-être que vous l'êtes aussi.

Merci de votre lecture et j'espère que vous avez trouvé ce tutoriel utile.