Spiele in Lazarus objektorientiert programmieren/Rechnen und Würfeln und Spiele in Lazarus objektorientiert programmieren/Ein einfaches Spiel mit mehreren Objekten: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
main>Peterdauscher
 
main>Peterdauscher
(Die Seite wurde neu angelegt: „== Hinzufügen weiterer Objekte == Auf die Dauer ist ein einfaches Fenster, auf dem außer dem Hinweis nichts zu sehen ist, doch recht langweilig. Wir fügen…“)
 
Zeile 1: Zeile 1:
==  Eigene Variablen, Rechnungen und Zufallszahlen ==
==  Hinzufügen weiterer Objekte ==


===  Eigene Variablen ===
Auf die Dauer ist ein einfaches Fenster, auf dem außer dem Hinweis nichts zu sehen ist, doch recht langweilig. Wir fügen aus dem Reiter „Additional“ geometrisches Objekt, genauer: ein Objekt vom Typ TShape hinzu. Hierfür klicken wir zunächst auf das Symbol [[Image:Bild7.png|top]]in der Symbolleiste und dann irgendwo in das Formular.


<div style="margin-left:0.199cm;margin-right:0cm;">Bisher haben wir immer nur die Eigenschaften von Objekten verändert, die wir vorher auf dem Fenster platziert haben (oder Eigenschaften des Fensters selbst). Bei praktisch allen etwas komplizierteren Spielen ist es aber hilfreich, Zwischenrechnungen durchzuführen und die Ergebnisse in so genannten Variablen zu speichern, die man selbst definiert. </div>
Man kann das nun entstandene Objekt mit dem Namen Shape1 nun nachträglich mit der Maus verschieben. Man kann die Form (Shape) und die Farbe (Color) im Objektinspektor verändern.
 
Natürlich geht das auch innerhalb der entsprechenden Methoden des Programms. Will man z.B., dass die Koordinaten des Objekts sich beim Drücken einer Maustaste irgendwo im Fenster (außer auf die geometrische Form selbst) ändern, so könnte das so aussehen.  


Um eine ganze Zahl mit dem Variablennamen „MeineZahl“ abspeichern zu können, muss man im Abschnitt „var“ ganz oben im Programm angeben:


<source lang=pascal>
<source lang=pascal>
EineZahl : Integer;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
EinWort : String;
  Shift: TShiftState; X, Y: Integer);
Wahr_oder_falsch : Boolean;
begin
  Shape1.Left:=10;
  Shape1.Top:=20;
end;          
</source>
</source>


Dann existiert überall im Programm diese Zahl, dieses Wort oder dieser Wahrheitswert und man kann aus jeder Methode direkt auf diese Zahl zugreifen. Das ist extrem wichtig, wenn man sich im Spielverlauf Dinge wie etwa den Punktestand des Spielers merken möchte.'''Wichtig''': Umlaute, Leer- oder Sonderzeichen haben in Variablennamen nichts verloren (Ausnahme wieder: der Unterstrich).
Wichtig: Da wir es hier jetzt mit mehreren Objekten zu tun haben, müssen wir im Objektinspektor zunächst tatsächlich Form1 auswählen und dann im Reiter „Ereignisse“ rechts neben dem Ereignis OnMouseDown einen Doppelklick ausführen.
 
Und noch etwas ist wichtig bei der Vergabe von Variablennamen: Diese sollten wirklich beschreiben, welche Information in einer Variable abgespeichert ist. Je „sprechender“ der Variablenname ist, desto leichter ist es für andere (und für einen selbst – vor allem nach einiger Zeit) den Sinn des Programms zu verstehen. Und das ist besonders bei der – praktisch unausweichlichen – Fehlersuche von ganz großer Bedeutung<ref name="ftn3">In Programmierer-Kreisen gibt es das Sprichwort: „Wenn alles gleich geht, sitzt der Fehler tiefer.“</ref>.
 
===  Rechenoperationen ===
 
Man kann mit ganzen Zahlen bzw. Integer-Variablen rechnen, wobei die „Rechenzeichen“ für Addition, Subtraktion und Multiplikation gerade +,-,* heißen.
 
Schwierig ist es bei der Division, denn die Division zweier ganzer Zahlen liefert nicht automatisch wieder eine ganze Zahl (etwa 7/2). Damit es hier nicht zu Verwechslungen kommt, heißt die Ganzzahl-Division „div“. <tt>7 div 2</tt> liefert dabei den Wert 3.
 
Wir sind hier sozusagen auf Grundschulniveau: Damals war das Ergebnis der Teilaufgabe ja auch 7:2 = 3 Rest 1.


Den Rest kann man übrigens auch berechnen, nämlich mit 7 mod 2.
In der zweiten Zeile kann man erkennen, dass innerhalb der Methode noch die Variablen X und Y zur Verfügung stehen. Diese liefern die Informationen, wo genau der Mauszeiger stand, als die Maustaste gedrückt wurde. Das lässt sich nutzen, um unsere geometrische Form mit der linken oberen Ecke genau an die Position des Mauszeigers zu setzen, wenn die Maustaste gedrückt ist. Will man, dass das geometrische Objekt z.B. unsichtbar wird, wenn man auf das geometrische Objekt ''selbst ''klickt, so muss man im Objekt Shape1 im Objektinspektor auswählen und dann dort neben dem Ereignis OnMouseDown den Doppelklick ausführen.


Man kann praktisch beliebig komplizierte Rechenausdrücke aus Zahlen und Variablen in Pascal hinschreiben; Pascal beherrscht auch die Punkt-vor-Strich-Rechnung sowie Klammern.
Die so entstandene Methode können wir nun ergänzen.


Eine Zeile könnte also heißen:
<source lang=pascal>
<source lang=pascal>
QuaderFlaeche:=(Laenge*Breite+Breite*Hoehe+Laenge*Hoehe)*2;
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Shape1.Visible:=FALSE;
end;      
</source>
</source>


===  Zufallszahlen ===
'''Wichtig''': Egal, welches Objekt (hier: Fenster oder geometrisches Objekt) das Ereignis auslöst; die zugehörige Methode gehört in Lazarus immer zum Fenster.
 
Viele Spiele wären extrem langweilig, wenn nicht zufällige Dinge passieren könnten. Deshalb muss eine Programmiersprache, mit der man Spiele programmieren kann, auch Zufallszahlen produzieren können.
 
Die Funktion
 
    random(n)
 
wobei n eine natürliche Zahl ist, liefert eine Zufallszahl zwischen 0 und n-1.
 
Der Befehl
 
    Zufallszahl := random(10)
 
liefert also eine Zufallszahl zwischen 0 und 9 und speichert diese in der Variable Zufallszahl.
 
Damit die Zufallszahlen bei jedem Programmstart tatsächlich andere sind, muss man allerdings noch beim Start des Programms (Methode zum Ereignis OnCreate des Fensters) den Befehl
 
    randomize;
 
hinzufügen.

Version vom 14. Dezember 2018, 13:56 Uhr

Hinzufügen weiterer Objekte

Auf die Dauer ist ein einfaches Fenster, auf dem außer dem Hinweis nichts zu sehen ist, doch recht langweilig. Wir fügen aus dem Reiter „Additional“ geometrisches Objekt, genauer: ein Objekt vom Typ TShape hinzu. Hierfür klicken wir zunächst auf das Symbol Datei:Bild7.pngin der Symbolleiste und dann irgendwo in das Formular.

Man kann das nun entstandene Objekt mit dem Namen Shape1 nun nachträglich mit der Maus verschieben. Man kann die Form (Shape) und die Farbe (Color) im Objektinspektor verändern.

Natürlich geht das auch innerhalb der entsprechenden Methoden des Programms. Will man z.B., dass die Koordinaten des Objekts sich beim Drücken einer Maustaste irgendwo im Fenster (außer auf die geometrische Form selbst) ändern, so könnte das so aussehen.


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Shape1.Left:=10;
  Shape1.Top:=20;
end;

Wichtig: Da wir es hier jetzt mit mehreren Objekten zu tun haben, müssen wir im Objektinspektor zunächst tatsächlich Form1 auswählen und dann im Reiter „Ereignisse“ rechts neben dem Ereignis OnMouseDown einen Doppelklick ausführen.

In der zweiten Zeile kann man erkennen, dass innerhalb der Methode noch die Variablen X und Y zur Verfügung stehen. Diese liefern die Informationen, wo genau der Mauszeiger stand, als die Maustaste gedrückt wurde. Das lässt sich nutzen, um unsere geometrische Form mit der linken oberen Ecke genau an die Position des Mauszeigers zu setzen, wenn die Maustaste gedrückt ist. Will man, dass das geometrische Objekt z.B. unsichtbar wird, wenn man auf das geometrische Objekt selbst klickt, so muss man im Objekt Shape1 im Objektinspektor auswählen und dann dort neben dem Ereignis OnMouseDown den Doppelklick ausführen.

Die so entstandene Methode können wir nun ergänzen.

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Shape1.Visible:=FALSE;
end;

Wichtig: Egal, welches Objekt (hier: Fenster oder geometrisches Objekt) das Ereignis auslöst; die zugehörige Methode gehört in Lazarus immer zum Fenster.