Kartenteileen -- brauche Denkanstoss
-
Hallo,
Also ich versuche ein kleines Kartenspiel zu programmieren. Doch nun habe ich ein Problem. Das Spiel hat 32 Karten, welche in 2 Gruppen mit je 16 zufällig gewählten Karten geteilt werden sollen. Nun kann man ja zb. mit der funkion radom 32 Zufallszahlen von 0-31 an 2 16ner arrays zuteilen. Doch es darf ja jede Karte nur einmal verwendet werden, dh. array[0] = (perzufall zugewiesener Wert) 1
nun darf array[1] nicht wieder die 1 erhalten.
Ich hoffe Ihr verstet was ich meine
Habt Ihr vielleichht eine Idee, wie ich dieses Problem lösen kann?
-
in einem anderen array merken welche zahlen schon vergeben sind
-
Hallo
oder du erstellst ein dynamisches Array (vector?), in dem du beim Anfang alle 32 Zahlen nacheinander reinschreibst.
Bei jedem Durchgang zum Verteilen einer Karte bestimmst du eine Zufallszahl aus dem Bereich 0-aktuelle Arraygröße. Die Zahl an dieser Position im Array verteilst du und löscht diese Position im Array. Das machst du solange, wie noch Zahlen im Array sind.bis bald
akari
-
Hmmmm
Danke für eure antworten.
Also das 2te ist mir zu hoch
Aber zum ertsen, dann müsste ich überpruefen ob die zufallszahl x element vom array y ist, doch wie geht das mit "element"?
-
Hallo
hier mal ein Beispiel mit 5 Karten :
Anfang : Array {1,2,3,4,5} // Jede Zahl steht für eine Karte
1. Durchgang :
- Zufallszahl suchen aus Bereich 0-4, Ergebnis 3
- Karte an Position 3 (Nummer 4) verteilen
- Position 3 aus Array löschen -> Array {1,2,3,5}
2. Durchgang :
- Zufallszahl suchen aus Bereich 0-3, Ergebnis 1
- Karte an Position 1 (Nummer 2) verteilen
- Position 1 aus Array löschen -> Array {1,3,5}
3. Durchgang :
- Zufallszahl suchen aus Bereich 0-2, Ergebnis 2
- Karte an Position 2 (Nummer 5) verteilen
- Position 2 aus Array löschen -> Array {1,3}
4. Durchgang :
- Zufallszahl suchen aus Bereich 0-1, Ergebnis 0
- Karte an Position 0 (Nummer 1) verteilen
- Position 0 aus Array löschen -> Array {3}
5. Durchgang :
- die letzte Karte verteilenDer Witz ist eben die ständige Einschränkung des dynmischen Arrays.
bis bald
akari
-
Das kann man auch einfacher lösen. Er braucht ja nur einen vector (list ?) mit den Zahlen 0 bis 31 zu füllen. Diese Zahlen dann (z.Bsp. mit random_shuffle) in dem vector zufällig verteilen und den vector in zwei vectoren a 16 Elemente aufteilen.
alsovector<int> vect; for( int i=0; i<32; ++i) vect.push_back(i); random_shuffle(vect.begin(), vect.end()); vector<int> vect1, vect2; for( int i=0; i<16; ++i) { vect1.push_back(vect[i]); vect2.push_back(vect[i+16]); }
Die Schleifen kann man sicherlich auch noch durch Funktionen aus der stl ersetzen (z.Bsp. copy).
-
nimm
<vector> statt array
dann
1. hole zufallszahl
2. gehe vector durch von element 0 bis end
3. bei jedem wert vergleiche wert mit akt zufallswert
4. wenn wert gefunden, dann break, mache nichts, hole neue zufallszahl
5. wenn wert nicht gefunden ( man hat also die karte noch nicht ) dann mache push_back
6. wenn vec länge von "16" z.b. dann stopp vorgang
-
Da ist Braunsteins Lösung aber besser.
-
ja seine weise ist wirklich besser
hab methode random noch nicht gekannt
aber seine schleife stimmt nicht
er muss sozusagen von "hand" die werte reinschreiben
ich kenne kein kartengame das karten mit wert 1-32 hat, sondern eher K1,K2,B1,B2 ect.
-
Das ist ja auch nur ein Beispiel. Außerdem könnten die Zahlen ja auch Indizes für einen vector<string> (oder was ähnliches sein), in dem dann die korrekten Bezeichnungen stehen. Ich würd random_shuffle bloß nicht gern auf strings anwenden.