Problem - Hangman
-
Hallo,
bin noch relativ am Anfang in c++ und hatte mich jetzt mal an einem einfachen
Hangman Spiel in der Console versucht.Das einzige Problem was ich habe, ist, dass ich nicht weiß wie ich
die eingegebenen Buchstaben mit den Buchstaben des abgefragten Wortes vergleichen kann, sodass, wenn alle richtigen Buchstaben eingegeben sind, das Spiel ausfhört.Immoment ist es so, dass nach 6 falschen Buchstaben das Spiel vorbei ist (Game Over), allerdings kommt man immer zu Game Over, da das Programm noch nicht weiß
wann alle richtigen Buchstaben eingegeben sind.Wie kann ich das realisieren?
Ich habe alle eingegebenen Buchstaben in einem char[array] gespeichert und alle abzufragenden wörter in einem string[array].
-
Du mußt halt für jeden Buchstaben in deinem Wörter-Array überprüfen, ob es nicht schon in deinem char-Array vorkommt.
Ich würde es aber anders machen: du zeigst ja wahrscheinlich die noch nicht passenden Buchstaben als '' an (so kenn ich es jedenfalls). Erzeuge am Anfang ein String-Array aus deinem Original-String-Array und ersetze alle Buchstaben durch ''. Bei Eingabe eines Buchstaben ersetze an der entsprechenden Stelle den '' durch den Buchstaben. Nun brauchst du nur abzufragen, ob noch '' im String-Array vorkommen.
Am besten, du verwendest statt der fixed-arrays gleich die vector<> und string-Klasse aus der STL. Dann kannst du bequem z.B. die Methoden find() und replace() benutzen.
-
Ahh Danke,
daran hatte ich nicht gedacht.
Ich werds direkt mal ausprobieren.
-
Ich bin's nochmal.
Bin nochmal auf einen kleinen Fehler gestoßen.
Habe es folgendermaßen gemacht:
int position = sv[var].find(eingabe); sv2[position]=eingabe;
Also in dem StringVector[Variable] wird der Buchstabe der eingegeben wurde gesucht. Die Stelle wird dann unter "position" abgespeichert und danach wird auf dieser position dem sv2 String Vector, welcher folgendermaßen aussieht
"_ _ _ _ _ _ " der Buchstabe zugewiesen, sodass dann z.B. nach einer Eingabe
folgendes angezeigt wird:
" _ _ a _ _"
Das klappt soweit ganz gut, außer wenn man den ersten Buchstaben erwicht hat.
Dann kommt eine Fehlermeldung und das Programm stürzt ab.Also wenn das Wort "Test" heist: "_ _ _ _" und man als erstes T eingibt, wird für position eine seltsame Zahl angezeigt und das Programm stürzt ab.
Irgendeine idee?
-
Hab mitlerweile rausgefunden, dass es hier ran liegt
for(int i = 0; i<20; ++i) { if(eingabe == (sv[var])[i] || eingabe-32 == (sv[var])[i])
Ich will das bei der Eingabe nicht zwichen Groß-und kleinschreibung unterschieden wird, aber genau dann wenn ich ein kleines a eintippe und das wort enthält ein großes stürzt das Programm ab.
Habe es auch schon mit toupper(eingabe) versucht.
(ja, header war eingebunden)
Ohne Erfolg.
-
zeig mehr Code.
-
StringVector sv; //sv[0-6] = abzufragende Wörter; //var = "Zufallszahl" zw 1 und 6 StringVector sv2; //="_" * Anzahl der Buchstaben, also (sv[var].capacity())
Das ist die Funktion in der der Fehler vorkommt:
int checkLetter(char eingabe, StringVector sv, StringVector& sv2, int var) { for(int i = 0; i<20; ++i) { if(eingabe == (sv[var])[i] || toupper(eingabe) == (sv[var])[i]) { cout << "Good guess!\n" << endl; int var2 = sv[var].find(eingabe); cout << sv[var].find(eingabe); sv2[var2]=eingabe; rw = 'r'; return 0; } } if(rw == 'w') {cout << "Sorry, bad guess!\n\n" << endl; return 1; } cerr << "Fehler in der Buchstaben Ueberpruefung" << endl; }
-
Niemand eine Idee?
-
Debugge doch einfach dein Programm...
Warum hast du die Schleife denn bis exakt 20 laufen?
Und bei find() solltest du den Rückgabewert prüfen:
size_t pos = s.find(...); if(pos != string::npos) { } else { // nicht gefunden }
Desweiteren sollte die Abfrage mit 'toupper' so lauten:
if( toupper(eingabe) == toupper(c) )
Versuche einfach ein bißchen mehr, deinen eigenen Source-Code zu verstehen (d.h. lese die Hilfe zu den einzelnen Funktionen etc.)!
-
Danke für eure Antworten,
konnte das Problem jetzt lösen.
Klappt nun alles wunderbar, Funktion sieht nun so aus:
int checkLetter(char eingabe, StringVector sv, StringVector& sv2, int var) { int kapazitaet =sv[var].capacity(); for(int i = 0; i<20; ++i) { if(eingabe == (sv[var])[i] ) { cout << "Good guess!\n" << endl; int var2 = sv[var].find(eingabe); //cout << sv[var].find(eingabe); sv2[var2]=eingabe; rw = 'r'; return 0; } } for(int i = 0; i<20; ++i) { if(eingabe-32 == (sv[var])[i] ) { cout << "Good guess!\n" << endl; int var2 = sv[var].find(eingabe-32); //cout << sv[var].find(eingabe-32); sv2[var2]=eingabe-32; rw = 'r'; return 0; } } if(rw == 'w') {cout << "Sorry, bad guess!\n\n" << endl; return 1; } cerr << "Fehler in der Buchstaben Ueberpruefung" << endl; }