Hilfe bei einem kleinen Zahlenspiel...



  • Hi,

    ich programmiere noch nicht lange unter c++ und habe nun ein kleines Problem bei meinem Zahlenspiel. Ich habe mir shcon Stunden den Kopf zerbrochen, aber ich komme nicht auf des Rätsels Lösung. Werft doch mal einen Blick auf meinen C++-Code.
    Ich habe folgende Probleme:
    1. Wenn man am Ende des Programms "y" eingibt, dann entsteht eine Endllosschleife
    2. Der Vergleich, der ermittelt wer gewonnen hat, funtkioniert nicht. Er zeigt immer "Gleichstand" an

    Da ich nicht genau weiß, wo die Fehler sind, habe ich mal den ganzen Sourcecode gepostet. Also bitte nicht böse sein.

    P.S. Könnt ihr mich auch noch Dinge sagen, die man hätte besser machen können oder welche man hätte vermeiden sollen? Ich bin für jede Kritik dankbar.

    #include <iostream>
    using namespace std;
    
    void ZugComputer();
    void ZugSpieler();
    
    int main()
    {
        cout << "   ***********RATESPIEL***********     " << endl;
        srand(time(NULL));
        char restart = 'y';
        while(restart == 'y')
        {
        restart = 'n';
        int anzahlcomputer = 0;
        int anzahlspieler = 0;
        bool spielergefunden;
        bool computergefunden;
            ZugSpieler();
            ZugComputer();
            if(anzahlspieler < anzahlcomputer)
                    if(spielergefunden == true)
                                    cout << "Sie haben gewonnen!" << endl;
            else if(anzahlspieler > anzahlcomputer)
                    if(computergefunden == true)
                                    cout << "Sie haben verloren!" << endl;
            else
                    cout << "Gleichstand!" << endl;
    
            cout << "Nochmal?(y/n)" << endl;
        do
            cin.get(restart);
        while(restart != 'y' && restart != 'n');
        }
    }
    
    void ZugComputer()
    {
     int anzahl = 0;
     bool computergefunden = false;
     int obergrenze = 15;
     int untergrenze = 0;
     int vorherigezahl = 0;                         //zahl, die der computer tippt
     int gesuchtezahl = (rand() % 15) +1;
     int anzahlcomputer;
          while( anzahl < 3 && !computergefunden)
          {
    neu:
          srand(time(NULL));
           if(vorherigezahl < gesuchtezahl)         //falls die zahl des Computers kleiner ist
           {                                        //dann rechnet er diese schritte
            untergrenze =  vorherigezahl;
            vorherigezahl = obergrenze - untergrenze;
            vorherigezahl = vorherigezahl / 2;
            vorherigezahl = vorherigezahl + ((rand() % 4) -2);
            vorherigezahl = untergrenze + vorherigezahl;
           }  
           if(vorherigezahl > gesuchtezahl)        //falls die zahl des Computers größer ist
           {                                       //dann rechnet er diese schritte
            obergrenze = vorherigezahl;
            vorherigezahl =  obergrenze - untergrenze;
            vorherigezahl = vorherigezahl / 2;
            vorherigezahl = vorherigezahl + ((rand() % 4) -2);
            vorherigezahl = obergrenze - vorherigezahl;
           }
    
           if(vorherigezahl == obergrenze || vorherigezahl == untergrenze ||
              vorherigezahl > obergrenze || vorherigezahl < untergrenze)
                  goto neu;
    
           cout << vorherigezahl << " ";           //hier wird die zahl ausgegeben
           if(vorherigezahl < gesuchtezahl)        //hier wird sie mit der zufallszahl verglichen
                  cout << " zu klein!" << endl;
           else if(vorherigezahl > gesuchtezahl)
                  cout << " zu gross!" << endl;
           else
                  computergefunden = true;
           anzahl++;                               //anzahl der versuche wird um 1 erhöht
           anzahlcomputer++;
          }
      if(!computergefunden)
        cout << "Der Computer hat die Zahl nicht erraten!" << endl
             << "Die gesuchte Zahl: " << gesuchtezahl << endl;
      else
        cout << endl << "Der Computer hat die Zahl erraten!" << endl;
    }
    
    void ZugSpieler()
    {
      int eingabe;
      int anzahl = 0;
      bool spielergefunden = false;
      int gesuchtezahl = (rand() % 15) +1;
      int anzahlspieler; 
          while( anzahl < 3 && !spielergefunden)
          {
           cin >> eingabe;
           anzahl++;
           if(eingabe < gesuchtezahl)
                  cout << " zu klein!" << endl;
           else if(eingabe > gesuchtezahl)
                  cout << " zu gross!" << endl;
           else
                  spielergefunden = true;
           anzahlspieler++;
          }
      if(!spielergefunden)
        cout << "Sie haben die Zahl nicht erraten!" << endl
             << "Die gesuchte Zahl: " << gesuchtezahl << endl << endl;
      else
        cout << "Glueckwunsch! Sie haben die Zahl erraten!" << endl << endl;
    }
    


  • bool spielergefunden; 
        bool computergefunden; 
            ZugSpieler(); 
            ZugComputer();  
            if(spielergefunden&&!computergefunden)
                cout<<"sie haben gewonnen";
            else if(!spielergefunden&&computergefunden)
                cout<<"sie haben verloren";
            else if(anzahlspieler<anzahlcomputer)
                cout<<"sie haben gewonnen";
            else if(anzahlspieler>anzahlcomputer)
                cout<<"sie haben verloren";   
            }
            else
            { 
                cout << "Gleichstand!" << endl; 
            }
            cout << "Nochmal?(y/n)" << endl; 
        do 
            cin.get(restart); 
        while(restart == 'y'); 
        }
    

    habs mal korrigiert

    so, so is es richtig, kürzer gehts nur mit "||"



  • @otze:

    es funktioniert noch immer nicht richtig.... ich habe es getestet. Ich habe die Zahl erraten und der computer nicht und trotzdem stand da, dass ich verloren habe.
    Zudem schließt sich dsa Fenster sofort wieder nachdem der Computer dran war. Also dein while(restart == 'y') hilft leider nicht...



  • fehler(dickes plural) gefunden,hier der neue "leicht" veränderte code

    #include <iostream>
    using namespace std;
    
    void ZugComputer(bool& computergefunden,int& anzahlcomputer);
    void ZugSpieler(bool& spielergefunden,int& anzahlspieler);
    
    int main()
    {
        cout << "   ***********RATESPIEL***********     " << endl;
        srand(time(NULL)); 
        char restart = 'y';
        while(restart == 'y') 
        {
        restart = 'n';
        int anzahlcomputer = 0;
        int anzahlspieler = 0;
        bool spielergefunden=false;
        bool computergefunden=false;
        ZugSpieler(spielergefunden,anzahlspieler);
        ZugComputer(computergefunden,anzahlcomputer);
        if(spielergefunden&&!computergefunden)
            cout<<"sie haben gewonnen"<<endl;
        else if(!spielergefunden&&computergefunden)
            cout<<"sie haben verloren"<<endl;
        else if(anzahlspieler<anzahlcomputer)
            cout<<"sie haben gewonnen"<<endl;
        else if(anzahlspieler>anzahlcomputer)
            cout<<"sie haben verloren"<<endl;
        else
            cout << "Gleichstand!" << endl;
        cout << "Nochmal?(y/n)" << endl;
        cin>>restart;
        }
    }
    
    void ZugComputer(bool& computergefunden,int& anzahlcomputer)
    {
     int anzahl = 0;
    
     int obergrenze = 15;
     int untergrenze = 0;
     int vorherigezahl = 0;                         //zahl, die der computer tippt
     int gesuchtezahl = (rand() % 15) +1;
    
          while( anzahl < 3 && !computergefunden) 
          { 
    neu: 
          srand(time(NULL)); 
           if(vorherigezahl < gesuchtezahl)         //falls die zahl des Computers kleiner ist
           {                                        //dann rechnet er diese schritte 
            untergrenze =  vorherigezahl; 
            vorherigezahl = obergrenze - untergrenze; 
            vorherigezahl = vorherigezahl / 2; 
            vorherigezahl = vorherigezahl + ((rand() % 4) -2);
            vorherigezahl = untergrenze + vorherigezahl; 
           }   
           if(vorherigezahl > gesuchtezahl)        //falls die zahl des Computers größer ist 
           {                                       //dann rechnet er diese schritte 
            obergrenze = vorherigezahl;
            vorherigezahl =  obergrenze - untergrenze; 
            vorherigezahl = vorherigezahl / 2; 
            vorherigezahl = vorherigezahl + ((rand() % 4) -2); 
            vorherigezahl = obergrenze - vorherigezahl; 
           }
    
           if(vorherigezahl == obergrenze || vorherigezahl == untergrenze || 
              vorherigezahl > obergrenze || vorherigezahl < untergrenze) 
                  goto neu; 
    
           cout << vorherigezahl << " ";           //hier wird die zahl ausgegeben 
           if(vorherigezahl < gesuchtezahl)        //hier wird sie mit der zufallszahl verglichen 
                  cout << " zu klein!" << endl; 
           else if(vorherigezahl > gesuchtezahl) 
                  cout << " zu gross!" << endl;
           else 
                  computergefunden = true; 
           anzahl++;                               //anzahl der versuche wird um 1 erhöht 
           anzahlcomputer++;
          }
      if(!computergefunden) 
        cout << "Der Computer hat die Zahl nicht erraten!" << endl 
             << "Die gesuchte Zahl: " << gesuchtezahl << endl; 
      else 
        cout << endl << "Der Computer hat die Zahl erraten!" << endl;
    } 
    
    void ZugSpieler(bool& spielergefunden,int& anzahlspieler)
    { 
      int eingabe;
      int anzahl = 0;
    
      int gesuchtezahl = (rand() % 15) +1;
          while( anzahl < 3 && !spielergefunden)
          {
           cin >> eingabe; 
           anzahl++; 
           if(eingabe < gesuchtezahl) 
                  cout << " zu klein!" << endl; 
           else if(eingabe > gesuchtezahl)
                  cout << " zu gross!" << endl; 
           else 
                  spielergefunden = true; 
           anzahlspieler++; 
          }
      if(!spielergefunden) 
        cout << "Sie haben die Zahl nicht erraten!" << endl 
             << "Die gesuchte Zahl: " << gesuchtezahl << endl << endl; 
      else
        cout << "Glueckwunsch! Sie haben die Zahl erraten!" << endl << endl;
    }
    


  • okay danke otze... es funktioniert....



  • der computer is aber nich sehr schlau, hat grad bei mir 2mal jintereinander "3" gesagt 😃



  • @otze

    das geht doch eigentlich gar nicht....

    if(vorherigezahl == obergrenze || vorherigezahl == untergrenze ||
    vorherigezahl > obergrenze || vorherigezahl < untergrenze)
    goto neu;

    verhindert das doch... also bei mir hat er noch nie 2mal hintereinander die selbe zahl genannt....



  • eben, das hat mich ja auch gewundert,scheint auch nur vorzukommen, wenn der wert nahe am maximum/minimum ist


Anmelden zum Antworten