Woher weiss ein Ojekt, zu wem es gehört?

Hallo, Computer-Freaks,

Ich hätte da eine Frage …

Ich habe ein Java-Programm geschrieben, bei dem allerlei Männchen-Objekte über den Bildschirm rennen (http://www.kanitrino.de/PageDE/Rempelei.html). Es funzt zwar, ich möchte es aber gescheiter strukturieren.

Die Männchen-Objekte enthalten jeweils einen Array „geist[]“ (das dient der Verknüpfung der Seiten de Spielfeldes - aber soweit möchte ich hier nicht ins Detail gehen).

Nun definiert jedes Männchen den Geist eines anderen als seinen Partner (den es z.B. angucken kann). Im weiteren Verlauf überprüft es dann, ob nicht ein anderer Geist näher bei ihm selbst ist, also in etwa

for(int i=0; i

hi Klaus

ich bin nicht sicher, ob ich deine geisterstunde da ganz verstanden habe. daher nur ein paar grundsätzliche hinweise…

dein grundproblem ist, dass die objekte erstmal voneinander wissen müssen. das einfachste ist, jedem der objekte die referenz auf einen zentralen „manager“ mitzugeben (z.b. über den konstruktor). gleichzeitig werden alle objekte beim manager registriert (z.b. hat der manager eine arraylist, in der alle objekte drinnen sind). nun kann der manager über geeignete methoden jedem objekt mitteilen, welche anderen objekte es noch gibt.

noch einfacher geht es, die zentrale liste in einem singleton abzulegen - die objekte brauchen dann keine referenz auf den manager sondern können sich die referenz jederzeit bei bedarf aus dem statischen bereich der manager-klasse holen.

vorstellbar wäre noch, dass die einzelnen objekte ihre „position“ ständig an den manager weitergeben (z.b. über property-change-listener) oder dass der manager die positionen bei bedarf abfragt (je nachdem, was in deinem fall effizienter ist). damit kannst du dann z.b. sowas realisieren:

Object next = Manager.getInstance().getNext(this);

also den manager fragen, welches objekt dem angegebenen am nächsten ist. will ein objekt seinen nachbarn feststellen, dann übergibt es sich einfach selbst.

falls du sehr viele objekte auf grosse „fläche“ verteilt hast, kann es effizienter sein, die fläche in segmente zu unterteilen. jedes objekt weiss dabei, in welchem segment es sich befindet. der manager muss daher nicht mehr die gesammte fläche durchsuchen sondern nur die objekte in der jeweiligen fläche (bzw. den unmittelbar angrenzenden). kann man sich also so ähnlich wie eine hashtable vorstellen.

das ganze ist natürlich nur eine von mehreren denkbaren lösungen. ob die lösung jetzt besonders „schön“ ist, kann ich nicht beurteilen, praktikabel ist sie auf jeden fall.

lg
erwin

Hallo Erwin,

Herzlichen Dank für die Tipps, ich bin gerade dabei, einige Details zu ergooglen.

Wenn ich nochmal nachfragen dürte :

gleichzeitig werden alle objekte beim
manager registriert (z.b. hat der manager eine arraylist, in
der alle objekte drinnen sind).

die habe ich für die Männchen

nun kann der manager über
geeignete methoden jedem objekt mitteilen, welche anderen
objekte es noch gibt.

Welches wäre denn z. B. eine „geeignete Methode“ ?

  • Die Männchen sind in einer ArrayList des Managers gespeichert
  • Jedes Männchen-Objekt enthält einen Array von Geist-Objekten
  • Das Männchen Anton kennt geist[2] von Männchen Bert und will seinen geist[0] ansprechen.

Was wäre die „geeignete Methode“, mit der der Manager dieses herausfindet ?
Braucht er eine weitere ArrayList ?
Muss Anton ihm bereits mitteilen, dass geist[2] zu Bert gehört oder weiss der Manager das ? Woher ?

mfg
Klaus

hi Klaus

jedes objekt braucht intern eine liste aller geister (z.b. eine arraylist)
zusätzlich hat jedes objekt einen public-method mit der eine kopie dieser arraylist abgefragt werden kann (kopie desshalb, weil ja sonst andere objekte die geisterliste des männchens manipulieren könnte)

der manager hat eine liste aller männchen und kennt deren position

Männchen nachbar = Manager.getInstance().getNextMännchen()
Männchen geist = nachbar.getGeister().get(2)

holt damit den zweiten Geist des mir am nächsten stehenden Männchens
(natürlich nur, wenn du alles richtig programmiert hast…)

und ja, dieser code wirft im betrieb unmengen an nullpointerexceptions - ist mir schon klar. soll ja nur das prinzip verdeutlichen…

zusätzlicher code:

private List geister = new ArrayList() ;

public synchronized List getGeister() {
return geister.clone();
}

also so in etwa halt…

lg
erwin

1 Like