VB -15: Zufallszahlen

Dem Zufall auf die Sprünge helfen...

Bevor wir etwas mehr Abwechslung in unser Programm bringen, wollen wir uns noch kurz einem kleinen Problem der letzen Übung zuwenden. Aufmerksame haben es sicher schon gemerkt: Die Positionierung der Abfrage im Change-Ereignis ist zwar für den ungeübten Anwender unseres Programms recht angenehm (er braucht keine zusätzlichen Tasten zu drücken, damit das Programm weiter macht), hat jedoch in der jetzigen Form einen kleinen Haken:

Wenn der Anwender - etwa nach einer falschen Eingabe - die Zahl im Textfeld korrigieren will, taucht schon beim Löschen das Meldungsfenster wieder auf und meldet ein "falsches Ergebnis". Das liegt daran, daß unser Change-Ereignis bei jeder Änderung eintritt, also auch beim Löschen.

Wir könnten das verhindern, wenn wir z.B. die IF-Abfrage nur dann ablaufen lassen, wenn die Länge des Textes gleich 1 ist und sie auch gleichzeitig auf 1 begrenzen. Bei unserer Zählübung würde das funktionieren, weil wir maximal 9 Kugeln haben. Da wir jedoch später auch zweistellige Zahlen benutzen wollen, müssen wir uns etwas anderes einfallen lassen.

Eine weitere Möglichkeit besteht darin, den User nach Eingabe die Enter-Taste drücken zu lassen und erst darauf zu reagieren. Wir könnten das ohne eine weiteres Control machen, wenn wir jeden Tastendruck des Users abfangen (wie werden wir später noch sehen), das wäre aber ohne weitere Erklärungen/Anleitungen nicht direkt "einsichtig" für den Anwender. Wir machen es also einfach und überschaubar, indem wir unserer Form einfach einen kleinen Button hinzufügen, den der User nach Eingabe seiner Zahl drücken soll.

Wir setzen einen Command-Button mit dem Namen "Fertig" neben das Textfeld und geben ihm auch die Aufschrift (caption) fertig. Um den Anwender eine kleine Hilfestellung zu geben, können wir noch in die ToolTipText-Eigenschaft "Hier klicken, wenn Eingabe überprüft werden soll" eintragen (wird angezeigt, wenn der User die Maus über den Button hält). Besonders komfortabel wird es für den User, wenn wir auch gleich noch die "Default"-Eigenschaft auf "True" setzen. Dies bedeutet, daß dieser Button automatisch gedrückt wird, wenn der User die Enter-Taste drückt. Und natürlich soll auch dieser Button beim Start erstmal unsichtbar sein (visible=False).

Jetzt müssen wir nur unsere Ergebnis-Abfrage von unserem Ergebnis_Change- in das Fertig_Click-Ereignis verschieben:

    Private Sub Fertig_Click()
        If Ergebnis.Text = "5" Then
            MsgBox "Richtig!"
           Else
            MsgBox "Leider falsch!"
        End If
    End Sub
    

Und im Unterprogramm "Zaehlen" müssen wir auch dieses Control erstmal sichtbar machen:

    Sub Zaehlen()
        Frage.Visible = True            'Frage anzeigen
        For i = 1 To 5                  '5 Kugeln anzeigen
            KugelX(i).Visible = True    '1 abziehen, weil Index mit 0 beginnt!
        Next
        Ergebnis.Visible = True         'Antwortfeld anzeigen
        Fertig.Visible = True           'Fertig-Button anzeigen
        Ergebnis.SetFocus               'Cursor ins Textfeld "Ergebnis" setzen
    End Sub
    

Damit der Cursor beim Start auch gleich an der richtigen Stelle steht, habe ich hier noch die SetFocus-Methode auf das Textfeld angewandt.

Jetzt aber zur versprochenen Abwechslung! Es wäre recht mühsam und langweilig, wenn wir alle zu "erratenden" Zahlen vorher bestimmen und programmieren müßten. Wir können es einfach dem Zufall überlassen, denn VB bringt einen allzeit bereiten Zufallsgenerator mit. Da wir nicht jede beliebige Zahl wollen, sondern nur solche zwischen 2 (damit's nicht zu einfach wird) und 9 (mehr Kugeln hatten wir ja erstmal nicht vorgesehen), müssen wir dem Zufallszahlengenerator mitteilen, in welchem Bereich die Zahl liegen soll. Weil wir den Zufallsgenerator später noch öfter an anderer Stelle in Anspruch nehmen wollen, lagern wir ihn gleich als Prozedur in unser Modul "Allgemein" aus, diesmal jedoch nicht als "Sub" (Unterprogramm), sondern als "Function". Die Struktur sieht fast gleich aus:

    Function Zufallszahl(ByVal min, ByVal max)
        z = Rnd            'Zufallszahl (liegt zwischen 0 und 1)
        Zufallszahl = Int(min + (max - min + 1) * z)
    End Function
    

Wie funktioniert's? "Rnd" (die Zufallsfunktion) gibt stets eine Zahl zwischen 0 und 1 zurück. Damit sie im gewünschten Bereich liegt, müssen wir zum Mindestwert (min) das maiximale Delta (= max - min) addieren. Da unsere Zufallszahl ganzzahlig sein soll, wandeln wir sie mit "Int" um. die Int-Funktion hat jedoch einen kleinen Haken: Sie schneidet einfach alles ab, was hinter dem Komma ist. Wir müssen daher zu unserem Delta noch 1 addieren. Klingt zu kompliziert? Probiert damit ein bißchen in einem kleinen Progrämmchen herum!

Wichtig bei einer Function ist, daß am Ende der Function ein Rückgabe-Wert übergeben wird (hier: Zufallszahl =...)!

Künftig brauchen wir unsere Zufallsfunktion nur noch wie eine normale Basic-Funktion im Hauptprogramm aufzurufen:

    Sub Zaehlen()
        x = Zufallszahl(2, 9)           'Zufallszahl zwischen 2 und 9
        Frage.Visible = True            'Frage anzeigen
        For i = 1 To x                  'x Kugeln anzeigen
            KugelX(i - 1).Visible = True '1 abziehen, weil Index mit 0 beginnt!
            Verzoegerung 0.05           
            'kleine Verzögerung, damit wir sehen, wie die Kugeln angezeigt werden
        Next
        Ergebnis.Text = ""              'Textfeld löschen
        Ergebnis.Visible = True         'Antwortfeld anzeigen
        Fertig.Visible = True           'Fertig-Button anzeigen
        Ergebnis.SetFocus               'Cursor ins Textfeld setzen
    End Sub
    

Da unser Fertig_Click-Ereignis auch wissen muß, welche Zahl es abprüfen soll:

    Private Sub Fertig_Click()
        If Ergebnis.Text = x Then
            MsgBox "Richtig!"
           Else
            MsgBox "Leider falsch!"
        End If
        For i = 1 To x           'Kugeln wieder unsichtbar machen
            KugelX(i - 1).Visible = False
        Next
        Zaehlen                  'nächste Zählübung
    End Sub
    

müssen wir dafür sorgen, daß die aktuelle Zufallszahl im gesamten Modul bekannt ist (normalerweise sind Zahlen nur innerhalb einer Prozedur bekannt und selbst diese vergißt sie sofort wieder, wenn die Prozedur verlassen wird).

Dies macht man, indem man (in den oberen DropDown-Listen) unter General > Declare (stets am Anfang des Moduls) die Variable mit

    Dim x       'aktuelle Zufallszahl modulweit bekannt machen
    

deklariert. Dim ist eine Abkürzung für "Dimension", wir werden ihre Bedeutung und weitere Möglichkeiten später noch näher kennenlernen.

Wenn wir jetzt unser Programm laufen lassen, kann unser Anwender bis zum Ermüden Zählen üben...

Beispielprojekt laden

p.s.: Laßt das Programm mehrmals von Neuem ablaufen und schreibt Euch mal die Zahlen auf..., fällt Euch was auf?

zurück Index weiter


© Copyright 1998-2000 J.Behling EMail schreiben ABC-Ware's Homepage
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.