Spiel "Zahlen raten" - finde kleinen Fehler nicht



  • Habe ein Spiel geschrieben, bei dem man eine Zahl zwischen 1 und 15 erraten muß.

    Die Funktion Random habe ich nun erstmal weggelassen, die gesuchte Zahl ist erstmal immer = 13.

    Man hat 3 Versuche.

    Wenn der dritte Versuch um ist, erhalte ich immer folgende Ausgabe:

    http://jippel.lima-city.de/cplus.jpg

    Warum erscheint die Ausgabe 3mal ? 😕

    Ist bestimmt ganz trivial, aber ich hab wohl schon "Betriebsblindheit" 😉

    #include <iostream>
    using namespace std;
    
    void pruef(int gesuchteZahl);
    
    int versuch = 0;
    
    void pruef(int gesuchteZahl)
    {
    	int probier = 0;
    	cout << "Das ist Versuch Nummer: " << versuch+1 << "\n";
    	cin >> probier;
    
    	if(probier == gesuchteZahl && versuch <= 2)
    	{
    		cout << "Glueckwunsch, gewonnen !\n";
    	}
    
    	if(probier > gesuchteZahl && versuch <= 2)
    	{
    		cout << "Zahl zu hoch ! \n";
    		versuch++;
    		if(versuch <= 2)
    		{
    			pruef(gesuchteZahl);
    		}
    	}
    
    	if(probier < gesuchteZahl && versuch <= 2)
    	{
    		cout << "Zahl zu klein ! \n";
    		versuch++;
    		if(versuch <= 2)
    		{
    			pruef(gesuchteZahl);
    		}
    	}
    
    	if(versuch > 2 && probier != gesuchteZahl)
    	{
    	cout << " Leider verloren ! Die Zahl war: " << gesuchteZahl << "  Versuch =  " << versuch << "\n";
    	}
    
    }
    
    void main()
    {
    
    	int zufall = 13;
    	char nochmal;
    
    	do {
    		cout << " Sie muessen ein Zahl zwischen 1 und 15 erraten ! \n";
    		pruef(zufall);
    		cout << " Nochmal - j oder n \n";
    		cin >> nochmal;
    		versuch = 0;
    	}
    		while(nochmal != 'n');
    
    }
    


  • Du rufst die Funktion rekursiv auf, um einen weiteren Versuch zu starten - und beim Rücklauf landest du auf jeder Ebene bei der Abfrage "if(versuch>2 && probier!=gesuchteZahl)...". An der Stelle würde wohle eine Schleife mehr Sinn machen als dein rekursiver Ansatz.

    PS: Globale Variablen sind böse 😉



  • sorry lag falsche



  • So in etwa:

    #include <iostream>
    using namespace std;
    
    bool pruef(int gesuchteZahl);
    
    int versuch = 0;
    
    bool pruef(int gesuchteZahl)
    {
        int probier = 0;
        cout << "Das ist Versuch Nummer: " << versuch+1 << "\n";
        cin >> probier;
    
        if(probier == gesuchteZahl && versuch <= 2)
        {
            cout << "Glueckwunsch, gewonnen !\n";
        }
    
        else if(probier > gesuchteZahl && versuch <= 2)
        {
            cout << "Zahl zu hoch ! \n";
            versuch++;
            return false;
        }
    
        else if(probier < gesuchteZahl && versuch <= 2)
        {
            cout << "Zahl zu klein ! \n";
            versuch++;
            return false;
        }
    
        else if(versuch > 2 && probier != gesuchteZahl)
        {
        cout << " Leider verloren ! Die Zahl war: " << gesuchteZahl << "  Versuch =  " << versuch << "\n";
        }
    
    }
    
    int main()
    {
    
        int zufall = 13;
        char nochmal;
    
        do {
            cout << " Sie muessen ein Zahl zwischen 1 und 15 erraten ! \n";
            while(versuch < 3)
    		    pruef(zufall);
            cout << " Nochmal - j oder n \n";
            cin >> nochmal;
            versuch = 0;
    
           } while(nochmal != 'n');
    
    }
    

    ⚠ nicht getestet



  • Nein, die Schleife sollte eher IN der Funktion sein und nicht außen herum:

    bool pruef(int ziel)
    {
      int probier;
      for(int versuch=0;versuch<3;++versuch)//beachte: 'versuch' ist nun eine lokale Variable der Funktion
      {
        cin>>probier;
        if(probier<ziel)
          cout<<"zu klein\n";
        else if(probier>ziel)
          cout<<"zu groß\n";
        else
        {
          cout<<"gewonnen\n";
          return true;
        }
      }
      cout<<"verloren\n";
      return false;
    }
    

Log in to reply