myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [C++] Hilfe bei Zahlenraten (https://mygully.com/showthread.php?t=1908370)

Underkane 13.09.09 00:32

[C++] Hilfe bei Zahlenraten
 
Hallo,
ich habe mich mal an C++ gewagt habe mich an ein erstes Spiel gecodet.
Es klappt auch fast alles, aber mir fällt folgendes auf.

7 soll die Zahl sein, bei der die Meldung "Richtig" erscheinen soll.
NUR (!) bei der 7.
Wenn ich allerdings eine Zahl > 7 eingebe und darauffolgend eine Zahl < 7 eingebe, kommt trotzdem die "Richtig" Meldung, was nicht sein sollte/dürfte.

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hallo! "; //Begrüßung Anfang
    cout << "Ich will mit dir ein Spiel spielen." << endl;
    cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    cout << "" << endl; //Leere Zeile
    cout << "(c) by Andreas Schmidt" << endl;
    cout << "" << endl; //Leere Zeile
   
    int zahl = 7;
   
    cout << "Welche Zahl habe ich mir gedacht? ";
    cin >> zahl;
   
    while(zahl < 7) //zahl ungleich 7
    {
              cout << "" << endl; //leere zeile
              cout << "Das ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl; //meldung
              cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
              cin >> zahl; //neue zahl
    }
   
    while(zahl > 7) //zahl ungleich 7
    {
              cout << "" << endl; //leere zeile
              cout << "Das ist leider nicht richtig. Meine Zahl ist kleiner. " << endl; //meldung
              cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
              cin >> zahl; //neue zahl
    }
   
    if(zahl == 7); //zahl gleich 7
    {
            cout << "" << endl; //leere zeile
            cout << "Richtig! " << endl; //lob
            cout << "" << endl; //leere zeile
            system("PAUSE"); //schließen
            return EXIT_SUCCESS;
    }
}

Bei diesem Code hält es sich bisschen länger.
Ich gebe eine Zahl < 7 ein, dann eine Zahl > 7 und dann nochmal eine Zahl < 7.
Dann erscheint trotzdem die "Richtig" Meldung.

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hallo! "; //Begrüßung Anfang
    cout << "Ich will mit dir ein Spiel spielen." << endl;
    cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    cout << "" << endl; //Leere Zeile
    cout << "(c) by Andreas Schmidt" << endl;
    cout << "" << endl; //Leere Zeile
   
    int zahl = 7;
   
    cout << "Welche Zahl habe ich mir gedacht? ";
    cin >> zahl;
   
    do //zahl ungleich 7
    {
              cout << "" << endl; //leere zeile
              cout << "Das ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl; //meldung
              cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
              cin >> zahl; //neue zahl
    } while(zahl < 7);
   
    do //zahl ungleich 7
    {
              cout << "" << endl; //leere zeile
              cout << "Das ist leider nicht richtig. Meine Zahl ist kleiner. " << endl; //meldung
              cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
              cin >> zahl; //neue zahl
    } while(zahl > 7);
   
    if(zahl == 7); //zahl gleich 7
    {
            cout << "" << endl; //leere zeile
            cout << "Richtig! " << endl; //lob
            cout << "" << endl; //leere zeile
            system("PAUSE"); //schließen
            return EXIT_SUCCESS;
    }
}

Weiß jemand was ich falsch mache und wie ich es ausbessern kann?

mfg
Underkane

//Edit:
Wenn ich 7 gleich am Anfang eingebe, bekomme ich trotzdem eine "Falsch" Meldung.
Und ich wüsste gerne, wie ich eine Zahl zwischen 1 und 10 automatisch (zufällig) generieren lasse, damit sie sich jedes mal ändert.

urga 13.09.09 02:29

LOL hehe.

urga 13.09.09 02:34

sorry,
aber LOL hehe :) lösung deines problems kommt gleich.

in der ersten while (oder do while) wartest du bis jemand was eingibt was < 7 ist.
d.h die while wird _niemals_ verlassen, falls jemand >= 7 eingibt.

falls < 7 eingegeben wurde bist du in der 2.ten while.
die wird erst verlassen, falls irgendwas > 7 eingegeben wird.

dann ist zahl > 7
und die finale if-bedingung wird nicht erfüllt.

d.h. der algorithmus ist falsch.

urga 13.09.09 02:50

lol noch besser... sorry.

du verwendest fürs einlesen als auch für den vergleich die gleiche variable :T

lösung kommt gleich.

urga 13.09.09 02:54

Code:

    int gesucht = 7;
    int zahl;
    cout << "Welche Zahl habe ich mir gedacht? ";
   
   
        bool gefunden = false;
        while (! gefunden) {
                cin >> zahl;
                if (zahl == gesucht) {
                        gefunden = true;
                }
                else {
                        cout << "leider falsch!" << endl << "weiter: ";
                }
        }


urga 13.09.09 03:21

was den zufallswert angeht, das sollte eigentlich per
Code:

Random rnd = new Random();
int gesucht = rnd->Next (1, 10);

funktionieren....
aber ich bekomm' das gerade nicht übersetzt und bin zu müde/faul nach ner lösung zu suchen.

viel erfolg weiterhin!

Jesus Christus 13.09.09 09:57

Zitat:

Zitat von urga (Beitrag 19955361)
sorry,
aber LOL hehe :) lösung deines problems kommt gleich.

in der ersten while (oder do while) wartest du bis jemand was eingibt was < 7 ist.
d.h die while wird _niemals_ verlassen, falls jemand >= 7 eingibt.

falls < 7 eingegeben wurde bist du in der 2.ten while.
die wird erst verlassen, falls irgendwas > 7 eingegeben wird.

dann ist zahl > 7
und die finale if-bedingung wird nicht erfüllt.

d.h. der algorithmus ist falsch.

Richtig, das Problem warum auch bei falschen Zahlen das richtig erscheint ist das ; am Ende der Zeile. Damit beendest du den den "Befehlsblock" der bei if=true ausgeführt wird. Alles was darauf folgt wird trotz der {} immer ausgeführt.

@Underkane: Bei deinem zweiten Beispiel ist das Problem, das die do-while-Schleife immer ausgeführt wird und am Ende nur geprüft wird, ob die Schleife ein zweites Mal durchgeführt ist.


@urga: Ganz klar, für diese Erklärung muss man 5 Posts machen, man kann das nicht alles direkt in einem Post schreiben oder nachträglich reineditieren

Underkane 13.09.09 11:07

Vielen Dank für eure Hilfe.
Ich weiß jetzt wo meine Fehler lagen.

Ich habe jetzt das hier:
Code:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])


{
 
    cout << "Hallo! "; //Begrüßung Anfang
    cout << "Ich will mit dir ein Spiel spielen." << endl;
    cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    cout << "" << endl; //Leere Zeile

 
 
    int gesucht = 7;
    int zahl;
    cout << "Welche Zahl habe ich mir gedacht? ";
   
   
        bool gefunden = false;
        while (! gefunden) {
                cin >> zahl;
                if (zahl == gesucht) {
                        gefunden = true;
                        cout << "" << endl;
                        cout << "Richtig!" << endl;
                        cout << "" << endl;
                        system("PAUSE"); //schließen
            return EXIT_SUCCESS;
                }
                else {
            cout << "" << endl;
            cout << "Leider falsch!" << endl << "Versuch' es nochmal: ";
                }
        }
}

Aber irgendwie schaffe ich nicht, dass die gesuchte Zahl zufällig zugewiesen wird.
Ich habe versucht diesen Code hinzuzufügen, aber dann spuckt der Kompiler einen Fehler aus.
Code:

int gesucht = 7;
int zahl;
Random rnd = new Random();
int gesucht = rnd->Next (1, 10);

Der Fehler:
Zitat:

In function `int main(int, char**)':
`Random' was not declared in this scope
expected `;' before "rnd"
redeclaration of `int gesucht'
`int gesucht' previously declared here
`rnd' was not declared in this scope
mfg
Underkane

gosha16 13.09.09 13:45

Code:

srand (time(NULL));
gesucht = rand() % 10 + 1;

achja, das ist C. Hat C++ überhaupt einen eigenen Zufallsgenerator?

Underkane 13.09.09 14:48

Stand der Dinge:
Code:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(void)


{
 
    cout << "Hallo! "; //Begrüßung Anfang
    cout << "Ich will mit dir ein Spiel spielen." << endl;
    cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    cout << "" << endl; //Leere Zeile
    cout << "(c) by Andreas Schmidt" << endl; //copyright =)
    cout << "" << endl; //Leere Zeile

    int ZahlenBereich = 10;
    int gesucht = rand()%ZahlenBereich+1;
    int zahl;
   
    cout << "Welche Zahl habe ich mir gedacht? ";
   
   
        bool gefunden = false;
        while (! gefunden) {
                cin >> zahl;
                if (zahl == gesucht) {
                        gefunden = true;
                        cout << "" << endl;
                        cout << "Richtig!" << endl;
                        cout << "" << endl;
                        system("PAUSE"); //schließen
            return EXIT_SUCCESS;
                }
                else if(zahl > 10)
        {
            cout << "" << endl;
            cout << "Du willst doch nicht etwa Schummeln, oder!?" << endl << "Versuch' es nochmal: ";
                }
                else if(zahl < 1)
        {
            cout << "" << endl;
            cout << "Du willst doch nicht etwa Schummeln, oder!?" << endl << "Versuch' es nochmal: ";
                }
               
                else
        {
            cout << "" << endl;
            cout << "Leider falsch!" << endl << "Versuch' es nochmal: ";
                }
        }
}

Alles funktioniert.
Nun möchte ich aber, dass die Zahl zufällig generiert wird. Richtig zufällig muss sie nicht sein, sie kann auch nach einem bestimmten Schema generiert werden, aber man sollte das "Spiel" mindestens 3-4x aufrufen können ohne dass die Zahl doppelt vorkommt.

Und am besten soll noch ausgegeben werden ob die gesuchte Zahl größer oder kleiner ist als die eingegebe Zahl.

gosha16 13.09.09 14:52

du rufst srand garnicht auf...

urga 13.09.09 15:08

Zitat:

Zitat von Underkane (Beitrag 19956912)
man sollte das "Spiel" mindestens 3-4x aufrufen können ohne dass die Zahl doppelt vorkommt.

das wird schon schwieriger und sollte m.e. als letzes problem behandelt werden.

du willst nämlich zufallszahlen, die doch nicht so zufällig sind, und das auch noch über den mehrfachen start des programms hinweg.

dazu muss sich das programm (z.b. in einer datei) merken welche zahlen schon gezogen wurden. weiterhin musst du dir pro zahl auch noch was wie einen verfallsstempel zulegen, sonst sind irgendwann alle zahlen schon gezogen und du kannst gar nicht mehr spielen.

wenn du das angehen solltest, UNBEDINGT dazu eine neue klasse definieren, sonst herrscht sehr bald code-chaos.

Underkane 13.09.09 17:01

Zitat:

Zitat von gosha16 (Beitrag 19956924)
du rufst srand garnicht auf...

Toller Beitrag. :T
(Achtung! Ironie!!)

@urga
Die Idee mit den Zahlen aus einer Datei lesen ist garnicht so schlecht.
Ich werde mal schauen, was sich machen lässt.

gosha16 13.09.09 17:07

was ist denn an dem Beitrag verkehrt?

Underkane 13.09.09 17:28

Oh, sorry.
Habe dich falsch verstanden bzw. verlesen..ehrlich gesagt weiß ich selbst nichtmehr, was daran falsch war.

Jedenfalls bin ich fertig und habe alles so, wie ich es haben möchte:
PHP-Code:

#include <cstdlib>
#include <iostream>
#include <time.h>

using namespace std;

int main(int argcchar *argv[])
{
    
int range 10;
    
int tmp range-1;
    
int n 1;
    while ((
tmp tmp >> 1) > 0) {
            
n++;
    }
    
cout << "Ratespiel v1.2\n\n\n";
    
cout << "Hallo! ";
    
cout << "Ich will mit dir ein Spiel spielen." << endl;
    
cout << "Ich denke mir eine Zahl zwischen 1 und " << range << ". " << endl;
    
cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    
cout << "Los geht's! Du hast " << << " Versuche!" << endl;
    
cout << "\n(c) by Andreas Schmidt\n" << endl;
    
    
int zahl;
    
srand(time(NULL)); //initialize random seed
    
unsigned int loesung = (rand() % range) + 1;
    
    
cout << "Welche Zahl habe ich mir gedacht? ";
    
cin >> zahl;
    
int i 0;
    while (
zahl != loesung && i++ < n-1)
    {
               if (
zahl loesungcout << "\nDas ist leider nicht richtig. Meine Zahl ist kleiner. " << endl;
               else 
cout << "\nDas ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl;
               
               
               
cout << "Du hast noch " << n-<< " Versuche. " << endl;
               
cout << "Versuch' es nochmal. Gib eine Zahl ein: "
               
cin >> zahl;
    } 
    
    if (
zahl == loesungcout << "\nRichtig! Es war " << loesung << ".\n" << endl;
    else 
cout << "\nLeider nicht erraten, es war " << loesung << ".\n" << endl;
    
system("PAUSE"); //schließen
    
return EXIT_SUCCESS;



urga 13.09.09 22:20

Code:

while ((tmp = tmp >> 1) > 0) {
            n++;
    }

öhmm, erklär' bitte mal was du erwartest was hier passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.