Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
13.09.09, 00:32
|
#1
|
Ist öfter hier
Registriert seit: Aug 2008
Beiträge: 232
Bedankt: 26
|
[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.
|
|
|
13.09.09, 02:29
|
#2
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
LOL hehe.
|
|
|
13.09.09, 02:34
|
#3
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
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.
|
|
|
13.09.09, 02:50
|
#4
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
lol noch besser... sorry.
du verwendest fürs einlesen als auch für den vergleich die gleiche variable
lösung kommt gleich.
|
|
|
13.09.09, 02:54
|
#5
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
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: ";
}
}
|
|
|
13.09.09, 03:21
|
#6
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
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!
|
|
|
13.09.09, 09:57
|
#7
|
Banned
Registriert seit: Aug 2009
Ort: Nazareth, Israel
Beiträge: 186
Bedankt: 2
|
Zitat:
Zitat von urga
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
|
|
|
13.09.09, 11:07
|
#8
|
Ist öfter hier
Registriert seit: Aug 2008
Beiträge: 232
Bedankt: 26
|
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
|
|
|
13.09.09, 13:45
|
#9
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
Code:
srand (time(NULL));
gesucht = rand() % 10 + 1;
achja, das ist C. Hat C++ überhaupt einen eigenen Zufallsgenerator?
|
|
|
13.09.09, 14:48
|
#10
|
Ist öfter hier
Registriert seit: Aug 2008
Beiträge: 232
Bedankt: 26
|
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.
|
|
|
13.09.09, 14:52
|
#11
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
du rufst srand garnicht auf...
|
|
|
13.09.09, 15:08
|
#12
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
Zitat:
Zitat von Underkane
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.
|
|
|
13.09.09, 17:01
|
#13
|
Ist öfter hier
Registriert seit: Aug 2008
Beiträge: 232
Bedankt: 26
|
Zitat:
Zitat von gosha16
du rufst srand garnicht auf...
|
Toller Beitrag. 
(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.
|
|
|
13.09.09, 17:07
|
#14
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
was ist denn an dem Beitrag verkehrt?
|
|
|
13.09.09, 17:28
|
#15
|
Ist öfter hier
Registriert seit: Aug 2008
Beiträge: 232
Bedankt: 26
|
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 argc, char *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 " << n << " 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 > loesung) cout << "\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-i << " Versuche. " << endl; cout << "Versuch' es nochmal. Gib eine Zahl ein: "; cin >> zahl; } if (zahl == loesung) cout << "\nRichtig! Es war " << loesung << ".\n" << endl; else cout << "\nLeider nicht erraten, es war " << loesung << ".\n" << endl; system("PAUSE"); //schließen return EXIT_SUCCESS; }
|
|
|
13.09.09, 22:20
|
#16
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
Code:
while ((tmp = tmp >> 1) > 0) {
n++;
}
öhmm, erklär' bitte mal was du erwartest was hier passiert.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 Uhr.
().
|