Simsala Animationen Geschrieben 30. August 2017 Melden Share Geschrieben 30. August 2017 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 More sharing options...
Djeurissen Geschrieben 30. August 2017 Melden Share Geschrieben 30. August 2017 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 More sharing options...
Hellhound Geschrieben 30. August 2017 Melden Share Geschrieben 30. August 2017 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 More sharing options...
Sascha Geschrieben 30. August 2017 Melden Share Geschrieben 30. August 2017 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.