unbekannter Fehler..
-
Hey,
Ich habe für mein Snake Spiel das Hauptmenü entworfen.
Ich hab hierzu die Funktionen: Hauptmenü() , Einstellungen() und Spiel(), die jeweils ausgeführt werden wenn der jeweilige bool-wert = true ist.
Dieser wird true, wenn man in der jeweiligen Eingabe etwas bestimmtes eingibt.Mein Problem ist, dass das ganze nicht funktioniert.
Egal was ich in die Eingabe im Menü eingebe, man gelangt immer in die Einstellungen.
Auch in den Einstellungen, wenn man 'Menü' eintippe, gelangt man zur eingabe des Levels.Meine Frage ist also, was ich falsch gemacht habe, denn ich suche jetzt shcon seit 2 Tagen am Fehler.
Kritik und Verbesserungvorschläge währen nett.
Dazu muss ich aber anmerken, dass ich noch nicht all zu lange programmiere und Microsoft Visual C++ 2008 benutze.Hier der Code:
/* ********************************************** * Functions * ********************************************** */ // Startbildschirm void Leerzeichen(int x) { for(int i = 0 ; i < x ; i++){ cout << " ";}}; void Leerzeilen(int x) { for(int i = 0 ; i < x ; i++){ cout << endl;}}; void Zeichnen(int x) { Sleep(1); system("cls"); cout << endl; for(int i = 0 ; i < x ; i++){cout << " ";} cout << "OOOOOOO"; }; void schlängeln(int oft) { int a = 1; for(int i = 0 ; i < oft; i++){ Zeichnen(a); a = a + 6 ; }}; void Snake_Z(int sleep) { system("color 0C"); Leerzeilen(7); cout << " ###### ### ## ## ## ## ######## " << endl ; Sleep(sleep); cout << " # # #### ## #### ## ## ######## " << endl ; Sleep(sleep); cout << " # ## ## ## ## ## ## ## ## " << endl ; Sleep(sleep); cout << " ###### ## ## ## ## ## ##### ######## " << endl ; Sleep(sleep); cout << " # ## ## ## ######## ###### ## " << endl ; Sleep(sleep); cout << " # # ## ## ## ## ## ## ## ######## " << endl ; Sleep(sleep); cout << " ##### ## ### ## ## ## ## ######## " << endl ; Sleep(sleep); Leerzeichen(10); for(int i = 0 ; i < 58 ; i++) { cout << "*" ; Sleep(30); } Sleep(2000); system("cls"); Menü = true; }; void Hauptmenü() { cout << "Snake Version 1.0 Programmiert von ..." << "________________________________________________________________________________" << endl << " Score: " << Score << " Highscore: " << Highscore << endl << "================================================================================"; cout << endl << " o o o o o oooo ooooooo o o ooooo o o o || o "; Sleep(100); cout << endl << " o o o o o o o o o oo oo o oo o o o "; Sleep(100); cout << endl << " ooooo ooooo o o oooo o o o o o ooooo o o o o o "; Sleep(100); cout << endl << " o o o o o o o o o o o o o oo o o "; Sleep(100); cout << endl << " o o o o oooo o o o o ooooo o o oooo "; Sleep(100); cout << endl << " ------------------------------------------------------------------- "; Sleep(100); Leerzeilen(3); Leerzeichen(29); cout << " --------------- " << endl; Sleep(100); Leerzeichen(29); cout << " Start " << endl; Sleep(100); Leerzeichen(29); cout << " --------------- " << endl; Sleep(100); Leerzeichen(29); cout << " Einstellungen " << endl; Sleep(100); Leerzeichen(29); cout << " --------------- " << endl; Sleep(100); Leerzeilen(2); Leerzeichen(26); cout << " Eingabe: "; cin >> Eingabe_Menü; cout << endl; if(Eingabe_Menü == "Start" || "start") { Spiel_läuft = true; Menü = false; Einstellungen_läuft = false; } if(Eingabe_Menü == "Einstellungen" || "einstellugnen") { Einstellungen_läuft = true; Menü = false; } }; void Einstellungen() { cout << "Snake Version 1.0 Programmiert von ..." << "________________________________________________________________________________"; cout << endl << " oooo o o o oooo ooooo oooo o o o o o o oooo oooo o o "; Sleep(100); cout << endl << " o o oo o o o o o o o o oo o o o oo o "; Sleep(100); cout << endl << " oooo o o o o oooo o oooo o o o o o o o o oo oooo o o o "; Sleep(100); cout << endl << " o o o oo o o o o o o o o oo o o o o oo "; Sleep(100); cout << endl << " oooo o o o oooo o oooo oooo oooo oo o o ooo oooo o o "; Sleep(100); cout << endl << " ----------------------------------------------------------------------- "; Sleep(100); Leerzeilen(3); Leerzeichen(20); cout << " o Level[" << Level << "] \204ndern (tippe: 'Level')" << endl << endl; Leerzeichen(20); cout << " o Hauptmen\201 "; Leerzeilen(2); Leerzeichen(26); cout << " Eingabe: "; cin >> Eingabe_Einstellungen; if(Eingabe_Einstellungen == "Hauptmenü" ||"hauptmenü" || "menü" || "Menü") { Menü = true; Einstellungen_läuft = false; Eingabe_Einstellungen = ""; system("cls"); } if(Eingabe_Einstellungen == "Level" || "level") { Leerzeilen(2); Leerzeichen(20);cout << "Stufe (1-8): "; cin >> Level; if(Level == 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8) { system("cls"); Menü = true; Einstellungen_läuft = false; Eingabe_Einstellungen = ""; } } if(Menü = true) { system("color 02"); Hauptmenü(); } if(Einstellungen_läuft = true) { system("cls"); system("color 81"); Einstellungen(); } } // Spiel Funktionen void set_console(short hight, short width, LPCTSTR title) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT size; COORD b_size; size.Left = 0; size.Top = 0; size.Right = width; size.Bottom = hight; b_size.X = width+1; //breite+1 b_size.Y = hight+1; //höhe+1 SetConsoleWindowInfo(hCon, true, &size); SetConsoleScreenBufferSize(hCon, b_size); SetConsoleTitle(title); } void Spiel() { } int _tmain(int argc, _TCHAR* argv[]) { set_console( 26 , 79, _T("Snake V1.0")); Snake_Z(400); if(Menü = true) { system("color 0A"); Hauptmenü(); } if(Einstellungen_läuft = true) { system("cls"); system("color 81"); Einstellungen(); } if(Spiel_läuft = true) { Spiel(); } return 0; }
-
Geheimtipp: Debuggen.
-
Ja das Programm läuft ja..
Aber falsch..
-
Genau dafür ist Debugging gedacht. Du schaust dir Schritt für Schritt durch, schaust dir die Variablenwerte an, schaust, wo das Programm hinspringt, und vergleichst es mit dem, was du erwartet hättest.
-
Was mir beim ersten Drübersehen aufgefallen ist:
if(Eingabe_Menü == "Start" || "start")
muss heißen
if(Eingabe_Menü == "Start" || Eingabe_Menü == "start")
Das gilt analog auch für die anderen Stellen mit einem logischen ODER in deinem Code.
MfG
Chris_
-
Zunächst mal ist es ärgerlich das der Code unvollständig gepostet wurde.
Ich gehe davon aus das mindestens das hier fehlt
#include <windows.h> #include <tchar.h> #include <iostream> #include <string> using namespace std; bool Menü, Einstellungen_läuft, Spiel_läuft; string Eingabe_Menü, Eingabe_Einstellungen; unsigned Level, Score, Highscore;
Momentan wird wohl sowohl
if(Eingabe_Menü == "Start" || "start") { .. }
sowie
if(Eingabe_Menü == "Einstellungen" || "einstellugnen") { .. }
ausgeführt, was ja nicht sinnvoll sein dürfte.
Besser wäre hier natürlich den Benutzer die Eingabe von Text zu ersparen.
->Auswahl mit Cursortasten wäre üblich.Naja, wenn schon sollte es aber zumindest fehlertolerant sein.
Also besser
if(CompareCI(Eingabe_Menü, "Start")) // == "Start" || "start")
oder auch
if(CompareCI(Eingabe_Einstellungen, "Hauptmenü") || CompareCI(Eingabe_Einstellungen, "Menü"))
Leider muss man Case Insentitive Stringvergleiche selbst programmieren wenn man
einfache strings verwenden möchte.Ein Anfang wäre:
bool CompareCI(const string& str1, const string& str2) { if (str1.size() != str2.size()) { return false; } for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) { if (tolower(*c1) != tolower(*c2)) { return false; } } return true; }
Dann ist mir noch aufgefallen, das endl; oft am Anfang einer Ausgabe steht.
Das sollte besser am Ende stehen wg. gepufferter I/O.Deutsche Umlaute in Variablennamen sollte man eher meiden.
Bei der Ausgabe kann man sich dagegen den Umstand sparen.
Ein einfaches
setlocale(LC_ALL, "German");
zum Programmbegin in main() erspart z.B. das hier
// Leerzeichen(20); cout << " o Hauptmen\201 "; Leerzeichen(20); cout << " o Hauptmenü";
siehe auch: Language and Country/Region Strings
http://msdn.microsoft.com/en-us/library/hzz3tw78(v=vs.100).aspx
-
merano schrieb:
bool CompareCI(const string& str1, const string& str2) { if (str1.size() != str2.size()) { return false; } for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) { if (tolower(*c1) != tolower(*c2)) { return false; } } return true; }
Warum nicht:
bool CompareCI(const string& str1, const string& str2) { std::equal(str1.begin(), str1.end(), str2.begin(), [](char c1, char c2) { return std::tolower(c1) == std::tolower(c2) }); // Alternativ als eigene Funktion statt Lambda wenn kein C++11 verfügbar ist. }
-
pyhax schrieb:
Warum nicht:
bool CompareCI(const string& str1, const string& str2) { std::equal(str1.begin(), str1.end(), str2.begin(), [](char c1, char c2) { return std::tolower(c1) == std::tolower(c2) }); // Alternativ als eigene Funktion statt Lambda wenn kein C++11 verfügbar ist. }
Sieht interessant aus, führt aber bei mir (mit VS2010) zu folgenden Fehlern:
snakemain.cpp(40): error C2039: 'tolower': Ist kein Element von 'std' snakemain.cpp(40): error C2143: Syntaxfehler: Es fehlt ';' vor '}' snakemain.cpp(40): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
Für einen Anfänger ist das vermutlich auch absolut unverdaulich ..
-
Natürlich würde es auch mit equal gehen
bool chkit ( int elem1, int elem2 ) { return tolower(elem1) == tolower(elem2); } bool CompareCI(const string& str1, const string& str2) { return std::equal(str1.begin(), str1.end(), str2.begin(), chkit ); }
PS: Das return fehlte auch noch ...
-
merano schrieb:
Natürlich würde es auch mit equal gehen
bool chkit ( int elem1, int elem2 ) { return tolower(elem1) == tolower(elem2); } bool CompareCI(const string& str1, const string& str2) { return std::equal(str1.begin(), str1.end(), str2.begin(), chkit ); }
PS: Das return fehlte auch noch ...
return und semikolon fehlte ... Ich hätte es vielleicht doch lieber vorher testen sollen
-
Danke erstmal (:
Ich werd mal schaun ob ich das hinbekomme..
-
Danke
Hat perfekt geklappt.Hab das jetzt mit switch und _getch() gelöst.
Vielen dank.