If - Else - Schleife macht, was sie will



  • Hallo liebes C++ Forum 🙂

    Bin ganz neu hier und lauer schon mit meinem ersten Problem hier...

    Also, ich habe ein Projekt gestartet in dem ich eine Art Glücksspiel programmiere. Alles mit Zufall. Soweit ganz gut, doch bei dem ersten Spiel direkt (Eine Zahl zwischen 1 und 3 aussuchen und hoffen, dass die Konsole den gleichen auswürfelt) gibt es Probleme: Ich habe 3 Möglichkeiten.

    Einmal, dass die Zahl richtig getippt wurde. Das habe ich mit If eingeleitet (Code im Anhang)

    Dann, dass die Zahl falsch ist und dass man zum 2 von drei Versuchen weitergeleitet wird

    Und drittens, dass man eine ungültige Eingabe gemacht hat (Was aber auch rausgenommen werden kann)

    Nun spinnen If und Else 😞
    Bei Versuch 2 (Bei 1 weiß ich nicht) verliert man IMMER (egal ob richtig oder falsch) und bei Versuch 3 GEWINNT man IMMER (wieder, egal ob richtig oder falsch...)

    Bin ein ziemlicher Anfänger und weiß mit meinem Latein nicht weiter...

    Bitte um Hilfe 🙂

    #include <iostream> 
    #include <conio.h> 
    #include <windows.h> 
    #include <stdlib.h> 
    #include <fstream> 
    #include <time.h> 
    using namespace std; 
    int main()
    {
    c:
    cout<<"Herzlich Wilkommen bei Glueck Deluxe 2000."<<endl;
    Sleep(2000);
    
    cout<<"Mit etwas Glueck schaffen sie es ins Finale und gewinnen 1 Cent."<<endl;
    Sleep(2000);
    
    cout<<"Bereit?"<<endl;
    getch();  
    
    cout<<"Hier das erste, leichte Spiel:"<<endl;
    Sleep(2000);
    
    cout<<"Versuch 1 - Waehlen sie eine Zahl zwischen 1-3 aus"<<endl;
    int zahl1;
    
    cin>>zahl1;
    
    // HIER WIRD ZAHL GENERIERT!
     srand (time(NULL));
    
    cout <<"Ihre Zahl lautete: "<<zahl1<<". Die gezogene Zahl lautet: "<<rand()%3+1<<endl;
    //MÖGLICHKEIT 1_________________________________
    if (rand()%3+1==zahl1)
    {
      goto d;
              }
    //MÖGLICHKEIT 2_________________________________
    if (zahl1>3 || zahl1<1)
     {
                     cout<<"Bitte geben sie eine gueltige Zahl ein!"<<endl;
                     Sleep(2000);
                     system("cls");
     }
    //MÖGLICHKEIT 3_________________________________
    else
     {
      goto a;
             }
    //VERSUCH 2 _______________________________VERSUCH 2___________________________VERSUCH2__________________________
    a:    
        cout<<"Sie lagen leider daneben!"<<endl;
    Sleep(2000);
    cout<<"Versuch 2 - Waehlen sie eine Zahl zwischen 1-3 aus"<<endl;
    int zahl2;
    cin>>zahl2;
    
        srand (time(NULL));
    cout <<"Ihre Zahl lautete: "<<zahl2<<". Die gezogene Zahl lautet: "<<rand()%3+1<<endl;
    //MÖGLICHKEIT 1_________________________________
    if (rand()%3+1==zahl2)
     {
          goto d;
                     }
    //MÖGLICHKEIT 3____(2 Ausgelassen)_____________               
    else
     {
      goto b;
             }
    //VERSUCH 3 _______________________________VERSUCH 3___________________________VERSUCH3__________________________ 
    
    b:
        cout<<"Sie lagen leider daneben!"<<endl;
    Sleep(2000);
    cout<<"Versuch 3 - Waehlen sie eine Zahl zwischen 1-3 aus"<<endl;
    int zahl3;
    cin>>zahl3;
    
        srand (time(NULL));
    cout <<"Ihre Zahl lautete: "<<zahl3<<". Die gezogene Zahl lautet: "<<rand()%3+1<<endl;
    //MÖGLICHKEIT 1_________________________________
    if (rand()%3+1==zahl3)
     {
      goto d;
             }
    //MÖGLICHKEIT 3____(2 Ausgelassen)_____________                   
    else
     {
         cout<<"Sie haben leider verloren."<<endl;
         goto c;
         {
          system("cls");
                         }  
      }
      // ENDE DER VERSUCHE TEIL 1 __________________________________________________________________ 
    
         d:
                 cout<<"Herzlichen Glueckwunsch! Sie haben gewonnen!"<<endl;
        getch();
      }
    


  • Rück den Code bloss nicht leserlich ein, sonst könnte noch jmd. auf die Idee kommen ihn sich trotz des schrecklichen Stils (goto etc.) anzusehen um dir zu helfen.



  • Sorry, hab ihn versucht so gut wie möglich zusammenzurücken.

    Ja bin noch voll der Anfänger und kenn noch nicht so die Basics 😉

    Sry...



  • Also ich habe jetzt mal kurz den Code für dein Spiel geschrieben, weil viel Ferien. Goto sollte man eigentlich nie verwenden... mir ist kein Beispiel bekannt wo es nötig ist.

    Dein Code ist etwas schlimm aber macht ja nix, man ist ja hier um zu lernen.

    Hier wäre mein Vorschlag wie der Code für den Spiel vielleicht aussehen könnte. Ich hab ihn jetzt nicht lange getestet und in ziemlich kurzer Zeit programmiert, aber es zeigt dir, wie man die goto weglässt und while-Schleifen dafür nimmt.

    #include <iostream>
    #include <ctime>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    void play_game();
    
    int main()
    {
    	srand( time(NULL) );
    	bool new_game = true;
    
    	// wird für jedes Spiel neu durchlaufen, wodurch man keine goto braucht
    	while( new_game )
    	{
    		new_game = false;
    		play_game();
    
    		int input;
    		cout << "Wenn sie ein neues Spiel wollen, geben Sie 1 ein, sonst 0" << endl;
    		cin >> input;
    		cout << endl << endl;
    
    		if( input == 1 )
    			new_game = true;
    
    	}
    
    }
    
    void play_game()
    {
    	int trials_left = 3; // anzahl versuche
    
    	while( trials_left > 0 )
    	{
    		int wanted_number = rand() % 3 + 1; // zufallszahl wird erzeugt
    		int chosen_number;
    		cout << "Waehlen Sie eine Zahl zwischen 1 und 3: ";
    		cin >> chosen_number;
    
    		// richtige zahl
    		if( wanted_number == chosen_number )
    		{
    			cout << "Herzlichen Glückwunsch" << endl << endl;
    			break;
    		}
    
    		// falsche zahl, neuer versuch
    		else if( trials_left > 0 )
    		{
    			cout << "Falsche Zahl. Wählen Sie eine neue Zahl" << endl << endl;
    			--trials_left; // anzahl versuche wird um 1 verrigert
    
    		}
    
    		// falsche zahl, neuer versuch
    		else
    		{
    			cout << "Sie haben das Spiel verloren" << endl << endl << endl;
    		}
    
    	}
    
    }
    

    Falls etwas unklar ist einfach fragen. Habe aber heute Abend erst später wieder Zeit.

    PS:
    Die if-Schleifen 😉



  • cout <<"Ihre Zahl lautete: "<<zahl1<<". Die gezogene Zahl lautet: "<<rand()%3+1<<endl;
    
    //MÖGLICHKEIT 1_________________________________
    if (rand()%3+1==zahl1)
    {
      goto d;
              }
    

    So wie ich dass sehe lässt du eine Zufallszahl generieren welche die gezogene darstellt. Anschließend vergleichst du sie aber wiederum mit einer die du neu generierst.
    Leg dir am besten eine Variable für die Zufallszahl an und vergleiche diese dann mit "zahl1"

    lol schon der 3. edit jetzt xD
    sry

    du solltest dich auf jeden fall mal mit der for-schleife beschäftigen.
    Durch diese könntest du deine 3 Abläufe durchgehen lassen und nach dem 3. wird direkt beendet.. des weiteren sparst du dir einen Haufen schreibarbeit.

    Des weiteren solltest du " srand (time(NULL))" einmal ganz oben in der main Funktion schreiben.. reicht volkommen aus

    Wenn ich noch was finde sag ich bescheid.
    Ich hoffe ich konnte helfen.

    greetz isi



  • Erstmal vielen Dank für deine Hilfe...

    Aber irgendwie gewinn ich da IMMER^^

    Oh, glaubt mans, war echt nur Zufall.. Hatt eebn 4 mal hintereinander beim1 Versuch geschafft.

    Und wo ich deinen Code lese ist es mir eig auch klar, aber wie das so ist, einfallen tut es mir selber nie^^.

    Danke 🙂



  • Ach ja aber eine Frage habe ich dann noch:

    Ich will das ja weiterführen, dh ein neues Spiel anknüpfen wenn das alte gewonnen ist, also ein komplett neues (Anderes System). Wie komme ich dahin ohne goto?



  • Also nach deinem aktuellen Stand würde ich das einfach nach dem ersten Spiel direkt in der Main funktion weiterführen.
    Ansonsten könntest du dir ein Menü mit "case" basteln .
    Wenn dein Stand höher ist solltest du dich mit Funktionen auseinander setzen.
    Grundsätzlich sollten die ablaufe und berechnungen nicht in der Main funktion stattfinden.
    Aber ich denke bis es so weit ist dauert es noch ein wenig 😉

    greetz isi



  • Also ich hab jetzt veruscht dirket in der valid main weiterzubasteln doch diese wird dann von anfang an an Spiel 1 Angehangen...

    Ach @ isi: Thx auch an dich, hatte deine Antwort erst gar nicht gesehen^^

    ich werds mal mit case ausprobieren


Anmelden zum Antworten