rand() %n mit Variabel
-
Hallo!
Ich habe vor ein paar Wochen mit dem Programmieren angefangen. Ich mache ein "Spiel", wo man eine Random Zahl finden muss.
Jetzt wollte ich einstellen, dass man eingeben kann wie schwierig das Ganze sein soll. Also: rand() %lvl
Da aber rand() vor der while Schlaufe stehen muss kann ich die Variable lvl in der if Schleife nicht definieren.Kann mir jemand helfen?
#include <Windows.h> #include <iostream> #include <cstdlib> #include <random> #include <time.h> #undef max using namespace std; int main() { int zahl = 0; int lvl = 0; int lvl1 = 1; srand(time(NULL)); int n = rand() %lvl1; while (zahl != n) { cout << "welche Schwierigkeitsstufe willst du haben? (1-5) "; cin >> lvl; if (lvl == 1) { lvl1 == 10; } if (lvl == 2) { lvl1 == 25; } cout << "Gib eine Zahl ein!" << endl; cin >> zahl; while (cin.fail()) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << endl << "Fehlerhafte eingabe! " << endl; cout << "Bitte Zahl eingeben: "; cin >> zahl; } if (zahl < n) { cout << "Die gesuchte Zahl groesser " << endl; } if (zahl > n) { cout << "Die gesuchte Zahl ist kleiner " << endl; } if (zahl == n) { cout << "Richtig! gut gemacht" << endl; } else { NULL; } } }
-
Du darfst die Zufallszahl natürlich erst dann erzeugen, wenn der Benutzer die Schwierigkeitsstufe eingegeben hat. Bei dir ist
lvl1
immer1
, und irgendwas Modulo 1 ist immer 0.
Außerdem greifst du in Zeile 21 aufzahl
zu, ohne die Variable vorher initialisiert zu haben.PS:
#include <windows.h>
brauchst du nicht, und statt#include <time.h>
solltest du#include <ctime>
benutzen, damit die time-Funktionen im std-namespace liegen.Du könntest außerdem drüber nachdenken, dein Programm in Funktionen zu gliedern, um die Aufgabe in kleiner Teilaufgaben zu zerlegen. Vernünftig wären zB eine Funktion für die Eingabe der Schwierigkeit und eine für das Raten.
-
Benutze 2 Schleifen. Eine äußere für das Spiel, in der der Schwierigkeitsgrad abgefragt wird und die Zufallszahl bestimmt wird.
Und eine innere, in der die Zahl erraten wird.Besser sind Funktionen.
Die schnellste Lösung wäre aber, die Zufallszahl ohne Modulo zu speichern und erst dann die Ratezahl zu berechnen, wenn du den Schwierigkeitsgrad kennst.
-
Generelle Ratschläge:
- Definiere Variablen erst da, wo du sie brauchst, nicht global im Programm. Du hast in main 3 Variablen,
zahl
,lvl
undlvl1
. Überlege dir, ob du die wirklich überall in main brauchst. - Benenne Variablen ordentlich. Das macht dir das Leben leichter.
zahl
ist ein sehr allgemeiner Name, kann alles und nichts bedeuten. Wenn es die Benutzereingabe sein soll, wäre vielleichtgeratene_zahl
oderkandidat
oder sowas leichter - noch besser irgendwas auf Englisch (guessed_number
odercandidate
, vielleicht auch nurguess
). UND: den Bereich, wo diese Variable bekannt ist, klein halten, sodass man schon gleich sieht, was diese Zahl ist. Wenn der Scope dieser Variable nur wenige Zeilen lang ist, dann geht auch so ein generischer Name wiezahl
. Schlimmer noch sind aberlvl
undlvl1
. Was unterscheidet die beiden? Ein besserer Name wäre zum Beispiellevel
. Wofürlevel1
stehen soll, weiß ich nicht. Deine Variablen
könnte bessersecret_number
heißen. Benennung von Variablen ist wichtig und nicht immer leicht und wird gerne in seiner Wichtigkeit unterschätzt. - Schalte Warnungen des Compilers an. Du solltest dann Warnungen bekommen in der Art:
Das liegt einfach daran, dass ein Vergleich true oder false ergibt, du das Ergebnis aber einfach verwirfst. Du fragst also, ist lvl1 gleich 10, aber interessierst dich nicht für die Antwort.<source>:25:22: warning: statement has no effect [-Wunused-value] 25 | lvl1 == 10; | ~~~~~^~~~~
else { NULL; }
. Wofür soll das gut sein? Wer hat dir NULL beigebracht? In C++ verwendenullptr
für einen Nullpointer und0
wenn du die Zahl null meinst. Aber in diesem else-Zweig ist das ein weiteres Statement ohne Effekt.- und zuletzt, was die anderen gesagt haben. Versuche, kleine Funktionen für Teilaspekte deines Programms zu schreiben.
- Definiere Variablen erst da, wo du sie brauchst, nicht global im Programm. Du hast in main 3 Variablen,