C++: Kann ich diesen Code irgendwie noch vereinfachen?
Guten Abend,
ich schreibe gerade in C++ an einem kleinen Kniffelspiel. Im Moment bin ich soweit, dass ich mir fünf zufällige Zahlen (Würfel) über die rand()-Funktion erstelle, diese dann in einem Vektor speichere und anschließend über die Funktion auswertung() den höchsten Pasch zurückgebe. Jedoch ist der Code nicht gerade sehr kompakt. Hat jemand Vorschläge für Optimierungen?
Vielen Dank im Voraus!
#include <iostream>
#include <ctime>
#include <vector>
#include <random>
using namespace std;
vector<int> würfe()
{
vector<int> list; // Ermittelt über die aktuelle Systemzeit 5 Zufallszahlen und übergibt sie dem Vektor list
srand(time(0));
for (int i = 0; i < 5; i++) {
list.push_back(1 + rand() % 6);
cout << list[i];
}
cout << endl;
return list;
}
int auswertung(vector<int> ergebnis)
{
int pasch = 0;
// Verschachtelte for-Schleife iteriert durch Vektor und vergleicht alle Elemente miteinander
for (vector<int>::iterator it = ergebnis.begin(); it != ergebnis.end(); ++it) {
for (vector<int>::iterator it1 = ergebnis.begin(); it1 != ergebnis.end(); ++it1) {
// Nur wenn die Werte gleich sind (Pasch) und nicht auf dasselbe Element zeigen, geht es weiter
if (*it1 == *it && it != it1) {
// Nur wenn der gefundene Pasch höher als der Höchste bereits gefundene ist, wird er ausgewertet
if (*it > pasch) {
switch (*it) {
case 1: pasch = 1;
break;
case 2:
pasch = 2;
break;
case 3: pasch = 3;
break;
case 4: pasch = 4;
break;
case 5: pasch = 5;
break;
case 6: pasch = 6;
break;
}
}
}
}
}
return pasch;
}
int main()
{
int pasch;
vector<int> random = würfe();
pasch = auswertung(random);
cout << "Pasch: " << pasch << endl;
}
2 Antworten
Hier ne andere Möglichkeit die nur eine Schleifendurchlauf benötigt:
Du hast ja nur 6 Werte im Würfel.
Also können wir die randomwerte schon am Anfang zählen.
Liste mit 6 werten die am Anfang alle null sind.
Wenn du ne 1 würfelst zählste den 1. Wert in der Liste hoch. Bei ner 5 den 5.
Wenn du mit den würfen dich bist haste ne Liste mit zahlen wie oft diese gefallen ist.
Z.b. 1 0 3 0 1 0
Also 1 einser 3 dreier und 1 Fünfer.
Nun musste nur noch die Liste durchlaufen und schauen welcher Wert mindestens 2 ist und dann haste deine pasches.
Fertig.
Code mässig dürfte das wesentlich weniger kompliziert werden. Anstatt die Zahlen einfach in die Liste zu Puschen bitte diese als Index (minus 1 natürlich) um den Inhalt der Liste hochzuzählen.
Plus du sparst dir die geschachtelten schleifen die dir bei sehr vielen würden eh von der Rechenzeit explodieren würden.
du kannst deine for-schleifen umbauen
die erste zählt i von 0 bis 5 die zweite j von i+1 bis 6
das spart Durchläufe und die Prüfung, ob i und j gleich sind.
ganz allgemein sind schleifen auch um einiges schneller, wenn du sie so schreibst
int i=5; do ... while --i;
einmal zahlst du rückwärts, das macht mich nicht viel aus, aber du kannst dann die prüfung auf die abbruchbedingung weglassen, weil while bei 0 abbricht.
Zum Schluss ist --i schneller als i--