Lazarus/Spielen mit dem Zufall
Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42), vom Benutzer während der Eingabe erfragt (etwa mit a:=StrToInt(...)) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. a:=sqrt(c)). Für viele Anwendungen – vor allem für die, die ein bisschen Spaß machen – wäre es jedoch nett, zufällige Zahlen zu haben. Das gilt z.B. für Glücksspiele genauso wie für Geschicklichkeitsspiele.
Für solche Fragen ist der Befehl random nützlich. Ohne Klammer hinter dem Befehl (also etwa x:=random;) “würfelt” der Befehl eine (reelle) Zufallszahl im Bereich zwischen 0 und 1. Damit ist es mit ein bisschen Mathematik nicht schwierig, auch natürliche Zufallszahlen in beliebigen Zahlenbereichen zu basteln. Allerdings nimmt Lazarus einem einen Teil dieser Arbeit ab, wenn man eine Zahl in Klammern hinter den Befehl schreibt (also etwa k:=random(bereich);). Der Computer würfelt dann eine ganzzahlige Zufallszahl zwischen 0 und bereich-1.
30 procedure TForm1.Button1Click(Sender: TObject);
31 begin
32 z:=random(100);
33 Edit1.Text:=IntToStr(z);
34 end;
Tatsächlich: Auf den ersten Blick kommt bei jedem Knopfdruck eine vollkommen zufällige Zahl heraus. Doch der Schein trügt: Wenn man sich die ersten 3 Zahlen nach dem ersten Knopfdruck notiert, dann das Programm neu startet und das Vorgehen noch ein paar mal wiederholt, wird man feststellen: Die Zahlenfolge ist nach dem Programm-Neustart immer die gleiche.
So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl randomize; ausführen lässt. Der sorgt dafür, dass die Zufallszahlen tatsächlich bei jedem Programmlauf andere sind. Zusätzlich zum Click-Ereignis des Buttons bauen wir jetzt einfach noch ein Programmstück, was beim Erzeugen des Fensters ausgeführt wird.
30 procedure TForm1.FormCreate(Sender: TObject);
31 begin
32 randomize;
33 end;
- Einführung
- Technisches
- Komponenten, Eigenschaften, Ereignisse
- Computer-Mathematik
- Verzweigungen
- Spielen mit dem Zufall
- Schleifen
- Computer-Graphik
- Geschachtelte Verzweigungen und Verzweigungen in Schleifen
- Prozeduren, Funktionen und Bibliotheken
- Felder (Arrays)
- Zeichen (Char) und Zeichenkette (String)
- Dateien
- Graphische Komponenten
Projekt: Rechentrainer
Mit den bisher erworbenen Fähigkeiten kann man nun auch ein richtiges Programmierprojekt starten:
In der Grundschule lernen die meisten Kinder das Rechnen in den Grundrechenarten "Plus", "Minus", "Mal" und "Geteilt". Ein Computerprogramm soll die Grundschulkinder beim Üben "im Zahlenraum von 0 bis 20" unterstützen. Es soll auf Knopfdruck Aufgaben mit Zufallszahlen erstellen. Die Kinder können dann eine Lösung eingeben und auf Richtigkeit überprüfen lassen.
Es bietet sich an, schrittweise vorzugehen und ein zunächst ganz einfaches Programm immer mehr verfeinern bzw. erweitern.
- Man kann mit einer einzigen und einfachen Rechenart (z.B. "Plus") anfangen.
- Man sollte dann überlegen, wie man garantiert, dass Summanden und Ergebnis alle im Zahlenraum von 0..20 liegen.
- Dann kann man andere Rechenarten hinzunehmen. Aber Vorsicht: Gerade Subtraktion und Division führen zum Teil auf Zahlen, die unsere Grundschüler noch gar nicht kennen.
- Nun kann man versuchen, den Trainer spannender und schöner zu machen.
- Man könnte wie bei einem Computerspiel ein Punktekonto führen.
- Gerade Grundschüler mögen es graphisch und bunt. TImage-Komponenten können helfen, Programme ansprechend zu gestalten.
- Man könnte dafür sorgen, dass die Zeit zwischen Stellen der Aufgabe und der Eingabe der Antwort für die erreichten Punkte eine Rolle spielt, um die Grundschüler zum zügigen Rechnen zu motivieren. Aber Vorsicht: Richtigkeit sollte immer noch Vorrang vor Schnelligkeit haben. Zum Einführen eines Zeit-Aspekts lohnt sich ein Blick auf die Komponente TTimer.
- Methodisch ist es für ein Lernprogramm eine große Herausforderung, wenn es sich an die Leistungen der Schüler anpasst. Wie bei einem Computerspiel könnte man verschiedene "Level" konstruieren, die sich in der Anforderung an die Geschwindigkeit unterschieden, vielleicht auch im Zahlenraum.
- Punkte könnte man auch über eine einzelne Sitzung hinaus in einer Datei speichern. Ini-Dateien und die Klasse TIniFile könnten dabei gute Dienste leisten.
- Viele andere Dinge lassen sich ebenfalls überlegen ...