Hilfe beim Zahlenraten C++ 

Status
Für weitere Antworten geschlossen.

Underkane

Registered +
Registriert
März 2008
Beiträge
148
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 
#include 

using namespace std;

int main(int argc, char *argv[])
{
cout /Begrüßung Anfang
cout  cout  cout  cout /Begrüßung Ende
cout /Leere Zeile
cout  cout /Leere Zeile

int zahl = 7;

cout  cin >> zahl;

while(zahl < 7) //zahl ungleich 7
{
cout /leere zeile
cout /meldung
cout  cin >> zahl; //neue zahl
}

while(zahl > 7) //zahl ungleich 7
{
cout /leere zeile
cout /meldung
cout  cin >> zahl; //neue zahl
}

if(zahl == 7); //zahl gleich 7
{
cout /leere zeile
cout /lob
cout /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 
#include 

using namespace std;

int main(int argc, char *argv[])
{
cout /Begrüßung Anfang
cout  cout  cout  cout /Begrüßung Ende
cout /Leere Zeile
cout  cout /Leere Zeile

int zahl = 7;

cout  cin >> zahl;

do //zahl ungleich 7
{
cout /leere zeile
cout /meldung
cout  cin >> zahl; //neue zahl
} while(zahl < 7);

do //zahl ungleich 7
{
cout /leere zeile
cout /meldung
cout  cin >> zahl; //neue zahl
} while(zahl > 7);

if(zahl == 7); //zahl gleich 7
{
cout /leere zeile
cout /lob
cout /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.
 
warum setzt du deine zahl am anfang auf:
int zahl = 7; ?

es sollte reichen wenn du lediglich int zahl; schreibst.. denke da liegt dein fehler, schliesslich wird durch cin >> zahl der zahl sowieso ein wert zugewiesen

das mit zufallszahl sollte mit rand() funzen ;)

edit:

achso und es sollte if (zahl==7) heissen.. das semikolon am ende solltest du weg machen :)
 
Hi,
daran liegt es leider nicht.

int zahl = 7;
Damit wird zahl mit dem Wert 7 integriert.
mit cin >> zahl; wird ihr ein NEUER Wert zugewiesen.

und if (zahl==7) //ohne semikolon
funktioniert zwar, aber gewirkt das selbe wie if (zahl == 7);

Code:
#include 
#include 

using namespace std;

int main(int argc, char *argv[])
{
cout /Begrüßung Anfang
cout  cout  cout  cout /Begrüßung Ende
cout /Leere Zeile
cout  cout /Leere Zeile

int zahl;

cout  cin >> zahl;

do //zahl ungleich 7
{
cout /leere zeile
cout /meldung
cout  cin >> zahl; //neue zahl
} while(zahl < 7);

do //zahl ungleich 7
{
cout /leere zeile
cout /meldung
cout  cin >> zahl; //neue zahl
} while(zahl > 7);

if(zahl==7) //zahl gleich 7
{
cout /leere zeile
cout /lob
cout /leere zeile
system("PAUSE"); //schließen
return EXIT_SUCCESS;
}
}

mfg
Underkane
 
Du weisst schon, dass eine Do-Schleife immer (min.) einen Durchlauf hat?
Ansonsten funzt das auch nicht nacheinander.

PHP:
#include 
#include 
#include 

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  cout  cout  cout  cout  cout  
int zahl;
srand ( time(NULL) ); //initialize random seed
unsigned int loesung = (rand() % range) + 1;

cout  cin >> zahl;
int i = 0;
while (zahl != loesung && i++ < n-1)
{
if (zahl > loesung) cout  else cout  cout  cout  cin >> zahl;
} 

if (zahl == loesung) cout  else cout  return 0;
}

Edit: Habs jetzt so gemacht, dass die minimale Versuchsanzahl selbst berechnet wird.
 
Zuletzt bearbeitet von einem Moderator:
@skyte das war dem TO bestimmt klar, siehe dem *grins* am ende

@underkane
najo, hab nie c++ gelernt.. bin nur drübergeflogen und das is mir halt sofort aufgefallen.. haette ja sein können das die fehler daran schon liegen ;)
(es waren aufjedenfall schönheitsfehler)
 
@Skyte
Ich habe meinen Fehler jetzt erkannt.
Wenn ich jetzt deinen Cope kompiliere, dann bekomme ich entweder eine oder garkeine Zahl, die aber trotzdem Zufällig ist.
Dann steht da "Drücken Sie eine beliebige Taste . . ." und dann schließt sich das Programm.

mfg
Underkane
 
bekomme ich entweder eine oder garkeine Zahl, die aber trotzdem Zufällig ist.
Hab den Satz nicht so ganz verstanden. Wie "gar keine Zahl"?

Kannst es vllt mal in die Form bringen, wie du es am Anfang hattest, und zwar return 0 gegen das hier ersetzen:
Code:
system("PAUSE"); //schließen
return EXIT_SUCCESS;

Ansonsten vllt mal
Code:
srand(time(NULL));
auskommentieren.
 
Ich habe nur "fetzen" also nur einen Teil von dir übernommen.
Dann stand bei mir nur als cout (Ausgabe) eine Zahl zwischen 1 und 10, oder garnichts und es kam direkt: drücken sie eine beliebige taste zum fortsetzen. . . oder so ähnlich und dann ging das programm aus.

Jetzt habe ich alles von dir übernommen. Es funktioniert auch die größer/kleiner Ausgabe, aber wenn ich die richtige Zahl errate schließt sich das Programm einfach.

EDIT:
Ich hab jetzt return 0; durch system("PAUSE"); return EXIT_SUCCESS; ersetzt und jetzt geht alles perfekt. =)
Vielen Dank für deine Hilfe.

Edit²:
Vielen Dank. Ich habe jetzt alles so, wie ich es haben will.
PHP:
#include 
#include 
#include 

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  cout  cout  cout  cout  cout  cout  
int zahl;
srand(time(NULL)); //initialize random seed
unsigned int loesung = (rand() % range) + 1;

cout  cin >> zahl;
int i = 0;
while (zahl != loesung && i++ < n-1)
{
if (zahl > loesung) cout  else cout  

cout  cout  cin >> zahl;
} 

if (zahl == loesung) cout  else cout  system("PAUSE"); //schließen
return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet von einem Moderator:
aber wenn ich die richtige Zahl errate schließt sich das Programm einfach.

Es schiesst sich nicht ab. Es gibt "Richtig" aus und beendet ganz normal, nur wohl zu schnell um es zu sehen.
Du kannst es von der Console (CMD) aus starten um alles zu sehen.
Dein "PAUSE" wartet halt noch auf ne Benutzereingabe, bevor es beendet.
 
Ah okay.
Vielen Dank für deine Hilfe.

mfg
Underkane
 
Sorry, wenn das schon geklärt, aber da ich gerade Zeit habe, hier eine kleiner Tipp für Anfänger ;)

Benutze noch besser ein getch aus der Bibliothek ich glaub "conio", das Programm gibt dann nicht diese nervige "Bitte drücken sie eine beliebige Taste"-Mitteilung aus und du kannst davor auch noch, falls man das möchte, einen selbsterfunden Text, z.B. mit -> cout
cout getch();
return 0;
 
Jo, getch ist besser.
Unter Linux gibs naemlich kein PAUSE, deswegen hab ich das auch entfernt.
 
getchar() war doch des oder
bei virtual studio brauchst du aber noch davor cin.get


und falls es dich interressiert ich habe auch mal aus langeweile n zahlenraten mit zufallszahlen gemacht


hier der c++ code

PHP:
// Zahlenraten.cpp : Zahlenraten-Spiel mit Zufallsgenerator
//

#include "stdafx.h"
#include "iostream"
#include "time.h"
#include "windows.h"
#include "conio.h"
using namespace std;

int zufall(const int, const int);
void kleiner(int zahl);
void groesser(int zahl);
void gleich();
int menue();

int _tmain(int argc, _TCHAR* argv[])
{
//int i_wert2=0;
int i_wert2=menue();
bool weiter(true);
int i_eingabe;
cout  cout  int i_fall=zufall(1, i_wert2);

do {
cin >> i_eingabe;

if (i_eingabe { 
kleiner(i_eingabe);
}
else if (i_eingabe>i_fall)
{
groesser(i_eingabe);
}
else
{
gleich();
weiter=false;
} 
} while(weiter);


Sleep(10000);
return 0;
}
int menue()
{

int i_wert=99;
cout  cout  cin >> i_wert;
return i_wert;
}
int zufall(const int a, const int b)
{
srand ((unsigned int)time(NULL));
// zielbereich
int c = b-a;
/* c muß größer als 0 sein
c muß kleiner als RAND_MAX sein
obergrenze, über der rand verworfen wird */

int d = RAND_MAX - (RAND_MAX % c);
int e;
do
{ 
e = rand();
} while (e < d);
return (e % c) + a;
}

void kleiner(int zahl)
{
cout  }
void groesser(int zahl)
{
cout  }
void gleich()
{
cout  }
 
Falls es dich interessiert, du kannst statt

Code:
cout code]

auch einfach

[code]cout code]

schreiben, da muss kein leerer String dazwischen sein.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten