Zahlenratespiel, Hilfe mit Zusatzfunktionen



  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Versuchs nochmal. Das ```cpp muss alleine in einer Zeile vor Deinem Code stehen und in einer Zeile nach Deinem Code nochmal ```. Du kannst deinen Beitrag mit einem Klick auf das Drei-Punkte-Menü rechts unter Deinem Beitrag bearbeiten.



  • gemacht. Aber die Lösung meines Problems hat das nicht geholfen. Ich meine mit Versuchen



  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    so?

    Eher so (mit Kommentaren):

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
    	// int Max_Zahl, Sikret;  Warum sind diese deklarationen
    	// int Tip = 0;           und definitionen immer noch hier und nicht ...
    	char Abfrage;
    	cout << "Zahlenratespiel\n";
    	cout << "===============\n";
    
    	srand(time(NULL));
    
    	do {
    		// hier startet ein neues Spiel, also Anzahl der Versuche auf 0:
    		int Versuch = 0;
    
    		cout << "\nGib die Maximalzahl ein: ";
    		int Max_Zahl;  // ... hier?
    		cin >> Max_Zahl;
    		int Sikret = rand() % Max_Zahl + 1;  // ... hier?
    
    		int Tip = Sikret + 1;  //... hier?  Sikret + 1 damit die Bedingung in der nächsten Zeile
    		while (Tip != Sikret) { // garantiert nicht fehlschlägt. do ... while() wäre eloganter.
    			// int Versuch = 0;  // pro Spiel, nicht pro einmal Raten. Siehe oben.
    			cout << "\nGib deine Zahl ein: ";
    			cin >> Tip;
    			// Versuch += Tip; // Ne, da bin ich dagegen. Eher:
    			// Versuch = Versuch + 1; // oder kurz:
    			++Versuch;
    
    			if (Tip > Sikret)
    			{
    				cout << "\nMeine Zahl ist kleiner \n";
    				// continue;  die continues sind überflüssig, da nach dem if
    			}
    			else if (Tip < Sikret)
    			{
    				cout << "\nMeine Zahl ist groesser \n";
    				// continue;  else if - else im Schleifenkörper nichts mehr kommt.
    			}
    			else
    			{
    				cout << "\nGratulation! Du hast die Zahl erraten!\n";
    				cout << "Sie haben " << Versuch << " Versuche dazu gebraucht!\n";
    			}
    		}
    		
    		cout << "Noch ein Spiel (J/N)? ";
    		cin >> Abfrage;
    	} while (Abfrage != 'N');
    }
    

    Ohne (mit do...while() damit Tip keinen künstlichen Wert braucht):

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
    	cout << "Zahlenratespiel\n";
    	cout << "===============\n";
    
    	srand(time(NULL));
    
    	char Abfrage;
    	do {
    		int Versuch = 0;
    
    		cout << "\nGib die Maximalzahl ein: ";
    		int Max_Zahl;
    		cin >> Max_Zahl;
    
    		int Sikret = rand() % Max_Zahl + 1;
    
    		int Tip;
    		do {
    			cout << "\nGib deine Zahl ein: ";
    			cin >> Tip;
    			++Versuch;
    
    			if (Tip > Sikret)
    			{
    				cout << "\nMeine Zahl ist kleiner \n";
    			}
    			else if (Tip < Sikret)
    			{
    				cout << "\nMeine Zahl ist groesser \n";
    			}
    			else
    			{
    				cout << "\nGratulation! Du hast die Zahl erraten!\n"
    				     << "Sie haben " << Versuch << " Versuche dazu gebraucht!\n";
    			}
    		} while (Tip != Sikret);
    		
    		cout << "Noch ein Spiel (J/N)? ";
    		cin >> Abfrage;
    	} while (Abfrage != 'N');
    }
    

    Findest Du es so eingerückt nicht auch lesbarer?



  • @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Findest Du es so eingerückt nicht auch lesbarer?

    Ja, mein Freund. Danke dir. Ich lerne aber noch. Die Bemerkung war gut angebracht. Kann man noch die Anzahl der Versuche hierher hinzuschreiben bzw. festlegen? Da brauche ich wieder eine Schleife?



  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Kann man noch die Anzahl der Versuche hierher hinzuschreiben bzw. festlegen? Da brauche ich wieder eine Schleife?

    Wie meinst Du das? Eine Maximalanzahl an Versuchen festlegen bei deren Erreichen das Spiel verloren ist?



  • @Swordfish genau



  • @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

      } while (Tip != Sikret);
    

    Dazu brauchts in while (Tip != Sikret); noch eine weitere Bedingung:

    Solange (Zahl nicht erraten UND Anzahl der Versuche kleiner gleich Maximalanzahl)



  • @Swordfish

    @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Dazu brauchts in while (Tip != Sikret); noch eine weitere Bedingung:

    Ja, aber wenn ich das erweitere, dann erfüllt sich die vorherige Bedingung nicht vollständig, und zwar wenn ich z.B 5 Versuche festlege, und dann noch die Meldung dass "die Maximalanzahl an Versuchen wurde erreicht, die gesuchte Zahl war ...!", dann funktioniert das nicht ganz richtig

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
    	cout << "Zahlenratespiel\n";
    	cout << "===============\n";
    
    	srand(time(NULL));
    
    	char Abfrage;
    	do {
    		int Versuch = 0;
    
    		cout << "\nGib die Maximalzahl ein: ";
    		int Max_Zahl;
    		cin >> Max_Zahl;
    
    		int Sikret = rand() % Max_Zahl + 1;
    
    		int Tip;
    		do {
    			cout << "\nGib deine Zahl ein: ";
    			cin >> Tip;
    			++Versuch;
    
    			if (Tip > Sikret)
    			{
    				cout << "\nMeine Zahl ist kleiner \n";
    			}
    			else if (Tip < Sikret)
    			{
    				cout << "\nMeine Zahl ist groesser \n";
    			}
    			else
    			{
    				cout << "\nGratulation! Du hast die Zahl erraten!\n"
    				     << "\nSie haben " << Versuch << " Versuche dazu gebraucht!\n";
    			}
    		} while (Tip != Sikret && Versuch <=10);
           // cout << "die Maximalanzahl an Versuchen wurde erreicht, die gesuchte Zahl war "<< Sikret;
    		cout << "\nNoch ein Spiel (J/N)?\n";
    		cin >> Abfrage;
    	} while (Abfrage != 'N');
    }
    
    


  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    cout << "die Maximalanzahl an Versuchen wurde erreicht, die gesuchte Zahl war "<< Sikret;
    

    Diese Meldung solltest Du dann nur ausgeben, wenn Versuch gleich der Maximalanzahl ist.

    BTW ist es nicht so toller stil, die Anzahl als Zahl (Literal) mitten in den Code zu schreiben. Definiere dafür lieber eine Konstante a la constexpr int MaxVersuche = 10; und verwende den Namen wo Du den Wert brauchst.



  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Ja, mein Freund. Danke dir. Ich lerne aber noch.

    Lesbaren Code zu schreiben ist eine der wichtigsten Lektionen.

    Das ist auch für dich wichtig, wenn du nach ein paar Tagen mal wieder auf deinen Code schaust.



  • @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    constexpr int MaxVersuche = 10;

    Habe probiert, aber jetzt bei Erraten der Zahl erscheint trotzdem die Meldung ""die Maximalanzahl an Versuchen wurde erreicht, die gesuchte Zahl war "<< Sikret;"

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
    	cout << "Zahlenratespiel\n";
    	cout << "===============\n";
        constexpr int MaxVersuche = 5;
    	srand(time(NULL));
    
    	char Abfrage;
    	do {
    		int Versuch = 0;
    
    		cout << "\nGib die Maximalzahl ein: ";
    		int Max_Zahl;
    		cin >> Max_Zahl;
    
    		int Sikret = rand() % Max_Zahl + 1;
    
    		int Tip;
    		do {
    			cout << "\nGib deine Zahl ein: ";
    			cin >> Tip;
    			++Versuch;
    
    			if (Tip > Sikret)
    			{
    				cout << "\nMeine Zahl ist kleiner \n";
    			}
    			else if (Tip < Sikret)
    			{
    				cout << "\nMeine Zahl ist groesser \n";
    			}
    			else
    			{
    				cout << "\nGratulation! Du hast die Zahl erraten!\n"
    				     << "\nSie haben " << Versuch << " Versuche dazu gebraucht!\n"; //Wie soll ich diese Zeile positionieren, damit es richtig funktioniert?
    			}
    		} while (Tip != Sikret && Versuch < MaxVersuche ); // so?
            cout << "die Maximalanzahl an Versuchen wurde erreicht, die gesuchte Zahl war "<< Sikret; // Und diese, weil bei Erraten, erscheint trotzdem die Meldung
    		cout << "\nNoch ein Spiel (J/N)?\n";
    		cin >> Abfrage;
    	} while (Abfrage != 'N');
    }
    
    


  • Ich hab es, jetzt scheint das so zu funktionieren wie ich von Anfang an wollte, danke für eure Tipps. Wenn es noch welche Verbesserungsvorschläge wären, würde ich mich freuen.

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
    	cout << "Zahlenratespiel\n";
    	cout << "===============\n";
        constexpr int MaxVersuche = 5;
    	srand(time(NULL));
    
    	char Abfrage;
    	do {
    		int Versuch = 0;
    
    		cout << "\nGib die Maximalzahl ein: ";
    		int Max_Zahl;
    		cin >> Max_Zahl;
    
    		int Sikret = rand() % Max_Zahl + 1;
    
    		int Tip;
    		do {
    			cout << "\nGib deine Zahl ein: ";
    			cin >> Tip;
    			++Versuch;
    
    			if (Tip > Sikret)
    			{
    				cout << "\nMeine Zahl ist kleiner \n";
    			}
    			else if (Tip < Sikret)
    			{
    				cout << "\nMeine Zahl ist groesser \n";
    			}
    			else
    			{
    				cout << "\nGratulation! Du hast die Zahl erraten!\n"
    				     << "\nSie haben " << Versuch << " Versuche dazu gebraucht!\n"; 
    			}
    		} while (Tip != Sikret && Versuch < MaxVersuche ); 
            
    		if (Versuch >= MaxVersuche && Tip != Sikret ) {
                    cout << "\ndie Maximalanzahl an Versuchen wurde erreicht, die gesuchte Zahl war "<< Sikret;
    		}
    		cout << "\nNoch ein Spiel (J/N)?\n";
    		cin >> Abfrage;
    	}   while (Abfrage != 'N');
    }
    
    


  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    int Sikret = ...;
    

    Das soll wohl eher secret heißen (englisch für "geheim" bzw. "Geheimnis").

    Wenn du später mal beruflich weiterprogrammieren möchtest, dann solltest du dich an englische Bezeichner gewöhnen (und auch selber verwenden).

    Und noch ein Tipp: Lokale Variablen werden, nach üblicher Vereinbarung, mit Kleinbuchstaben geschrieben.



  • @Th69 super, danke dir.


Anmelden zum Antworten