Zur Themenübersicht        

Das Billardprojekt 3.3.: Die Kugel kennt das Spielfeld.

Projektdatei der zugehörigen Lösung

Verantwortlichkeiten:

Die Wiederholungsschleife der Projektdatei vereinfacht sich wirklich, wenn wir 
die Verantwortung für die Reflektion von der Projektdatei zur Kugel verlagern.
 
Die Schleife wird bei zwei Kugeln dann einfach zu:

 
Bewegungsschleife in der Projektdatei
repeat
    ersteKugel.bewege;
    zweiteKugel.bewege;
    meineUhr.warte(1)
until dieMaus.istGedrueckt;

 

Ein Botschaftsdiagramm verdeutlich die gewünschten Abläufe:

Wenn eine Kugel von der Projektdatei den Auftrag erhält, sich zu bewegen, führt sie erst die bekannten Schritte (1.1) bis (1.3) aus. 
Danach muss sie vom Spielfeld die Koordinate seines rechten Randes erfragen. Hat sie diese, kann die Kugel selbst entscheiden, ob sie ihre Geschwindigkeit umkehren muss oder nicht. 

Welche Voraussetzungen sind nötig, damit die Kugel das Spielfeld befragen kann?

Eine Kennt-Beziehung: Die Kugel kennt das Spielfeld:

Die Kugel muss das Spielfeld kennen. 

Damit ergibt sich folgendes Klassendiagramm der neuen Kugelklassen:

mit der sehr einfachen Methode:
Kugelklasse
procedure TKugel.lerneSpielfeldKennen (pKenntSpielfeld: TSpielfeld);
begin
  kenntSpielfeld := pKenntSpielfeld
end;

und der abgeänderten Methode zum Bewegen der Kugel:
Kugelklasse














Reflektion am rechten Rand

Reflektion am linken Rand
procedure TKugel.bewege;
begin
     //Kugel an alter Stelle löschen
     meinStift.radiere;
     meinStift.bewegeBis(AkuelleXPos,AkuelleYPos);
     meinStift.zeichneKreis(10);

     //Kugel an neue Stelle bewegen
     AkuelleXPos := AkuelleXPos + AktuelleGeschwindigkeit;

     //Kugel neu zeichnen
     meinStift.normal;
     meinStift.bewegeBis(AkuelleXPos,AkuelleYPos);
     meinStift.zeichneKreis(10);

    if self.GibXPos + 12 > kenntSpielfeld.rechterRand then
       self.setzeGeschwindigkeit(-self.GibGeschwindigkeit);
    if self.GibXPos - 12 < kenntSpielfeld.linkerRand then
       self.setzeGeschwindigkeit(-self.GibGeschwindigkeit);
end;

 

Welche Änderungen sind in der Projektdatei vorzunehmen?

Vor der Bewegungsschleife muss jede einzelne Kugel das Spielfeld kennen lernen. Damit ergibt sich folgende kleine Ergänzung:

 
Projektdatei
Zuerst müssen die Kugeln das
Spielfeld kennen lernen,


dann kann die Bewegung 
   statt finden.

  ersteKugel.lerneSpielfeldKennen(dasSpielfeld);
  zweiteKugel.lerneSpielfeldKennen(dasSpielfeld);

  repeat
    ersteKugel.bewege;
    zweiteKugel.bewege;
    meineUhr.warte(1)
  until dieMaus.istGedrueckt;

 

 

Zum Abschluss: Das Beziehungsdiagramm: (mit KENNT-Bziehung

Der Unterschied zum vorigen Beziehungsdiagramm liegt in der KENNT-Beziehung zwischen Kugel und Spielfeld. Eine (gerichtete) Kennt-Beziehung wird durch einen Pfeil von der kennenden zur gekannten Klasse (bzw. vom kennenden zum gekannten Objekt) dargestellt. Die kleine Zahl am Ende gibt an, wie viele Objekte gekannt werden. Hier: Eine Kugel kennt genau ein Spielfeld. Ein Spielfeld hingegen kennt die Kugeln auf ihm nicht.