Jump to content
Unity Insider Forum

Karten mischen per Script


Simsala Animationen

Recommended Posts

Hallo, ich habe im Internet ein Tutorial gefunden das dafür gut ist um Karten zu mischen, so das keine Karten doppelt vorhanden sind oder im Deck plötzlich verschwinden, so wie es sein sollte. Ich habe es etwas für mich vereinfacht. Es sieht so aus.

  public string [] kart;
 public string kartenspeicher; 
 public int zufall;
 public int i;
   void Update()
    {
         zufall = Random.Range (0, kart.Length);


        for(i = 0; i < kart.Length ;i++ )
        {
            
            kartenspeicher = kart [i];

            kart [i] = kart [zufall];

            kart [zufall] = kartenspeicher; // warum diese Zeile dazu führt das die Karten nicht doppelt sind oder verschwinden verstehe ich nicht

        }

}
 

 

Ich versuche jetzt schon länger zu verstehen warum die Zeile hinter die ich auch geschrieben habe das ich nicht verstehe warum sie so funktioniert dazu  führt das nichts doppelt oder

ist oder im Deck verschwindet. Ich komme aber einfach nicht dahinter. Könnte jemand so nett sein und mir erklären warum es dadurch so klappt wie es klappen soll?










 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

kartenspeicher = kart [i]; //Merke dir die aktuelle Karte

kart [i] = kart [zufall]; // Setze an die Stelle von der aktuellen Karte irgendeine zufällige Karte

kart [zufall] = kartenspeicher; // Setze an die Stelle von der zufälligen Karte die aktuelle Karte die wir uns gemerkt haben

 

Das was oben beschrieben ist, macht nichts weiter als deine aktuelle Karte i mit einer zufälligen Karte zu tauschen.

Dementsprechend kann nichts doppelt vorkommen oder verloren gehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist eigentlich ganz einfach, die letzte Zeile die Du nicht verstehst, stellt sicher, dass die Karte die Du zuvor in Zeile 1 aus dem Deck genommen hast

mit der Karte ausgetauscht wird, die Du in der zweiten Zeile per Zufall ausgewählt hast. Versuche Dir das ganze mal Beispielhaft an einem Pseudo-Ablauf

zu visualisieren:

Kartendeck: Herz 5, Pik 6, Caro Bube, Herz Dame    
Daraus folgt Kart.length = 4

In jedem Durchlauf wird zufällig eine Karte im Range
des Decks ausgewählt:

Zufall = Range (0,4)

Zufallszahl beim Aufruf von Update z.B.: 2
Nun folgen die Iterationen über das Deck:

i=0; i<4; i++
	Kartenspeicher = kart[0]     (Herz5)
    Kart[0] = kart[2]            (Caro Bube)
    Kart[2] = kartenspeicher     (Herz5)

  Kartendeck: Caro Bube, Pik 6, Herz 5, Herz Dame           
          
i=1; i<4; i++
	Kartenspeicher = kart[1]     (Pik 6)
    Kart[1] = kart[2]            (Herz5)
    Kart[2] = kartenspeicher     (Pik 6)

   Kartendeck: Caro Bube, Herz 5, Pik 6, Herz Dame    

usw ...

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum muss das eigentlich in Update passieren? Wenn du einen vernünftigen Mischalgorithmus haben willst, ist das einfachste, immer wieder eine zufällige Karte aus Stapel A zu nehmen und sie auf Stapel B zu legen, bis A leer ist. Ersetze "Stapel" mit "Liste" und du erhältst:

var newStack = new List<Card>(); // Habe mal Card statt string benutzt, kann man machen wie man will

while(stack.Count > 0)
{
  var index = Random.Range(0, stack.Count);
  newStack.Add(stack[index]);
  stack.RemoveAt(i);
}

stack = newStack;

stack ist hier die Liste von Karten, die du schon hast. Am Ende wird eine Referenz auf den neuen Stapel unter stack gespeichert.

Wenn du das jetzt unbedngt über mehrere Frames verteilen willst, mach eine Coroutine draus und warte pro while-durchlauf einen Frame mit

yield return null;

...aber nötig ist das nicht ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...