Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Multidimensionales Array mischen
#1
Hallo Leute,
Grundgedanke ist, ein Kartenspiel zu simulieren.

Die Karten eines Decks sind ein Array, also
Code:
xy.cards = [1,2,3,...]
Das lässt sich ohne Probleme so mischen:

Code:
function arrayShuffle(theArray) {
    var len = theArray.length;
    var i = len;
     while (i--) {
         var p = parseInt(Math.random()*len);
        var t = theArray[i];
          theArray[i] = theArray[p];
          theArray[p] = t;
    }
};
(quelle)

Allerdings gibt es ja schließlich von jeder Karte 4 Farben, somit also
Code:
xy.cards = [['Heart', 'Spade', 'Clubs', 'Diamonds'], ['Heart', 'Spade', 'Clubs', 'Diamonds'], ...]

So ist zum Beispiel Herz-3: xy.cards[2][0] (oder ist hier schon ein Denkfehler?)

Frage: Wie mische ich alle Karten dieses "doppelten", mehrdimensionalen Arrays?
Mit der oberen Methode kann man so nur Zahlen und Farben untereinander mischen.

(ps: Ich weiß bereits, dass ich mit einer Schleife dem Array Stelle für Stelle zufällige Werte zuweisen könnte. Das wäre aber eine Neubesetzung und nicht das, wonach ich suche)
Zitieren
#2
vielleicht mal so:

    JAVASCRIPT Programming
  1. function GetRandom( min, max ) {
  2. if( min > max ) {
  3. return( -1 );
  4. }
  5. if( min == max ) {
  6. return( min );
  7. }
  8. return( min + parseInt( Math.random() * ( max-min+1 ) ) );
  9. }
  10.  
  11. /* INITIALISIERE KARTEN */
  12. var kreuz = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
  13. var pik = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
  14. var dame = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
  15. var karo = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
  16. /* INITIALISIERE DECK */
  17. var pool = new Array(kreuz, pik, dame, karo);
  18. /* INITIALISIERE SPIELER KARTEN */
  19. var karten = new Array(0, 0, 0, 0, 0);
  20.  
  21. /* VERGEBE FÜNF ZUFÄLLIGE KARTEN */
  22. for(var x=0; x<5; x++) {
  23. var farbe = GetRandom(0, 3);
  24. var wert = GetRandom(0, 12);
  25. while(pool[farbe][wert] == 0) {
  26. farbe = GetRandom(0, 3);
  27. wert = GetRandom(0, 12);
  28. }
  29. spieler[x] = new Array(farbe, wert);
  30. pool[farbe][wert] = 0;
  31. }



So in etwa würde ich das angehen. Hab den Code nun nicht ganz getestet und übernehme daher keine Verantwortung für Wink
MfG René
Systemadministrator, Webentwickler

pantanet.de - pantamedia.com - gosna.de

Wishlist
Zitieren
#3
Hey,

Danke für die schnelle Antwort!

Leider ist das nicht, wonach ich gefragt habe. Habe ich ja am Ende erwähnt, dass es mir schon möglich wäre, einfach zufällige Karten zu verteilen. Ich will aber den bestehenden Array mischen.

Aber die Herangehensweise für pro Farbe ein Array ist interessant. Werd ich wahrscheinlich verwenden, wenn ich keine bessere Lösung finde.

PS:
Kürzere Alternative für GetRandom(min, max) wäre
Code:
var rN = Math.floor(Math.random() * 13);
Allerdings gibt es da keinen Minimalwert.
Nutzt den interessanten effekt aus, das Math.random() immer kleiner als Null ist.
Zitieren
#4
Ja, das ist nicht ganz das was du gesucht hast, mir fällt allerdings bei JavaScript keine Variante ein womit man das Array durchschütteln kann, deswegen wollt ich nur eine andere Herangehensweise zeigen Wink

Anstonsten bei dein Array so auf das jede Kombination einmal definiert wird, nach dem motto array[id][farbe][wert], wenn du nun die erste Ebene durcheinander Würfelst sind alle durcheinander.

Gesendet von meinem HTC Desire HD mit Tapatalk
MfG René
Systemadministrator, Webentwickler

pantanet.de - pantamedia.com - gosna.de

Wishlist
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste