Lazarus/Spielen mit dem Zufall: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
K (17 Versionen importiert)
(formatiert)
Markierung: 2017-Quelltext-Bearbeitung
Zeile 1: Zeile 1:
{{Lazarus-Buch}}
Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42),
Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42),
vom Benutzer während der Eingabe erfragt (etwa mit <tt>a:=StrToInt(...)</tt>) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. <tt>a:=sqrt(c)</tt>). 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.
vom Benutzer während der Eingabe erfragt (etwa mit <tt>a:=StrToInt(...)</tt>) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. <tt>a:=sqrt(c)</tt>). 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.
Zeile 7: Zeile 5:




{{blau|<source  line start=30 highlight="3" lang="pascal">
<source  line start=30 highlight="3" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject);
begin
begin
Zeile 13: Zeile 11:
   Edit1.Text:=IntToStr(z);
   Edit1.Text:=IntToStr(z);
end;       
end;       
</source>}}
</source>


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.
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.
Zeile 19: Zeile 17:
So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl <tt>randomize;</tt> 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.
So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl <tt>randomize;</tt> 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.


{{blau|<source  line start=30 highlight="3" lang="pascal">
<source  line start=30 highlight="3" lang="pascal">
procedure TForm1.FormCreate(Sender: TObject);
procedure TForm1.FormCreate(Sender: TObject);
begin
begin
   randomize;
   randomize;
end;     
end;     
</source>}}
</source>


'''Anmerkung:''' Es schadet nichts, zu wissen, was dieses <tt>randomize</tt> eigentlich tut. Eigentlich kann ein klassischer Computer keine wirklich zufälligen Zahlen erzeugen sondern nur [https://de.wikipedia.org/wiki/Pseudozufall Pseudozufallszahlen]. Diese berechnet man aus einer anfänglich gegebenen Zahl durch Gleichungen, die scheinbar ungeordnete, aber eben nicht wirklich zufällige Zahlen erzeugen. Da die Anfangszahl ohne die Verwendung von <tt>randomize</tt> immer die gleiche ist, ist auch die daraus berechnete Folge von Pseudozufallszahlen immer die gleiche. <tt>randomize</tt> ermittelt jetzt bei jedem Programmlauf eine andere Anfangszahl. Dafür benutzt der Befehl die Zeit der Computeruhr, die "Systemzeit". Die ist bei jedem Programmstart eine andere und sie hängt -- irgendwie dann doch zufällig -- davon ab, wann genau der Benutzer das Programm startet.
{{Box|Anmerkung|Es schadet nichts, zu wissen, was dieses <tt>randomize</tt> eigentlich tut. Eigentlich kann ein klassischer Computer keine wirklich zufälligen Zahlen erzeugen sondern nur [https://de.wikipedia.org/wiki/Pseudozufall Pseudozufallszahlen]. Diese berechnet man aus einer anfänglich gegebenen Zahl durch Gleichungen, die scheinbar ungeordnete, aber eben nicht wirklich zufällige Zahlen erzeugen. Da die Anfangszahl ohne die Verwendung von <tt>randomize</tt> immer die gleiche ist, ist auch die daraus berechnete Folge von Pseudozufallszahlen immer die gleiche. <tt>randomize</tt> ermittelt jetzt bei jedem Programmlauf eine andere Anfangszahl. Dafür benutzt der Befehl die Zeit der Computeruhr, die "Systemzeit". Die ist bei jedem Programmstart eine andere und sie hängt -- irgendwie dann doch zufällig -- davon ab, wann genau der Benutzer das Programm startet.|Hervorhebung}}


== Aufgaben ==
{{Aufgabe|1=
#'''Spiele: Elektronischer Würfel'''<br>Schreibe ein Lazarus-Programm zum Würfeln, bei dem nach dem Drücken eines Knopfes in einem Edit-Feld eine Zahl zwischen 1 und 6 erscheint.
#'''Spiele: Elektronischer Würfel'''<br>Schreibe ein Lazarus-Programm zum Würfeln, bei dem nach dem Drücken eines Knopfes in einem Edit-Feld eine Zahl zwischen 1 und 6 erscheint.
#'''Spiele: Elektronisches Würfelpaar'''<br>In manchen Würfelspielen wird mit zwei Würfeln gewürfelt. Schreibe ein Programm, das bei jedem Wurf mit zwei (gedachten) Würfeln würfelt und die Zahlen ausgibt; außerdem die Augensumme. Weiterhin soll das Programm ausgeben, wenn es bei einem Wurf ein „Pasch“ gegeben hat (Augenzahl bei beiden Würfeln gleich).  
#'''Spiele: Elektronisches Würfelpaar'''<br>In manchen Würfelspielen wird mit zwei Würfeln gewürfelt. Schreibe ein Programm, das bei jedem Wurf mit zwei (gedachten) Würfeln würfelt und die Zahlen ausgibt; außerdem die Augensumme. Weiterhin soll das Programm ausgeben, wenn es bei einem Wurf ein „Pasch“ gegeben hat (Augenzahl bei beiden Würfeln gleich).  
#'''Spiele: Richtiges Roulette'''<br>Schreibe einen Roulette-Generator, eine Zahl zwischen 0 und 36 ausgibt und nicht nur die Geradzahligkeit (PAIR/IMPAIR) bestimmt, sondern auch die Farbe der Zahl (ROUGE/NOIR) und die Hälfte, in der die Zahl liegt (PASSE/MANQUE). Achtung: Die Null ist beim Roulette weder gerade noch ungerade, sondern einfach die Null (ZERO).
#'''Spiele: Richtiges Roulette'''<br>Schreibe einen Roulette-Generator, eine Zahl zwischen 0 und 36 ausgibt und nicht nur die Geradzahligkeit (PAIR/IMPAIR) bestimmt, sondern auch die Farbe der Zahl (ROUGE/NOIR) und die Hälfte, in der die Zahl liegt (PASSE/MANQUE). Achtung: Die Null ist beim Roulette weder gerade noch ungerade, sondern einfach die Null (ZERO).
#'''Spiele: Zufalls-Karten'''<br> Kartenlegerin Esmeralda steigt endlich auf moderne Technik um. Sie verwendet seit jeher Skat-Karten. Dort gibt es die “Farben” Kreuz, Pique, Herz und Karo. Außerdem gibt es die Zahlen bzw. Figuren 7, 8, 9, 10, Bube, Dame, König, Ass. <br />Insgesamt gibt es also 4 · 8 = 32 Karten. Schreiben Sie für Esmeralda ein Programm, das eine zuf¨allige Karte erzeugt (also zum Beispiel “Pique 10”). <br />Hinweis: Man kann es sehr umständlich machen und eine Zufallszahl zwischen 1 und 32 ziehen und entsprechend eine bestimmte Karte zuordnen. Es geht aber auch deutlich eleganter.
#'''Spiele: Zufalls-Karten'''<br> Kartenlegerin Esmeralda steigt endlich auf moderne Technik um. Sie verwendet seit jeher Skat-Karten. Dort gibt es die “Farben” Kreuz, Pique, Herz und Karo. Außerdem gibt es die Zahlen bzw. Figuren 7, 8, 9, 10, Bube, Dame, König, Ass. <br />Insgesamt gibt es also 4 · 8 = 32 Karten. Schreiben Sie für Esmeralda ein Programm, das eine zuf¨allige Karte erzeugt (also zum Beispiel “Pique 10”). <br />Hinweis: Man kann es sehr umständlich machen und eine Zufallszahl zwischen 1 und 32 ziehen und entsprechend eine bestimmte Karte zuordnen. Es geht aber auch deutlich eleganter.
#'''Spiele: Glücksrad'''<br>Schreibe ein Glücksrad-Spiel mit folgenden Regeln: Der Benutzer hat ein Startkonto von 1000 Punkten. Er gibt immer wieder eine Zahl zwischen 1 und 20 ein. Der Computer würfelt daraufhin eine Zahl zwischen 1 und 20 und gibt die Zahl aus. Falls die geratene und die gewürfelte Zahl übereinstimmen, gewinnt der Benutzer 200 Punkte. Falls nicht, verliert er 10 Punkte. Das Spiel endet, wenn der Spieler pleite ist (0 Punkte oder weniger) oder der Spieler 2000 Punkte oder mehr erreicht.
#'''Spiele: Glücksrad'''<br>Schreibe ein Glücksrad-Spiel mit folgenden Regeln: Der Benutzer hat ein Startkonto von 1000 Punkten. Er gibt immer wieder eine Zahl zwischen 1 und 20 ein. Der Computer würfelt daraufhin eine Zahl zwischen 1 und 20 und gibt die Zahl aus. Falls die geratene und die gewürfelte Zahl übereinstimmen, gewinnt der Benutzer 200 Punkte. Falls nicht, verliert er 10 Punkte. Das Spiel endet, wenn der Spieler pleite ist (0 Punkte oder weniger) oder der Spieler 2000 Punkte oder mehr erreicht.}}
 
{{Lazarus-Buch}}
{{Lazarus-Buch}}



Version vom 10. August 2019, 06:22 Uhr

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.


procedure TForm1.Button1Click(Sender: TObject);
begin
  z:=random(100);
  Edit1.Text:=IntToStr(z);
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.

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;

Anmerkung
Es schadet nichts, zu wissen, was dieses randomize eigentlich tut. Eigentlich kann ein klassischer Computer keine wirklich zufälligen Zahlen erzeugen sondern nur Pseudozufallszahlen. Diese berechnet man aus einer anfänglich gegebenen Zahl durch Gleichungen, die scheinbar ungeordnete, aber eben nicht wirklich zufällige Zahlen erzeugen. Da die Anfangszahl ohne die Verwendung von randomize immer die gleiche ist, ist auch die daraus berechnete Folge von Pseudozufallszahlen immer die gleiche. randomize ermittelt jetzt bei jedem Programmlauf eine andere Anfangszahl. Dafür benutzt der Befehl die Zeit der Computeruhr, die "Systemzeit". Die ist bei jedem Programmstart eine andere und sie hängt -- irgendwie dann doch zufällig -- davon ab, wann genau der Benutzer das Programm startet.

Aufgabe
  1. Spiele: Elektronischer Würfel
    Schreibe ein Lazarus-Programm zum Würfeln, bei dem nach dem Drücken eines Knopfes in einem Edit-Feld eine Zahl zwischen 1 und 6 erscheint.
  2. Spiele: Elektronisches Würfelpaar
    In manchen Würfelspielen wird mit zwei Würfeln gewürfelt. Schreibe ein Programm, das bei jedem Wurf mit zwei (gedachten) Würfeln würfelt und die Zahlen ausgibt; außerdem die Augensumme. Weiterhin soll das Programm ausgeben, wenn es bei einem Wurf ein „Pasch“ gegeben hat (Augenzahl bei beiden Würfeln gleich).
  3. Spiele: Richtiges Roulette
    Schreibe einen Roulette-Generator, eine Zahl zwischen 0 und 36 ausgibt und nicht nur die Geradzahligkeit (PAIR/IMPAIR) bestimmt, sondern auch die Farbe der Zahl (ROUGE/NOIR) und die Hälfte, in der die Zahl liegt (PASSE/MANQUE). Achtung: Die Null ist beim Roulette weder gerade noch ungerade, sondern einfach die Null (ZERO).
  4. Spiele: Zufalls-Karten
    Kartenlegerin Esmeralda steigt endlich auf moderne Technik um. Sie verwendet seit jeher Skat-Karten. Dort gibt es die “Farben” Kreuz, Pique, Herz und Karo. Außerdem gibt es die Zahlen bzw. Figuren 7, 8, 9, 10, Bube, Dame, König, Ass.
    Insgesamt gibt es also 4 · 8 = 32 Karten. Schreiben Sie für Esmeralda ein Programm, das eine zuf¨allige Karte erzeugt (also zum Beispiel “Pique 10”).
    Hinweis: Man kann es sehr umständlich machen und eine Zufallszahl zwischen 1 und 32 ziehen und entsprechend eine bestimmte Karte zuordnen. Es geht aber auch deutlich eleganter.
  5. Spiele: Glücksrad
    Schreibe ein Glücksrad-Spiel mit folgenden Regeln: Der Benutzer hat ein Startkonto von 1000 Punkten. Er gibt immer wieder eine Zahl zwischen 1 und 20 ein. Der Computer würfelt daraufhin eine Zahl zwischen 1 und 20 und gibt die Zahl aus. Falls die geratene und die gewürfelte Zahl übereinstimmen, gewinnt der Benutzer 200 Punkte. Falls nicht, verliert er 10 Punkte. Das Spiel endet, wenn der Spieler pleite ist (0 Punkte oder weniger) oder der Spieler 2000 Punkte oder mehr erreicht.


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 ...