Seite 2 von 3

Verfasst: 31. Dez 2007 09:34
von Stumpf.Alex
Jepp, genau so meinte ich das auch, vielleicht nur nicht konkret ausgedrückt:
Denkt daran, die Parameter für die Ants sind frei wählbar (siehe auskommentierter Text in der Applikation), also wieso dann kein Feld als Parameter übergeben?
So oder so, wäre ansonsten das Feld bis auf die Initialisierung der Welt sinnfrei, wenn man es nicht in die Antsklasse kopiert. Genau da braucht man ja auch die Informationen, wegen den X-Beepers, weil ja die reguläre Routine abstürzt. Deswegen meinte ich ja auch, dass man die einfach überschreiben kann und die neue Methode halt als Zusatzinformation das Feld heranzieht...man bedenke Auswertungsreihenfolgen bei booleschen Operationen. :wink:

Verfasst: 31. Dez 2007 16:43
von Demmi
Krümelmonster hat geschrieben:Um das Feld zu "rekonstruieren" genügt ein einfaches "=". ;-)
Ich hab nur keine Ahnung wie das gehen soll, weil das Feld an sich ja erstmal private sein muss.

Man kann es meiner Meinung nach nur so machen wie in der PrepareField-Methode machen:

Code: Alles auswählen

for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				 NeuesFeld[j][i]=p.getValueAt(j, i)
Direkt übergeben mit = dürfte nicht drin sein. Außer man bastelt sich eine getField()-Methode.
Oder hab ich da nochwas übersehen?

Klar kann man direkt das p übergeben. Aber auch das beschert keinen Direkt-Zugriff auf das Feld (ohne public oder ne get-Methode).

Verfasst: 31. Dez 2007 17:27
von Stumpf.Alex
Na klar geht direkt übergeben...
Wie gesagt, der Konstruktur von Ants muss als Parameter eine Variable vom Typ RectangleDataAccess übergeben bekommen. Dann kannst du im Konstruktor das übergebene Feld im statischen privaten Feld des gleichen Typs der Antsklasse mit "=" abspeichern.

Verfasst: 31. Dez 2007 17:38
von taufrisch
Langbaeh hat geschrieben:Also die Fehlermeldung kommt definitiv, wenn man die Beepers mit nextToABeeper prüft ...
Der Code prüft leider nur ob ein Beeperzähler auf dem Feld liegt, aber nicht ob der den Stand Null hat:

Code: Alles auswählen

if (current.avenue == currentBeepers.avenue && current.street == currentBeepers.street)
    return true;
Langbaeh hat geschrieben:... und dann versucht aufzuheben.
Tja, wenn der Beeperzähler auf Eins war, wird er entfernt. Sonst einfach gnadenlos runtergezählt, das heißt wir haben jetzt -1 Beeper auf dem Feld liegen:

Code: Alles auswählen

if (currentBeepers.count == 1)
    beepers.remove(currentBeepers);
else
    currentBeepers.count--;
Langbaeh hat geschrieben:Die komischen X-Beeper mag er da irgendwie nicht.
Da hat sich jemand gedacht: "Hmmm, ich male mal Icons für 1-9 Beeper. Wenn es mehr sind, nehme ich einfach Icon 0, und male ein 'X'":

Code: Alles auswählen

int index = current.count;
if (current.count > 9)
    index = 0;
drawImage(g, beepersImgs[index], current.avenue - 1, current.street - 1, avDist, stDist);
Leider sind 0 Beeper nicht vorgesehen, und -1 noch viel weniger, dann platzt nämlich beim Neumalen 'beepersImgs[index]'.

'X' soll also "mehr als Neun" heißen, die "X" für Null sind ein Bug in robots.jar der in der Aufgabe ausgenutzt wird und um den wir jetzt irgendwie rumarbeiten müssen.

Mir fallen spontan drei Möglichkeiten ein:
1.) Man legt keine 0-Beeper.
- Vorteil: Die sauberste Lösung: robots.jar wird benutzt wie vorgesehen, Nachteil: Kein "GDI 1"-Muster.

2.) Man legt die 0-Beeper nach dem Abernten.
- Vorteil: "GDI 1"-Muster, Nachteil: Eher ein Hack.

3.) Man übergibt das Feld an die Robots und vermeidet die 0-Beeper.
- Vorteil: Die Lösung die vom Aufgabensteller präferiert wird, Nachteil: Der Robot schleppt mehr Informationen herum als er müßte.

Ich bin von 1. über 2. nach 3. gekommen, muß aber sagen das keine Lösung wirklich befriedigend ist :roll:

Verfasst: 31. Dez 2007 17:45
von Krümelmonster
@Stump.Alex
Wenn du das Feld in der Ants-Klasse statisch machst, dann wäre
es wohl besser das Feld direkt in der main() Methode zu initialisieren,
anstatt es per Konstruktor immer wieder neu zu initialisieren, wenn
eine neues Objekt von Ants erstellt wird.

Aber im Prinzip hatte ich es so gemeint.

Verfasst: 31. Dez 2007 18:18
von Demmi
Ich habs jetzt auch hinbekommen... allerdings hat mich das Forum irgendwie mehr verwirrt, als das es mir geholfen hat. Bei Feld dachte ich die ganze Zeit an das Array in dem die Beeper-Anzahlen gespeichert werden.
Im Endeffekt übergibt man ja aber nur ein RectangleDataAccess worin man dann mittels getValueAt für jede Position prüft.

Verfasst: 2. Jan 2008 17:44
von ChRiZz88
Hmm, also ich hab jetzt das Problem, nicht zu wissen, wie ich Konstruktoren für Robots definiere..
Ich hab das Interface von Aufgabe 3.) definiert und die Methode harvest() jetzt in AntyTheHarvesterApplication implementiert.
Hmm, dann habe ichs mal damit versucht

Code: Alles auswählen

AntyTheHarvesterApplication AntyTheHarvesterAnt = new AntyTheHarvesterApplication(0,0,Integer.MAX_VALUE, direction.EAST);
	AntyTheHarvesterAnt.harvest();
, weil ich dachte, dass der Konstruktor so heißen muss wie die Klasse..
Gelandet bin ich logischerweise aber bei:

Code: Alles auswählen

The constructor AntyTheHarvesterApplication(int, int, int, direction) is undefined
Wo is der Fehler?

Verfasst: 2. Jan 2008 17:59
von Krümelmonster
Du versuchst eine Instanz von "AntyTheHarvesterApplication" zu erstellen.
(Das ist die Klasse mit der Main-Methode).

Code: Alles auswählen

AntyTheHarvesterAnt anty = new AntyTheHarvesterAnt(...)

Verfasst: 2. Jan 2008 19:26
von s!mon
Bild

Was soll das eigentlich links von GDI 1 sein? Hab ich da was verbockt :)?

edit: noch ne Frage. mit welcher Tastenkombi kann man nochmal ein Javadoc-Kommentar erzeugen? Habs in den Folien nicht gefunden. Sollte vielleicht in das Javadoc-Miniintro rein. Nur so als Anmerkung fall ichs nicht übersehen haben sollte.

Verfasst: 2. Jan 2008 19:42
von Krümelmonster
Shift+Alt+J

Verfasst: 2. Jan 2008 20:24
von ChRiZz88
Krümelmonster hat geschrieben:Du versuchst eine Instanz von "AntyTheHarvesterApplication" zu erstellen.
(Das ist die Klasse mit der Main-Methode).

Code: Alles auswählen

AntyTheHarvesterAnt anty = new AntyTheHarvesterAnt(...)
Hatte ich vorher so.. Dann kommt "AntyTheHarvesterAnt cannot be resolved to a type."

Verfasst: 2. Jan 2008 20:45
von Krümelmonster
Hast du die Datei mit der Klasse auch im selben Package?

Verfasst: 2. Jan 2008 21:42
von s!mon
AntyTheHarvesterApplication startet doch quasi nur deine Anwendung und initiiert die Welt. In der Datei musst du eigentlich gar nichts verändern um die Aufgabe zu lösen. Versteh gar nicht was du da machst.

Verfasst: 2. Jan 2008 23:31
von Demmi
Jo, in die Anty[...]Application musst du garnix reinschreiben außer die Parameter für den Konstruktor-Aufruf.

Dann musst du noch in der jeweiligen Klasse Anty[...] und Elisabeth[...] nen passenden Konstruktor bauen, der sich wiederum auf den der Superklasse (Robot) bezieht.
Das sollte dann fürs erste weiterhelfen ;)

Re: Fehler in Vorlage für HÜ 8?

Verfasst: 8. Jan 2008 21:04
von mcdikki
Man muss im Übrigen das Feld für die NextToABeeper Mehtode nicht verändern.

Wenn man eine eigene NextToABeeper Methode mit den infos aus dem erzeugenten Array geschickt mit der NextToABeeper methode der classe Robots verbindet geht es wunderbar auch ohne der Veränderung des Feldes.