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 immer 1, und irgendwas Modulo 1 ist immer 0.
    Außerdem greifst du in Zeile 21 auf zahl 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 und lvl1. Ü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 vielleicht geratene_zahl oder kandidat oder sowas leichter - noch besser irgendwas auf Englisch (guessed_number oder candidate, vielleicht auch nur guess). 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 wie zahl. Schlimmer noch sind aber lvl und lvl1. Was unterscheidet die beiden? Ein besserer Name wäre zum Beispiel level. Wofür level1 stehen soll, weiß ich nicht. Deine Variable n könnte besser secret_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:
      <source>:25:22: warning: statement has no effect [-Wunused-value]
         25 |                 lvl1 == 10;
            |                 ~~~~~^~~~~
      
      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.
    • else { NULL; }. Wofür soll das gut sein? Wer hat dir NULL beigebracht? In C++ verwende nullptr für einen Nullpointer und 0 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.

Log in to reply