Coding für Kids: Zahlen raten

Titelbild

Zahlen raten war das erste Programm, dass ich mit meinem Sohn gemeinsam entwickelt habe. Sozusagen als Appetizer, um die Lust fürs Programmieren zu entfachen.

Spielidee

Das Programm sucht sich eine zufällige Zahl aus, die der Benutzer erraten soll. Nach jeder Eingabe gibt es eine Antwort als Hilfe, ob die gesuchte Zahl kleiner oder größer ist als die eingegebene.

Voraussetzungen

Die Grundlagen einer Programmiersprache müssen bekannt sein. Das sind grundlegende Datentypen, Befehle wie IF oder FOR.

Die Hauptfunktionsweise der IDE Integrated Development Environment von Lazarus muss klar sein. Wie kommen Komponenten auf ein Formular. Wie werden Eigenschaften eingestellt.

Startpunkt sollte immer das Anlegen eines neuen Projektes mit der Auswahl „Anwendung“ und das Speichern von Projekt und Units in einem neuen leeren Ordner sein.

Formulardesign

Als erstes haben wir uns gemeinsam überlegt, wie die Oberfläche im Fenster gestaltet werden soll und welche passenden Komponenten es in Lazarus dafür gibt.

  • Label’s für die Beschriftungen
  • SpinEdit’s für die Eingabefelder für Zahlenbereich des Zufallszahl und geratene Zahl (später als TSpinEdit)
  • Button’s für die Aktionen: Raten, Spiel starten, Auflösen und Beenden

Diese wurden auf das Formular gezogen, ausgerichtet und die Formatierung nach unseren Vorstellungen über die Eigenschaften im Objektinspektor eingestellt.

cfk_zr_formular

Bis das so aussah, hat es aber eine Weile gedauert. Es war aber eine gute Übung, um mit dem Formulardesigner zu arbeiten und Einstellungen über den Objektinspektor zu machen. Unser erster Prototyp sah so aus:

Erste Version von Zahlen raten
Erste Version von Zahlen raten

Der Code

Variablen

Als nächstes haben wir überlegt, welche Variablen wir benötigen. Eine für die Zufallszahl. Eine andere, um die Rate-Versuche zu zählen. Die richtige Stelle für die Deklaration ist der Private-Bereich.

 private
   { private declarations }
   Zufallszahl : integer; //Die gesuchte Zufallszahl
   Versuche : integer; //Anzahl der Versuche

Neues Spiel

Dann folgt die Ereignisroutine für die erste Funktion im Spiel. Mit einem Doppelklick auf den Button „Spiel beginnen“ wird eine neue Prozedur von Lazarus erstellt.

procedure TForm1.Button3Click(Sender: TObject);
begin
end;

Diese Prozedur haben wir dann mit Anweisungen gefüllt. Zufallszahlen werden in Lazarus mit der Funktion Random erzeugt.

//Zufallszahl aussuchen, startet immer bei 0, deshalb +1
 Zufallszahl:=Random(SpinEdit2.Value+1);

Danach werden die Variablen auf die Startwerte gesetzt.

//Versuche auf 0 setzen
 Versuche:=0;

//Spielende-Bild ausblenden
 Image1.Visible:=false;

//Texte löschen
 Label2.Caption:='';
 Label3.Caption:='';

Erster Programm-Start

Bei jedem Programm-Start soll gleich diese Prozedur für ein neues Spiel ausgeführt werden, damit alles zum ersten Rateversuch bereit ist.

cfk_zr_formcreate
FormCreate-Ereignis erstellen

Lazarus erzeugt wieder eine Prozedur-Rumpf FormCreate, der gefüllt werden kann.

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Zufallszahlen-Generator initialisieren
  Randomize;

  //Beim Starten gleich neues Spiel beginnen
  Button3Click(nil);
end;

Die Prozedur Randomize ist wichtig. Wird sie nicht aufgerufen, erzeugt Lazarus bei jedem Programmstart die selben „Zufallszahlen“.

Überprüfung der Eingabe

Die Hauptarbeit findet in der Ereignis-Routine des Raten-Buttons statt. Zuerst werden die Versuche hochgezählt und angezeigt. Dafür greifen wir auf die Eigenschaft Caption des Labels zu.

procedure TForm1.Button1Click(Sender: TObject);
var Eingabe : integer;
begin
 //Versuche hochzählen
 Versuche:=Versuche+1;

 //und anzeigen
 Label3.Caption:=IntToStr(Versuche)+'. Versuch:';

Dann wird die eingegebene Zahl überprüft. Wie passt sie zu der geheimen Zufallszahl? Ist die kleiner oder größer oder wurde sie erraten?

//Auswerten der Eingabe zur gesuchten Zahl
 if SpinEdit1.Value>Zufallszahl then
   Label2.Caption:='Zahl ist kleiner als '+SpinEdit1.Text;

if SpinEdit1.Value<Zufallszahl then
   Label2.Caption:='Zahl ist größer '+SpinEdit1.Text;

if SpinEdit1.Value=Zufallszahl then
  begin
    //Zahl gefunden!
    Label2.Caption:='Richtig!';

    //Siegesbild anzeigen
    Image1.Visible:=true;

    //Zufallszahl anzeigen
    Label5.Visible:=true;
  end;

Dann wird noch alles für den nächsten Rateversuch vorbereitet.

 //Eingabefelder zurücksetzen
 SpinEdit1.Value:=0;

 //Fokus bleibt im Eingabefeld
 SpinEdit1.SetFocus;
end;

Auflösen

Mit einem Doppelklick auf den Button „Auflösen“ wird die nächte Ereignis-Routine angelegt.

procedure TForm1.Button2Click(Sender: TObject);
begin
  //Auflösen
  Label2.Caption:='Die richtige Zahl ist '+IntToStr(Zufallszahl);
end;

Tastatur-Eingabe

Unsere erste Verbesserung war eine bessere Tastatur-Unterstützung. Statt nur eines Mausklicks auf Raten, sollte auch die Eingabetaste das Gleiche tun.

Das geht mit einer weiteren Ereignis-Routine KeyPress des TSpinEdit’s.

procedure TForm1.SpinEdit1KeyPress(Sender: TObject; var Key: char);
begin
  //Wenn Eingabetaste gedrückt wird, dann wie Mausklick auf Button "Raten" werten
  if Key=#13 then Button1Click(Sender);
end;

Viel Spaß beim Nachprogrammieren!

cfk_zr_fertig

Links

Sie finden im Download-Ordner auch eine ausführbare Datei dieser Software. Wenn Sie Sicherheitsbedenken haben, lesen Sie bitte die Seite EXE-Dateien und das Internet.


Click here to read this article in English.

Dieser Beitrag hat 2 Kommentare

  1. Johnd797

    Aw, this was a very nice post. In thought I want to put in writing like this moreover taking time and actual effort to make an excellent article but what can I say I procrastinate alot and not at all seem to get something done. fkggcdfddede

Kommentar verfassen