In questo suggerimento rapido, ti mostrerò come implementare l'algoritmo shuffle di Fisher-Yates. Una volta che abbiamo imparato come funziona, lo useremo per mescolare un mazzo di carte virtuale.
Nota: Sebbene questo tutorial sia scritto usando JavaScript, dovresti essere in grado di utilizzare le stesse tecniche e concetti in quasi tutti gli ambienti di sviluppo di giochi.
Ci sono diversi modi per mescolare un insieme di elementi, come dimostrato in questo post. Mentre quelle sono tutte opzioni valide, l'unico metodo che ho sempre usato è quello implementato dall'algoritmo di Fisher-Yates Shuffle.
Mi piace questo metodo perché fa uno shuffle "sul posto" senza la necessità di creare un nuovo array (o qualsiasi altra struttura dati che si sta usando).
Se hai dato una rapida lettura alla pagina di Wikipedia, avrai visto che menziona un paio di metodi diversi per implementare l'algoritmo. Quello che useremo si chiama "Metodo moderno":
Mescolare un array a di n elementi (indici 0 ... n-1): per i from (n - 1) down a 1 do set j ad un intero casuale con 0 ≤ j ≤ scambio di un [j] e un [i ]
Ho creato una demo visiva che mostra i passaggi che l'algoritmo richiede. Speriamo che chiarisca la spiegazione di cui sopra:
Traducendo questo in a per
loop sarebbe simile a questo:
var someArray = [1,2,3,4,5,6,7,8,9]; var theLength = someArray.length - 1; var toSwap; // L'indice che scambiamo (cioè il numero casuale) var temp; // Una variabile temporanea per mantenere il riferimento alla variabile index i punta a for (i = theLength; i> 0; i--) toSwap = Math.floor (Math.random () * i); temp = someArray [i]; someArray [i] = someArray [toSwap]; someArray [toSwap] = temp;
Il motivo per cui abbiamo bisogno del Temp
variabile è perché abbiamo bisogno di avere un riferimento al primo elemento. Se non avessimo un riferimento al primo elemento, allora quando scambiavamo il secondo elemento con il primo, avremmo perso il primo elemento. Poiché il primo elemento equivale al secondo, quando scambiamo il primo con il secondo sarebbe "essere il secondo elemento", poiché il secondo elemento è ora al primo posto. Avendo un riferimento al primo elemento, possiamo quindi impostare il secondo elemento ad esso uguale.
La dimostrazione precedente è utile per una rappresentazione visiva di come funziona l'algoritmo, ma per utilizzarlo nel mondo reale lo useremo per mescolare alcune carte virtuali. Di seguito è riportato il codice.
$ (function () var serverString = "http://source.tutsplus.com/gamedev/authors/JamesTyner/FisherYates/src/images/"; var cards = []; var i; for (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 ( "Carte prima shuffle:" + carte); per (i = theLength; i> 0; i--) toSwap = Math.floor (Math.random () * i); tempCard = cards [i]; cards [i ] = carte [toSwap]; carte [toSwap] = tempCard; console.log ("Carte dopo shuffle:" + carte); drawCards (););
Qui creiamo un mazzo di tredici carte e poi le mescoliamo quando viene premuto il pulsante shuffle. L'algoritmo di Fisher-Yates Shuffle è implementato nel Shuffle ()
funzione.
Ho creato un'altra demo per mostrarla in azione, ma puoi anche provare tu stesso con i file inclusi nelle risorse scaricabili di questo tutorial.
L'algoritmo di Fisher-Yates Shuffle è uno dei vari modi per implementare il shuffling all'interno delle tue applicazioni. Non è necessario creare nuovi array, poiché lo shuffle è sul posto. Sono un grande fan di questo algoritmo shuffle, e forse ora lo sei anche tu.
Grazie per la lettura e spero che tu abbia trovato utile questo tutorial.