Seite 1 von 3

Fehler in Vorlage für HÜ 8?

Verfasst: 20. Dez 2007 17:42
von andre_w
Hallo allerseits,

hatte etwas Probleme mit dem Bug in KarelJ, dass er auch versucht, irgendetwas an den aktuellen Platz zu legen, wenn placeBeepers 0 als letzter Parameter übergeben wird.

Der betreffende Code aus der Vorlage:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Sollte es nicht eher so heißen:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				if(p.getValueAt(j, i)>0)
					World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Mit zweiterem funktioniert hier alles, sonst kommt es zu seltsamen Swing-Exceptions, sobald pickBeeper() aufgerufen wird, obwohl kein Beeper vorhanden ist.
Was mich etwas verwundert sind diese seltsamen X-Grafiken, die auch im Screenshot in der Übung vorhanden sind. Sollen diese da sein? Sie erscheinen bei mir nur, wenn man versucht, an eine Stelle 0 Beeper zu legen.

2 ähnliche Threads:
http://www.fachschaft.informatik.tu-dar ... hp?p=49713
http://www.fachschaft.informatik.tu-dar ... 5c6d5571c1

VG Andre

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

Verfasst: 21. Dez 2007 08:09
von guido
andre_w hat geschrieben:Hallo allerseits,

hatte etwas Probleme mit dem Bug in KarelJ, dass er auch versucht, irgendetwas an den aktuellen Platz zu legen, wenn placeBeepers 0 als letzter Parameter übergeben wird.

Der betreffende Code aus der Vorlage:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Sollte es nicht eher so heißen:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				if(p.getValueAt(j, i)>0)
					World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Mit zweiterem funktioniert hier alles, sonst kommt es zu seltsamen Swing-Exceptions, sobald pickBeeper() aufgerufen wird, obwohl kein Beeper vorhanden ist.
Was mich etwas verwundert sind diese seltsamen X-Grafiken, die auch im Screenshot in der Übung vorhanden sind. Sollen diese da sein? Sie erscheinen bei mir nur, wenn man versucht, an eine Stelle 0 Beeper zu legen.
Zu den "X" kann ich auch nichts sagen, da ich bereits im Urlaub bin und nur sporadisch im Netz bin :). Wenn die oben angegebene Modifikation bei der Bearbeitung hilft, dann nehmt sie bitte vor!

Frohe Weihnachten und einen guten Rutsch,

Guido

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

Verfasst: 21. Dez 2007 15:24
von taufrisch
Danke, ich war auch schon dabei robots.jar zu debuggen :evil:

Verfasst: 21. Dez 2007 15:31
von MelonTropic
Wenn die Welt eingelesen wird, erzeugt er an jeder Stelle wo keine Beeper liegen ein "X". Ohne diese "X" bleibt am Ende kein Muster über.

Anstatt mit der Funktion nextToABeeper zu arbeiten, kann man auch prüfen ob an dieser Stelle die Anzahl der Beeper über 0 ist. (Falls man die Werte vorher in einem Array gespeichert hat).

Verfasst: 21. Dez 2007 17:43
von guido
MelonTropic hat geschrieben:Wenn die Welt eingelesen wird, erzeugt er an jeder Stelle wo keine Beeper liegen ein "X". Ohne diese "X" bleibt am Ende kein Muster über.

Anstatt mit der Funktion nextToABeeper zu arbeiten, kann man auch prüfen ob an dieser Stelle die Anzahl der Beeper über 0 ist. (Falls man die Werte vorher in einem Array gespeichert hat).
Danke für die Hinweise - noch dazu, bevor ich selbst Zeit hatte, es mir anzusehen :)

Frohe Weihnachten und einen guten Rutsch allen Hörern der Veranstaltung und allen anderen "Mitlesern"! :)

Guido

Verfasst: 21. Dez 2007 22:55
von taufrisch
MelonTropic hat geschrieben:Anstatt mit der Funktion nextToABeeper zu arbeiten, kann man auch prüfen ob an dieser Stelle die Anzahl der Beeper über 0 ist. (Falls man die Werte vorher in einem Array gespeichert hat).
Das funktioniert leider deswegen nicht, weil du dann nur die Ausgangsbelegung mit dir rumschleppst. Mit den Ameisen aus der Aufgabe fällt dir das nicht weiter auf, aber es ist leicht ein Feld von Ameisen deren Wege sich kreuzen ernten zu lassen, und dann versuchst du Pieper aufzunehmen die gar nicht (mehr) da sind.

Ich lasse am Ende der Funktion nochmal

Code: Alles auswählen

    private static void LeftOvers(RectangleDataAccess p)
    {
        for (int i = 0; i < p.getHeight(); i++)
            for (int j = 0; j < p.getWidth(); j++)
                if (p.getValueAt(j, i) == 0)
                    World.placeBeepers((p.getHeight() - i), j + 1, p.getValueAt(j, i));
    }
laufen, das malt die Kreuze hin wenn man sie unbedingt haben muß.

Verfasst: 22. Dez 2007 10:13
von FeG
Hi,

also ich kann dazu nur sagen, dass die PrepareField()-Funktion bei mir so in Ordnung ist.
Es ist glaub ich durchaus beabsichtigt, dass die X'e eingetragen werden wenn das Array-Feld 0 ist, es ist auch richtig, dass nextToABeeper da true zurückgibt und es dann eine Exception gibt.

Das liegt IMHO daran, dass es zwar ein Beeper ist, man ihn aber nicht aufsammeln kann.
Ich habe das daher so gelöst, dass ich nicht mit nextToABeeper() prüfe sondern anhand der eingelesen Datenfelds, das klappt auch ganz gut so..

Nur so zur Information...
Gruß
FeG

Verfasst: 26. Dez 2007 20:43
von Wulf
Seh ich es also richtig, dass die X-Beeper nach dem Ernten immernoch auf dem Feld liegen?

Verfasst: 26. Dez 2007 21:34
von Stumpf.Alex
Ja. Weil X-Beepers lassen sich nicht sammlen, da ja eigentlich keine an dieser Stelle sind. X steht also für 0 Beepers.

Verfasst: 30. Dez 2007 12:52
von Langbaeh
Ich habe mich nun auch mal aus eher unersichtlichen Gründen um diese Zeit an die Aufgabe gesetzt.

Also die Fehlermeldung kommt definitiv, wenn man die Beepers mit nextToABeeper prüft und dann versucht aufzuheben. Die komischen X-Beeper mag er da irgendwie nicht.

Ich würde es allerdings auch über das eingelesene Array lösen, weil das X-Muster dass dann am Ende übrigbleibt sicher so gewollt ist... sonst hätte man sich nicht die Mühe gemacht und es so gebastelt, dass dann GDI1 dortsteht ;)

Verfasst: 30. Dez 2007 14:53
von Stumpf.Alex
Ja das ist definitv so. X-Beepers sollen liegen bleiben. Und meiner Meinung nach ist da ein bisschen Gehirnschmalz gefragt, aber es gibt da tatsächlich eine elegante Lösung für.

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? Und damit alle Ameisen immer das gleiche und aktualisierte Feld haben, kann man das ja statisch in der Ants-Klasse abspeichern. Der Rest ergibt sich ja dann von alleine...

Verfasst: 30. Dez 2007 22:10
von Demmi
Nur muss man das Feld nicht wegen dem "Information Hiding" private machen? Das würde ja dann auch dazu führen, dass ich nicht mehr direkt drauf zugreifen kann.
Oder soll ich mir da eine getField(); basteln, die mir das Feld zurückgibt?

Fragen, die ich gerne beantwortet hätte, weil ich nicht schon wieder Lust auf Punktabzug wegen public/private hab -.-

Edit: getField(); kann ich auch vergessen, weil ich dann erst das Interface (RectangleDataAccess) anpassen müsste...

Verfasst: 30. Dez 2007 22:24
von Stumpf.Alex
Ja, das Feld muss man auch private machen.

Aber das ist doch kein Problem. Dann schreibt man halt entsprechende Selektoren in der Ants-Klasse und nicht im Interface. Außerdem kann man so schön die nextToABeeper() überschreiben und so den Fehler beheben.

Verfasst: 30. Dez 2007 23:58
von Demmi
Das ist mir soweit schon klar, nur wie soll ich denn in der Ants-Klasse nen Selektor schreiben, wenn ich gar keinen Zugriff aufs Feld habe. Selbst an den Ants-Konstruktor übergeben dürfte schwierig werden, weil ich ja auch in der Main nicht mehr an das Feld an sich rankomme.

Und mittels getWidth, getHeight und getValueAt das Ding nochmal zu rekonstruieren erscheint mir irgendwie übertrieben...

Verfasst: 31. Dez 2007 02:33
von Krümelmonster
Um das Feld zu "rekonstruieren" genügt ein einfaches "=". ;-)

Verstehe eure Probleme nicht.

Wenn ihr unbedingt das Feld in einer Ants-Klasse benötigt,
dann übergebt es doch dem Konstruktor und legt in der Klasse
eine Kopie an. Über getValueAt() habt ihr dann Zugriff auf alles
was das Herz begehrt. ;-)