1. Vererbung
Um mit der CodeGym-Spiel-Engine arbeiten zu können, müssen Sie Vererbung verwenden . Aber was ist, wenn Sie nicht wissen, was das ist? Einerseits müssen Sie dieses Thema verstehen und studieren. Andererseits ist die Engine speziell darauf ausgelegt, sehr einfach zu sein, sodass Sie mit einem oberflächlichen Wissen über Vererbung auskommen können.
Was ist also Vererbung? Vereinfacht ausgedrückt ist Vererbung eine Beziehung zwischen zwei Klassen. Eine von ihnen fungiert als übergeordnete Klasse und die andere wird zur untergeordneten (nachkommenden) Klasse. Darüber hinaus weiß eine übergeordnete Klasse möglicherweise nicht einmal, dass sie Nachkommenklassen hat. Mit anderen Worten: Die übergeordneten Klassen haben keinen großen Nutzen aus der Existenz untergeordneter Klassen.
Aber die Vererbung bietet der untergeordneten Klasse viele Vorteile. Das Wichtigste davon ist, dass alle Variablen und Methoden der übergeordneten Klasse in der untergeordneten Klasse angezeigt werden, als ob der Code der übergeordneten Klasse direkt in die untergeordnete Klasse kopiert würde. Das ist nicht ganz richtig, reicht aber für ein grundlegendes Verständnis der Vererbung aus.
Hier sind einige Beispiele, die Ihnen helfen sollen, die Vererbung besser zu verstehen.
Beispiel 1 – hier ist das einfachste Beispiel
|
Die Child Klasse erbt die Parent Klasse mithilfe des extends Schlüsselworts. |
|
Beispiel 2 – Verwendung der Variablen der übergeordneten Klasse
|
Die Klasse kann die Felder und der Klasse so Child verwenden , als ob sie in der Klasse selbst deklariert wären.age name Parent Child |
|
Beispiel 3 – Verwendung von Methoden der übergeordneten Klasse
|
Die Child Klasse kann die Variablen und Methoden der übergeordneten Klasse so verwenden, als wären sie in der Child Klasse deklariert. In diesem Beispiel verwenden wir die getName() Methode. |
|
Wenn wir einige Details weglassen, können wir sagen, dass wir aus Sicht des Java-Compilers einfach den Code der übergeordneten Klasse in den Code der untergeordneten Klasse kopiert haben:
public class Child extends Parent
{
public int age; // An inherited variable
public String name; // An inherited variable
public getName() { // An inherited method
return name;
}
public void printInfo()
{
System.out.println(getName() + " " + age);
}
}
2. Methodenüberschreibung
Manchmal gibt es Situationen, in denen wir unsere Child
Klasse dazu bringen, eine sehr nützliche Parent
Klasse zu erben, was dazu führt, dass die untergeordnete Klasse alle Variablen und Methoden der übergeordneten Klasse erbt. Einige dieser Methoden funktionieren jedoch möglicherweise nicht ganz so, wie wir es uns wünschen, oder überhaupt nicht so, wie wir es uns wünschen.
Was machen Sie in diesem Fall? Wir können eine Methode überschreiben, deren Implementierung uns nicht gefällt . Das geht ganz einfach: In unserer Child
Klasse deklarieren wir einfach eine Methode mit derselben Signatur wie die Methode in der Parent
Klasse und schreiben dann unseren eigenen Code hinein.
Beispiel 1 – Methodenüberschreibung
|
Die printInfo() Methode zeigt den folgenden Satz an:
|
|
Vereinfacht man die Situation etwas zu stark, führt die Vererbung dazu, dass der Code der übergeordneten Klasse in die untergeordnete Klasse kopiert wird. Wenn eine Nachkommenklasse jedoch bereits eine Methode hat, die in einer Vorgängerklasse vorhanden ist, wird diese Methode nicht von der Vorgängerklasse kopiert. Hier sagen wir, dass die Methode in der untergeordneten Klasse die Methode in der übergeordneten Klasse überschreibt. Schauen Sie sich das Beispiel unten an. Vielleicht hilft es, die Sache etwas klarer zu machen:
So sieht die Child-Klasse aus Sicht des Compilers aus: |
---|
|
Beispiel 2 – ein wenig Vererbungsmagie (und Methodenüberschreibung)
public class Parent
{
public getName() {
return "Luke";
}
public void printInfo()
{
System.out.println( getName() );
}
}
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
}
Wenn die printInfo()
Methode für einen Typ aufgerufen wird Parent
, ruft sie wiederum die getName()
Methode der Parent
Klasse auf.
Wenn die printInfo()
Methode für ein Objekt aufgerufen wird Child
, ruft sie wiederum die getName()
Methode der Child
Klasse auf.
Mit anderen Worten: Die printInfo()
Methode wird nur in der Parent
Klasse deklariert, ruft jedoch die getName()
Methode der Child
Klasse auf, wenn die printInfo()
Methode für ein Objekt aufgerufen wird Child
.
Beispiel:
|
Dieser Code zeigt den folgenden Text auf dem Bildschirm an:
|
|
Dieser Code zeigt den folgenden Text auf dem Bildschirm an:
|
Und das alles, weil aus Sicht des Compilers (eine sehr vereinfachte Version davon) der Code der Child
Klasse so aussieht:
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
public void printInfo()
{
System.out.println(getName());
}
}
3. Listen
Hier ist eine kurze Erinnerung an Listen ( List
). Listen haben viel mit Arrays gemeinsam:
- Sie können viele Daten eines bestimmten Typs speichern.
- Sie ermöglichen es Ihnen, Elemente anhand ihres Index abzurufen.
- Die Indizes der Elemente beginnen bei
0
.
Vorteile von Listen:
Im Gegensatz zu Arrays können Listen ihre Größe dynamisch ändern. Unmittelbar nach der Erstellung beträgt die Größe einer Liste 0
. Je mehr Elemente zur Liste hinzugefügt werden, desto größer wird sie. Beispiel für die Erstellung einer Liste:
ArrayList<String> myList = new ArrayList<String>();
Der in den spitzen Klammern angegebene Wert ist der Datentyp, den die Liste speichern kann.
Hier sind einige Methoden zum Arbeiten mit einer Liste:
Code | Kurze Beschreibung |
---|---|
|
Erstellen einer neuen Liste von Zeichenfolgen |
|
Fügen Sie am Ende der Liste ein Element hinzu |
|
Fügen Sie am Anfang der Liste ein Element hinzu |
|
Holen Sie sich ein Element anhand seines Index |
|
Ändern Sie ein Element anhand seines Index |
|
Ermitteln Sie die Anzahl der Elemente in der Liste |
|
Entfernen Sie ein Element aus der Liste |
Weitere Informationen zu Listen finden Sie in den folgenden Artikeln:
4. Zufallszahlen
Die CodeGym-Spiel-Engine verfügt über zwei Methoden, mit denen Zufallszahlen generiert werden können. Diese Methoden sind:
int getRandomNumber(int max)
int getRandomNumber(int min, int max)
Die erste Methode — getRandomNumber(int max)
— gibt eine Zufallszahl im Bereich 0
, 1
, 2
, ... zurück max-1
. Unter der Haube wird die Random
Klasse aus dem java.util
Paket verwendet, aber das ändert nichts an der Art und Weise, wie Sie eine Zufallszahl verwenden.
getRandomNumber(int)
akzeptiert eine ganze Zahl als Argument. Diese Zahl stellt die Obergrenze für die Zahlen dar, die der Zufallszahlengenerator zurückgeben kann. Die Untergrenze liegt bei 0. Achtung! Der Zufallszahlengenerator gibt NIEMALS den Wert der Obergrenze zurück. Wenn Sie beispielsweise aufrufen getRandomNumber(3)
, wird zufällig entweder 0, 1 oder 2 zurückgegeben. Wie Sie sehen, wird nicht 3 zurückgegeben. Die Verwendung eines Zufallszahlengenerators auf diese Weise ist recht einfach, eignet sich jedoch für viele Fälle.
Die zweite Methode — getRandomNumber(int min, int max)
— gibt eine zufällige Ganzzahl im Bereich zurück [min, max-1]
. Es wird niemals eine Zahl kleiner als zurückgegeben min
, und es wird niemals eine Zahl größer als zurückgegeben max-1
.
Wie können diese Methoden in der Praxis eingesetzt werden?
1. Würfel
Angenommen, Sie möchten den Wurf eines Würfels simulieren und eine Zufallszahl im Bereich erhalten 1-6
. Wie würdest du es machen? Dies kann mit Code wie diesem erfolgen:
int dice = getRandomNumber(1, 7);
Diese Methode gibt eine zufällige Ganzzahl im Bereich zurück 1-6
.
2. Schießübungen
Angenommen, Sie möchten das Schießen auf ein Ziel simulieren und die Genauigkeit eines Schusses enthält eine Zufallskomponente, die im Bereich von -10
bis +10
einschließlich variiert. Dies kann mit Code wie diesem erfolgen:
int dx = getRandomNumber(-10, 11);
Diese Methode gibt eine zufällige Ganzzahl im Bereich -10
bis zurück +10
.
Es gibt viele Möglichkeiten, Zufallszahlen in Spielen zu verwenden. Sie sind nur durch Ihre Vorstellungskraft begrenzt. Schreiben Sie Ihre eigenen Spiele, verfeinern Sie sie und genießen Sie den Prozess.
Jeder kann Spiele spielen, aber nur Programmierer können sie erstellen.