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.


Anmelden zum Antworten