Wo liegt mein fehler ?



  • Hi,

    zum üben von Funktionen mit Headdateien und cpp dateien habe ich ein kleines Zahlenratespiel gemacht, aber ich habe zur zeit ein problemm, bei dem ich nicht weiter komme und zwar wenn ich den case aufrufe, welcher die Spielfunktion aufrufen soll, tut er es nicht, sondern gibt mir das Menü aus. Ich schätze der Fehler liegt irgendwo bei der do while schleifen, aber wo und wie löse ich ihn: Hier ist der code.

    MAIN:

    #include <iostream>
    #include "Spiel.hpp"
    
    using namespace std;
    
    void einfachesSpiel();
    void mittleresSpiel();
    void schweresSpiel();
    
    int main()
    {
    
    	char Menue;
    
    	cout << "----Menü----" << endl;
    	cout << "(E)infaches Spiel" << endl;
    	cout << "(M)ittelschweres Spiel" << endl;
    	cout << "(S)chweres Spiel" << endl;
    	cout << "(B)eenden" << endl;
    
    	do
    	{
    		cin >> Menue;
    
    		switch (Menue)
    		{
    		case('e') :
    		case('E') :
    		{
    					 void einfachesSpiel();
    		}
    			break;
    		case('m'):
    		case('M') :
    		{
    					 void mittleresSpiel();
    		}	break;
    		case('S') :
    		case('s') :
    		{
    					  void schweresSpiel();
    		}	break;
    		case('b') :
    		case('B') :
    		{
    					  return 0;
    		}	break;
    
    		default:{
    					cout << "Falsche Eingabe!" << endl;
    		}
    
    		}
    
    	} 
    	while (Menue != 'b'||Menue !='B');
    
    }
    
    headdatei:
    
    void einfachesSpiel();
    void mittleresSpiel();
    void schweresSpiel();
    
    eine der 3 funktionen sind alle gleich bis auf funktionsnamen und random werte.
    
    #include "Spiel.hpp"
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    void einfachesSpiel()
    {
    	int errateneZahl = 0;
    	int zufaelligeZahl = 0;
    	int Punkte = 0;
    	int Gesammtpunkte = 0;
    	int Runden = 10;
    
    	for (int a = 0; a <= Runden, a++;)
    	{
    
    		cout << "Bitte geben sie Ihre Zahl ein! " << endl;
    		cin >> errateneZahl;
    
    		zufaelligeZahl = rand() % 3 + 1;
    
    		if (zufaelligeZahl = errateneZahl)
    		{
    
    			Gesammtpunkte = Punkte + 10;
    			cout << "GRATULIERE Sie haben es erraten! " << zufaelligeZahl << " " << errateneZahl << endl;
    
    			cout << "Sie bekommen" << Gesammtpunkte << endl;
    		}
    		else
    		{
    			cout << "Leider falsch, die richtige Zahl waere: " << zufaelligeZahl;
    
    		}
    
    	}
    
    }
    


  • Deine do-while-Bedingung ist immer wahr, denn wenn Menue nicht ungleich 'b' ist, dann ist es gleich 'b', und somit ungleich 'B'. Der Hauptfehler ist aber die Syntax deiner for-Schleife:

    for (int a = 0; a <= Runden, a++;)
    

    Das solltest du nochmal genauer anschauen.



  • ...und Z. 113 auch



  • Ehm ich versuch mal zu erklären was ich mir gedacht habe, als ich das programmiert habe und vielleicht kann mir jemand dann erklären, wo mein denkfehler ist... bitte.
    Denn ich habe mir die for schleife angeschaut und verstehe nicht warum diese falsch ist, außer das ich vielleicht für diese Aufgabe die falsche schleife genommen habe.

    also :

    erstens sag ich dem Programm das es 3 Funktionen gibt.

    dann kommt in die main das manü.

    damit es nicht nach jeder eingabe abbricht baue ich eine do while schleife um die cases auf. und ich dachte mir eigentlich wenn die bedingung Wahr ist z.b e (einfaches Spiel) dann sollte die Funktion für einfaches Spiel aufgerufen werden über die header-datei.

    in der funktion einfaches spiel.

    deklariere ich integer für punkte,gesammtpunkte, randomzahl und zahl zum eingeben. Damit das spiel nicht ewig dauert, baue ich eine forschleife, die automatisch nach 10 runden abbricht. da baue ich eine if else verzweigung ein damit überprüft wird ob die eingabe mit der zufallszahl übereinstimmt und die punkte addiert oder auch nicht.

    dachte ich. Wo war jetzt mein fehler?

    lg Dimi

    meintest du mit dem Syntax fehler in der for schleife das , nach der bedingung ?



  • Ichverstehe0Komma0 schrieb:

    Ehm ich versuch mal zu erklären was ich mir gedacht habe, als ich das programmiert habe und vielleicht kann mir jemand dann erklären, wo mein denkfehler ist... bitte.

    Du hast keinen Denkfehler, jedenfalls ist das im Moment nicht das Problem. Was bei dir falsch ist, haben wir dir schon gesagt.

    Denn ich habe mir die for schleife angeschaut und verstehe nicht warum diese falsch ist

    Falsch:

    for (int a = 0; a <= Runden, a++;)
    

    Richtig:

    for (int a = 0; a <= Runden; a++)
    


  • hab den gerade gesehen 🙂 danke ,aber wieso hat der compiler mir das nicht gemeldet ?



  • Weil es nicht falsch ist, nur halt nicht das, was du willst. Versuch mal herauszufinden, was die falsche Schleife getan hätte.



  • Hier mal die Wahrheitstabelle für Deine do-while Schleife:

    Bedingungen
     Wert | !'b' | !'B' | !'b'||!'B'
    ------+------+------+------------
     'b'  |   0  |   1  |      1
     'B'  |   1  |   0  |      1
    sonst |   1  |   1  |      1
    

    Leuchtet ein, dass da was nicht stimmen kann?

    Und der Fehler in Z. 113 in ähnlich subtil wie Dein Fehler in der for-Schleife!

    Aktivier Compilerwarnungen!



  • Ich verstehe ja was du meinst zumindestens das mit der while schleife, nur dachte ich eigentlich, er bei den cases die eingabe vergleicht und dann den inhalt ausgibt in meinem fall die funktion aufruft. wenn ich eine falsche eingabe tätige sagt er mir ja auch bescheid, das die eingabe falsch ist.

    und in z 113. bei der if anweisung meinst du das mit "=", es muss ein "==", weils keine zuweisung sondern verlgiech ist?



  • Okay ich komm nicht drauf. Kann mir wer sagen wie ich das Problem lösen kann ?



  • Ichverstehe0Komma0 schrieb:

    Okay ich komm nicht drauf. Kann mir wer sagen wie ich das Problem lösen kann ?

    Huh?
    Worauf kommst Du nicht?

    Sorry: ich kann Dir nicht immer ganz folgen.
    Evtl. habe ich Dich auch mißverstanden: Die Bedingung Deiner do-while Schleife macht diese zwar zu einer Endlosschleife, aber dadurch, dass Du mit
    return 0;
    aus der main springst fällt das gar nicht auf.

    Das mit Z. 113 hast Du auch geschnallt.

    Was ist denn jetzt noch das Problem?



  • Furble Wurble schrieb:

    Was ist denn jetzt noch das Problem?

    Zeilen 38, 44 und 49.



  • Genau, ich verstehe nicht warum meine Funktion nicht aufgerufen wird 😕



  • Weil das kein Aufruf ist.

    Das ist eine Deklaration.



  • Das ist wohl kategorie dumme fehler. Danke sehr hab ihn gefunden.

    lg DImi



  • Ich weiß ich gehe hier schon jedem auf die Nerven, aber noch eine letzte Frage.

    Wenn ich das Spiel starte und es läuft gebe ich ja eine Zahl ein und er vergleicht diese und gibt mir aus, ob es richtig oder falsch ist. Soweit ists okay und das Programm funktioniert. Gebe ich aber ein Buchstaben ein, kommt es zu einer endloss schleife, obwohl die schleife bei 10 abbrechen soll.

    Frage 1. Warum bricht der nicht ab?
    Frage 2. Wie kann ich eine Überprüfung auf Integer machen.



  • Ichverstehe0Komma0 schrieb:

    Ich weiß ich gehe hier schon jedem auf die Nerven, aber noch eine letzte Frage.

    Wenn ich das Spiel starte und es läuft gebe ich ja eine Zahl ein und er vergleicht diese und gibt mir aus, ob es richtig oder falsch ist. Soweit ists okay und das Programm funktioniert. Gebe ich aber ein Buchstaben ein, kommt es zu einer endloss schleife, obwohl die schleife bei 10 abbrechen soll.

    Frage 1. Warum bricht der nicht ab?
    Frage 2. Wie kann ich eine Überprüfung auf Integer machen.

    Weil der Buchstabe im stream verbleibt und in der Folge immer wieder gelesen (aber nicht extrahiert) wird kommt es zu einer Endlosschleife.

    Lösung: wenn istream::operator>>() fehlschlägt erstmal alles bis zum nächsten newline aus dem Stream schmeissen.

    #include <iostream>
    #include <limits>
    
    void purge(std::istream& in){
      in.clear();
      in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    
    int main(){
      int a=0;
      for(;;){
        if(!(std::cin >> a)){
          std::cerr << "Das war kein int!\n";
          purge(std::cin);
        }
        if(a==42)
          break;
      } 
    }
    


  • switch (Menue) 
            { 
            case('e') : 
            case('E') : 
            { 
                         void einfachesSpiel(); 
            }
            break;
    

    Meiner laienhaften Meinung nach, solltest du außerdem die Break; anweisung in den entsprechenden Anweisungsblock des 'case' setzen



  • GMoney597 schrieb:

    Meiner laienhaften Meinung nach, solltest du außerdem die Break; anweisung in den entsprechenden Anweisungsblock des 'case' setzen

    Ob das break im Block oder dahinter steht, ist egal.



  • aaah alles klar vielen vielen dank, wow hab mein ersten bug programmiert. Irgendwie stolz 🙂

    Das mit dem break; habe ich aus dem Buch c++ für spieleprogrammierer von heiko kalista, wenn es jemandem was sagt :).


Anmelden zum Antworten