Arbeitsblatt: Das UFO-Spiel

Werbung
EF-VI-A1
„kennt“-Beziehung (Assoziation)
Seite 1 von 4
„Widerstand ist zwecklos – wir werden assoziiert!“ – Die
„kennt“-Beziehung (Assoziation)
Das Projekt „UFO-Spiel“ – Teil 1: Vorbereitung
Dieses Projekt folgt einer ganz einfachen Spielidee. Ein kleines Ufo soll mit den Pfeiltasten der Tastatur über
den Bildschirm gesteuert werden und dabei heranfliegenden Asteroiden ausweichen. Wird das Ufo von
einem Asteroid getroffen, explodiert es und das Spiel ist beendet.
Aus Zeitgründen sind im Prototyp „EF-VI-P1-Ufospiel-Prototyp“ das Ufo und die Asteroiden zum Großteil
bereits fertig implementiert. Unten abgebildet siehst du das ausführliche UML-Klassen und
Beziehungsdiagramm mit allen Diensten, Parametern, verwendeten Klassen und „hat“-Beziehungen.
Wie man sieht ist der „zuruecksetzen()“-Dienst des
Asteroiden ein privater Dienst, da er nur vom Asteroiden
innerhalb des „bewege()“-Dienstes aufgerufen wird.
Aufgabe
1. Importiere das Projekt „EF-VI-P1-Ufospiel-Prototyp“.
2. Implementiere die Steuerung des Ufos innerhalb des „fuehreAus()“-Dienstes der Ufoszene.
3. Implementiere den „bewege(int pZiel, int pStart)“-Dienst der Klasse Asteroid. Weitere Hinweise
findest du als Kommentar im entsprechenden Dienst. Binde die Bewegung der Asteroiden in den
„fuehreAus()“-Dienst der Ufoszene ein.
4. Für schnelle Programmierer: Modifiziere das Ufo nach deinen Vorstellungen.
EF-VI-A1
„kennt“-Beziehung (Assoziation)
Seite 2 von 4
Definition „Assoziation“
In unseren bisherigen Projekten hatten Objekte immer nur Zugriff auf die Dienste eines anderen Objektes,
wenn sie dieses selbst erstellt hat. Realisiert wurde dies über die „hat“-Beziehung
(Komposition/Aggregation). Für komplexere Problemstellung genügt dieses Entwurfsschema aber nicht
mehr. Wir stoßen beispielsweise an eine Grenze, wenn mehrere Objekte unterschiedlichen Typs auf ein und
dasselbe andere Objekte zugreifen müssen: Ein Objekt kann ja nicht zwei anderen gehören!
Um dieses Problem zu lösen gibt es in der OOP die sogenannte „kennt“-Beziehung, auch Assoziation. Ein
Objekt A, welches ein Objekt B kennt, kann auf dessen öffentliche (public) Dienste zugreifen und so
Anfragen an das Objekt B stellen oder Aufträge erteilen.
Assoziation werden in einem UML-Diagramm durch normale Pfeile (  ) dargestellt. Häufig werden die Pfeile
mit der sogenannten Kardinalität beschriftet. Kennt ein Objekt vom Typ A zum Beispiel drei Objekte vom Typ
B, so wäre die Kardinalität 3. Ebenso werden häufig die Namen der Objekte an die Pfeile geschrieben. Unten
ist ein Beispiel dazu abgebildet.
In diesem Beispiel gibt es also eine Disco und diese kennt insgesamt drei DJs: Hans, Klaus und Annette. Die
Kardinalität ist also 3. In diesem einfachen Beispiel erkennt man auch bereits, wie eine Assoziation
programmiertechnisch umgesetzt werden kann: Die Objekte vom Typ DJ werden zunächst irgendwo erzeugt,
aber nicht von der Klasse Disco. Anschließend werden die DJs dem Objekt vom Typ Disco als Referenz
übergeben. Dies geschieht z. B. im Konstruktor der Klasse Disco.
[…]
//Deklaration der Objekte
DJ hans;
DJ klaus;
DJ anette;
Disco b52;
[…]
//Initialisierung der Objekte
hans = new DJ();
klaus = new DJ();
anette = new DJ();
b52 = new Disco(hans, klaus, annette);
Ab diesem Zeitpunkt kann das Objekt vom Typ Disco dann auf die öffentlichen Dienste der jeweiligen DJ’s
zugreifen, genau wie bei einer „hat“-Beziehung. Wird die Disco jedoch gelöscht, bleiben die DJ’s bestehen,
im Gegensatz zu einer „hat“-Beziehung.
EF-VI-A1
„kennt“-Beziehung (Assoziation)
Seite 3 von 4
Der Konstruktor der Disco sähe in diesem Falle vielleicht so aus:
public Disco
this.dj1
this.dj2
this.dj3
}
(DJ pDj1; DJ pDj2; DJ pDj3){
= pDj1;
= pDj2;
= pDj3;
Das Projekt „UFO-Spiel“ – Teil 2: Kollisionserkennung
Mit Hilfe des Wissens über die Assoziation möchten wir nun unser Spiel fertigstellen – noch fehlt die
Kollisionserkennung. Um eine Kollision erkennen zu können muss jeder Asteroid in der Lage sein die Position
des Ufos zu erfragen. Das Ufo gehört jedoch („hat“-Beziehung) genau wie die Asteroiden direkt zur
Ufoszene. Genau in dieser Konstellation können wir die „kennt“-Beziehung (Assoziation) nutzen. Der
Asteroid muss das Ufo ja nicht besitzen, sondern lediglich Anfragen stellen („Gib deine Position) und
Aufträge erteilen („Kollision: Explodiere!“) können. Die um diese Beziehung erweiterte und modifizierte
Version unseres UML-Diagramms sieht dann wie folgt aus:
EF-VI-A1
„kennt“-Beziehung (Assoziation)
Seite 4 von 4
Aufgaben
1. Implementiere die „kennt“-Beziehung zwischen den Asteroiden und dem Ufo. Dazu musst du:
 Ein Objekt vom Typ Ufo (mit Namen „dasUfo“) innerhalb der Klasse Asteroid deklarieren
 Die Übergabeparameter des Konstruktors der Klasse Asteroid um „Ufo pUfo“ erweitern.
 Innerhalb des Konstruktors der Klasse Asteroid die Übergabereferenz verwenden um die
Ufovariable zu initialisieren: this.dasUfo = pUfo;
2. Implementiere die Kollisionserkennung. Beachte dabei die unten abgebildeten Hinweise.
3. Passe den „bewege()“-Dienst der Asteroiden so an, dass nach jeder Bewegung die Kollision mit dem
Ufo überprüft wird und, falls das Ufo getroffen wurde, dem Ufo der Auftrag „explodiere()“ erteilt
wird.
4. Für schnelle Programmierer: Implementiere eine schöne Explosion des Ufos, indem du den
„explodiere()“-Dienst nach deinen Ideen modifizierst.
Hinweise



Ob der Ball die Zielscheibe beim Ballwurfspiel getroffen hat, war im Prinzip auch eine
Kollisionserkennung.
Eine Wurzel zieht man in Java mit Hilfe der Klasse Math : √𝑥 
Math.sqrt(x);
𝑎
Eine Potenz berechnen man in Java mit der Klasse Math: 𝑥 
Math.pow(x,a);
Herunterladen