Zahlenratespiel, Hilfe mit Zusatzfunktionen



    • Die von Dir verwendete Variable Rest gibt es nicht (nirgends deklariert). (Nein auch nicht. Oder meintest Du "Nein" ... einen String?)
    • Du benutzt Tip in while (Tip != Sikret ) { uninitialisiert. Da kann sonstwas rauskommen.
    • Ich habe oben schon gesagt Du sollst Variablen dort deklarieren/definieren, wo sie benötigt werden.
    • Du berechnest keine neue Zufallszahl pro weiterem Spiel (Sikret = rand() % Max_Zahl + 1; muss woanders hin).
    • Versuch sollte beim Beginn eines neuen Spiels wieder 0 sein.


  • @Swordfish

    @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Du benutzt Tip in while (Tip != Sikret ) { uninitialisiert. Da kann sonstwas rauskommen.
    Ich habe oben schon gesagt Du sollst Variablen dort deklarieren/definieren, wo sie benötigt werden.
    Du berechnest keine neue Zufallszahl pro weiterem Spiel (Sikret = rand() % Max_Zahl + 1; muss woanders hin).
    Versuch sollte beim Beginn eines neuen Spiels wieder 0 sein.

    Vielen Dank, endlich habe ich es kapiert. Noch mit Versuch bitte ich um ein paar Tipps.
    Hier ist noch meine Code, die Verbesserungsvorschläge zur Code sind begrüßen.

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


    • Tip ist bei seiner ersten Verwendung in der Bedingung der folgenden while immer noch uninitialisiert. Also entweder initialisieren oder eine do...while-Schleife nehmen (die Tip erst auswerted nachdem die Variable von cin gelesen wurde).
    • Du fragst den Benutzer nach jedem Rateversuch, ob er noch ein Spiel spielen will?
    • Warum zählst Du die Versuche wenn Du sie dem Benutzer noch nichteinmal anzeigst?
    • Rücke bitte deinen Code anständig ein.


  • @Wowa29 mach dich mal über Einrückungsstil schlau.

    Du hilfst dir und uns.



  • @Wowa29 Zeile 24 ist etwas merkwürdig.



  • @DirkB sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    mach dich mal über Einrückungsstil schlau.

    Ich weiß ehrlich gesagt nicht, was euch nicht gefällt. Ich programmiere nur seit ein paar Tagen nur.

    @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Du fragst den Benutzer nach jedem Rateversuch, ob er noch ein Spiel spielen will?

    Nein, nur am Ende. Nachdem die Randomzahl geraten wurde.

    @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Warum zählst Du die Versuche wenn Du sie dem Benutzer noch nichteinmal anzeigst?

    Wie ich das mache?

    @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Rücke bitte deinen Code anständig ein.

    z.B?



  • @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Ich weiß ehrlich gesagt nicht, was euch nicht gefällt.

    Alles ab und inklusive dem ersten do in main() gehört noch eine Ebene weiter eingerückt.

    @Wowa29 sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    @Swordfish sagte in Zahlenratespiel, Hilfe mit Zusatzfunktionen:

    Du fragst den Benutzer nach jedem Rateversuch, ob er noch ein Spiel spielen will?

    Nein, nur am Ende. Nachdem die Randomzahl geraten wurde.

    Das war eher eine rhetorische Frage. Anders formuliert: Du fragst den Benutzer nach jedem Rateversuch, ob er noch ein Spiel spielen will! Schau dir an, in welcher der beiden Schleifen cout << "Noch ein Spiel (J/N)? "; cin >> Abfrage; steht.



  • Dieser Beitrag wurde gelöscht!


  • @Swordfish so?

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
        int Max_Zahl, Sikret;
        int Tip = 0;
        char Abfrage;
        cout << "Zahlenratespiel\n";
        cout << "===============\n";
    
        srand (time(NULL));
    
    
        do
        {
        cout << "\nGib die Maximalzahl ein: ";
        cin >> Max_Zahl;
        Sikret = rand() % Max_Zahl + 1;
        while (Tip != Sikret )
            {
            int Versuch = 0;
            cout << "\nGib deine Zahl ein: ";
            cin >> Tip;
        //Versuch += Tip ;
            if (Tip > Sikret)
                {
                cout << "\nMeine Zahl ist kleiner \n";
                continue;
                }
            else if (Tip < Sikret)
                {
            cout << "\nMeine Zahl ist groesser \n";
            continue;
                }
            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');
    }
    
    


  • @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');
    }
    
    

Anmelden zum Antworten