Mastermind
-
Ich bin noch sehr sehr neu was das Programmierung angeht. Ich soll für die Uni Mastermind schreiben, scheitere aber schon seit Tagen an den Kennzahlen, die angeben wieviele Zahlen von Code richtig geraten wurden und welche schon an richtiger Position sind.
(Sorry dass das alles noch sehr "durcheinander" aussieht )
Wär Super wenn mir jemand helfen könnte, thx.#include <cstdlib> #include <iostream> #include <time.h> #include <iomanip> using namespace std; int main() { int anz,i,a,b,c,v,pos,rz; srand(time(NULL)); cout <<"Wieviele Stellen soll der Code haben (2-5 Stellen) ? : "; cin >> anz; cout << endl; while ( anz < 2 || anz > 5 ) { cout << "Unzul\x84 \bssige Anzahl, Stellenanzahl neu eingeben (2-5): "; cin >> anz; } int code[5],zahl[5][10],versuch[10]; for (int i=0;i<anz;i++) code[i]= (rand() % 8) +1; cout << "Der Code wird generiert...\n\n\n"; for (v=0;v<10;v++) { cout << "Versuch Nr." << v+1 << "\n\n"; for (b=0;b<anz;b++) { cout << "Zahl ("<< b+1 << "): "; cin >> zahl[b][v]; while ( zahl[b][v] < 1 || zahl[b][v] > 8 ) { cout << "Wertebereich verlassen, neu eingeben\n"; cout << "Zahl ("<< b+1 << "): "; cin >> zahl[b][v]; } } cout << endl; cout << endl << endl; system("Cls"); int kzahl[2][10]; pos = rz = 0; for (i=0;i<anz;i++) { for (b=0;b<anz;b++) { if ( zahl[b][v]==code[i] && b==i) pos++; if ( zahl[b][v]==code[i] ) rz++; } } kzahl[pos][v] = pos; kzahl[rz][v] = rz; for (int d=0;d<=v;d++) { cout << "|"; for (b = 0; b < anz; b++) { cout << setw(2) << zahl[b][d] << setw(2) << "|"; } cout << setw(6) << kzahl[pos][v] << setw(6) << kzahl[rz][v]; cout << endl << endl; } if ( pos == anz ) { cout <<"\n\nSie haben den Code ( "; for (i=0;i<anz;i++) cout << code[i] << setw(2); cout << " ) beim " << v+1 << " .ten Versuch geknackt !\n\n"; system("PAUSE"); exit (0); } } if (v==10) { cout << "Sie hatten ihre 10 Versuche, der Code w\x84 \bre "; for (i=0;i<anz;i++) cout << code[i] << setw(2); cout << " gewesen. \n"; system("PAUSE"); exit (0); } cout << "\n\n"; return EXIT_SUCCESS; }
-
Nur so ein paar Bemerkungen:
<time.h>ist falsch
<ctime>- Du wechselst deinen eignen Codestil während dem Code
- Vermeide
system. Zum Clearen und zum Warten gibt es Äquivalente in<cstdlib>. - Statt dem Makro
EXIT_SUCCESSkönntest du einfach 0 schreiben - Die ganzen Variablen solltest du so lokal wie möglich machen (kommst du von C?)
MfG, EOutOfResources
-
EOutOfResources schrieb:
[*]Statt dem Makro
EXIT_SUCCESSkönntest du einfach 0 schreibenKlar kann er. Er kann sich auch n Knopf an die Backe nähen oder was anderes machen, z.B. garnichts zurückgeben. EXIT_SUCCESS ist völlig legitim udn genau für diesen Zweck definiert worden, warum sollte er es also nicht zurückgeben?
-
int anz,i,a,b,c,v,pos,rz;Nimm vernünftigere Bezeichner. Und wie schon erwähnt, solltest du Variablen lokaler deklarieren, d.h. so spät wie möglich. Schleifenvariablen solltest du erst im Schleifenkopf deklarieren.
int code[5],zahl[5][10],versuch[10];Verschiedene Typen in einer Zeile zu deklarieren halte ich für schlechten Stil.
for (int i=0;i<anz;i++) code[i]= (rand() % 8) +1;Würde ich persönlich auch in zwei Zeilen aufteilen.
exit (0);Vermeide
std::exit()und schreibe stattdessenreturn-Statements in dermain().
-
Danke vorweg für die Tipps,
aber der system("cls") ist nicht schuld daran dass die Kennzahlen nicht funktionieren oder ?Nein ich komme nicht von C, habe mit Programmieren in C++ in der Uni angefangen, das hier wird mein zweites "richtiges" Programm, habe daher an sich auch noch kein eigenen Codestil.
Mein Hauptproblem ( zur Zeit ^^ ) besteht darin, die Matrix für die Kennzahlen richtig zu bestimmen, also nehm ich an in dem Teil liegt der Fehler
int kzahl[2][10]; pos = rz = 0; for (i=0;i<anz;i++) { for (b=0;b<anz;b++) { if ( zahl[b][v]==code[i] && b==i) pos++; if ( zahl[b][v]==code[i] ) rz++; } } kzahl[pos][v] = pos; kzahl[rz][v] = rz;nur ich finde ihn nicht. Bzw es kann auch sein das der gesammte Part garkein Sinn ergibt, wäre Super wenn ihr mir helfen könntet ob das überhaupt in die richtige Richtung geht.

-
Benutze bitte die cpp-Tags, damit man deinen Code einigermaßen lesen kann

-
Schau dir den Ablauf doch mal im Debugger an, dann siehst du was er macht.
Ansonsten: In der Schleife schreibst du in pos und rz die Anzahl der gefundenen Übereinstimmungen (die Bestimmung von pos sieht gut aus, bei rz könntest du Probleme mit mehrfach vorkommenden Farben haben), nach der Schleife nutzt du diese Werte als Array-Index - und schreibst sie irgendwohin in den Speicher.
-
Ich hab das jetzt noch einmal bearbeitet und auf den ersten Blick scheint es zu funktionieren, aber nur wenn ich meine Matrix für die Kennzahlen auf
kzahl[5][10]setze. Aber sollte nicht
kzahl[2][10]ausreichen weil es nur 2 Kennzahlen sind ?
also im gesammten sieht mein Prog. jetzt wie folgt aus :#include <cstdlib> #include <iostream> #include <ctime> #include <iomanip> using namespace std; int main() { int anz; cout <<"Wieviele Stellen soll der Code haben (2-5 Stellen) ? : "; cin >> anz; cout << endl; while ( anz < 2 || anz > 5 ) { cout << "Unzul\x84 \bssige Anzahl, Stellenanzahl neu eingeben (2-5): "; cin >> anz; } int code[5]; srand(time(NULL)); for (int i=0;i<anz;i++) { code[i]= (rand() % 8) +1; } cout << "Der Code wird generiert...\n\n\n"; int zahl[5][10]; int v; for ( v=0;v<10;v++) { cout << "Versuch Nr." << v+1 << "\n\n"; for (int b=0;b<anz;b++) { cout << "Zahl ("<< b+1 << "): "; cin >> zahl[b][v]; while ( zahl[b][v] < 1 || zahl[b][v] > 8 ) { cout << "Wertebereich verlassen, neu eingeben\n"; cout << "Zahl ("<< b+1 << "): "; cin >> zahl[b][v]; } } cout << endl; cout << endl << endl; system("Cls"); int kzahl[5][10]; int pos = 0; int rz = 0; for (int i=0;i<anz;i++) { for (int b=0;b<anz;b++) { if ( zahl[b][v]==code[i] && b==i) pos++; if ( zahl[b][v]==code[i] ) rz++; } } int a,c; kzahl[a][v] = pos; kzahl[c][v] = rz; for (int d=0;d<=v;d++) { cout << "|"; for (int b = 0; b < anz; b++) { cout << setw(2) << zahl[b][d] << setw(2) << "|"; } cout << setw(6) << kzahl[a][d] << setw(6) << kzahl[c][d]; cout << endl << endl; } if ( pos == anz ) { cout <<"\n\nSie haben den Code ( "; for (int i=0;i<anz;i++) cout << code[i] << setw(2); cout << " ) beim " << v+1 << " .ten Versuch geknackt !\n\n"; system("PAUSE"); return 0; } } if (v==10) { cout << "Sie hatten ihre 10 Versuche, der Code w\x84 \bre "; for (i=0;i<anz;i++) { cout << code[i] << setw(2); } cout << " gewesen. \n"; system("PAUSE"); return 0; } cout << endl; return 0; }Ist das jetzt wirklich richtig oder hatte ich bis jetzt immer nur Pech beim Testen und der noch existierende Fehler ist nicht aufgetreten ?
-
Wie gesagt: Du kannst Variablen im Schleifenkopf deklarieren (Zeile 26 & Zeile 27)!
-
Habe ich auch zuerst gemacht, nur dann bekomme ich mit
if (v==10) { cout << "Sie hatten ihre 10 Versuche, der Code w\x84 \bre "; for (i=0;i<anz;i++) { cout << code[i] << setw(2); } cout << " gewesen. \n"; system("PAUSE"); return 0; }Probleme.
-
Dein Programm kompiliert bei mir erst gar nicht. In Zeile 85 ist die Variable i nicht deklariert.
Lösung:
for (int i=0;i<anz;i++)Startet man das Programm nun, dann stürzt es ab, da a und v nicht initialisiert sind, aber in Zeile 59 verwendet werden.
Lösung:
int a = 0,c = 0;Ob das Programm korrekt funktioniert, kann ich dir nicht sagen, da ich Mastermind noch nie gespielt habe.
-
Und das hier ist undefiniertes Verhalten:
int a,c; kzahl[a][v] = pos; kzahl[c][v] = rz;Die beiden Variablen sind nicht initialisiert, also kannst du nicht voraussagen, wohin deine Ergebnisse geschrieben werden.
(übrigens dürfte das Array unnötig sein - nach der Ausgabe der Werte werden sie nicht weiter benötigt)