Du weißt nicht mehr weiter mit den komischen Aliens? Wir helfen dir!
Unsere Greeps haben den Wettbewerb in unserer Stufe von zwei Informatikklassen gewonnen und sogar die Lehrer besiegt. Wir wollen einige unserer Erkenntnisse weitergeben, damit ihr nicht so viel ausprobieren müsst und schneller zum Ziel kommt.
Unser Projekt findet ihr übrigens auch auf der Greenfoot Website unter
-> http://www.greenfoot.org/scenarios/7266
Bei Fragen stehen wir gerne zu Verfügung! Schreibt uns eine Mail!
Unser Projekt findet ihr übrigens auch auf der Greenfoot Website unter
-> http://www.greenfoot.org/scenarios/7266
Bei Fragen stehen wir gerne zu Verfügung! Schreibt uns eine Mail!
Hier nochmals die Regeln:
Die Möglichkeiten sind also (wie die Greeps anscheinend selbst) stark beschränkt. Versuchst du nun, die Greeps zu programmieren, solltest du dir folgende Ideen zu Herzen nehmen:
1. Strukturiere die Greeps - du darfst zwar nur in der Greep-Klasse arbeiten, niemand verbietet es aber dir innerhalb dieser Klasse deine eigenen Methoden zu schreiben. Mithilfe von passenden Namen bleibt alles übersichtlich und du sparst wahrscheinlich noch Code.
2. Akzeptiere die fehlende Organisation. Greeps können nicht direkt miteinander kommunizieren (darauf gehen wir später noch ein) und es gibt auch kein kollektives Bewusstsein. Die Greeps werden zufällig vom Raumschiff ausgegeben, deswegen ist der Versuch, die Greeps in Gruppen zu möglichst effektiver Suche zu organisieren, zwecklos. Also: jeder Greep kämpft für sich.
Versetze dich in EINES der Objekte, und stelle dir vor, wie du vorgehen würdest.
3. Unterteile dir Aufgaben. Es ist sinnvoll, die Aufgaben eines Greep zu unterteilen. Dabei gibt es 1. Die Suche nach Tomaten; 2. Das Abtransportieren, nachdem diese gefunden wurden. Lege dafür unterschiedliche Methoden an.
4. Lasse die Greeps suchen: Da die Greeps ziemlich blind sind, gibt es nur eine Suchstrategie: Stumpf durch die Gegend irren, bis man auf Tomaten stößt. Anders geht's leider nicht. Vergiss aber nicht: Move() funktioniert nur einmal pro Aufruf. Es können sich Fehler einschleichen, d.h dass sich ein Greep zweimal hintereinander dreht, statt sich erst zu drehen, dann zu gehen und dann wieder zu drehen, weil der Zwischenschritt move() nicht mehr möglich ist.
5. Farbe:
Greeps können Farbkleckse spucken. Auch wenn der Nutzen dieser Funktion von vielen anderen in Frage gestellt wurde, hat sie sich bei uns ausgezahlt. Die Greeps sollten, wenn sie Tomaten abtransportieren, eine Farbspur hinterlassen, an der sie und andere wieder zum Haufen finden.
Dabei gibt es diesen Trick: Sieht ein Greep Farbe, dreht er sich erst zum Mutterschiff und dann um 180°. Er schaut also nun vom Mutterschiff weg. Und genau in dieser Richtung liegen tendenziell Tomaten.
Auch wenn die Greeps nicht immer ankommen werden, kommen sie doch wenigstens in die Nähe der Haufen. Manchmal bilden sich sogar Hochgeschwindigkeitsstraßen und gefundene Haufen werden in kurzer Zeit vollkommen geplündert.
Wichtig: Die Farbkleckse sollten erst ein oder zwei Schritte nach dem Fund einer Tomate gemacht werden, damit die Greeps nicht vom Haufen weglaufen, wenn sie auf einen Klecks hinter ihm stoßen.
Wir verwenden zwei Farben. Rot steht für den Weg zu einem Haufen, orange für die unmittelbare Umgebung eines Haufens. Trifft ein Greep auf Orange, dreht er sich einfach nur etwas nach rechts, damit er den Haufen dann Stück für Stück einkreist.
In der Nähe von Wasser sollte die Farbe grundsätzlich ignoriert werden, da die Greeps sonst Gefahr laufen, stecken zu bleiben.
6. Speicher:
Versuchst du den Ort gefundener Tomaten mit dem bereitgestellten Speicher zu vermerken? Vergiss es! Der Speicherplatz von einem Integer bis 255 und zwei Booleans (flags) reicht einfach nicht aus! Stattdessen solltest du die Flags nutzen, um den aktuellen Zustand des Greeps zu vermerken (also Suche oder Antransport, am Wasser oder nicht, Farbe gesehen oder nicht) und den Integer als Schrittzähler zu benutzen (siehe Wasser umgehen).
7. Wasser umgehen: Wie kommt der Greep zum Schiff? - Klar: turnHome() und dann Luflinie nach Hause. Oft liegt allerdings Wasser dazwischen. Dies ist das größte Problem dieses Projekts und hat am meisten Zeit beansprucht. Wir haben es mit allem möglichen Tricks versucht, bis hin zu Rechte-Hand-Regel oder Pledge-Algorithmus, aber am Ende war es viel einfacher:
Die Greeps drehen sich einfach ein bisschen, wenn sie auf Wasser stoßen, und laufen daran dann entlang, bis sie wieder freie Bahn haben.
Das geht so:
--> Beim Kontakt mit Wasser -> Drehung, dann weitergehen. Ein Schrittzähler wird aktiviert, der verhindert, dass der Greep sich weiterhin zum Schiff dreht, da er sonst steckenbleiben würde. Der Schrittzähler ist mit setMemory() bzw. getMemory zu verwenden und nur bei getMemory()=0 (also Memory nicht größer als null), dreht der Greep sich nach Hause, sonst nicht, Nach jedem Schritt wird der Zähler wieder um eines runtergesetzt.
So schaffen es die Greeps Wasser teils großflächig zu umgehen und sparen immens Zeit. Der Feinschliff liegt hier noch bei der Bestimmung der Drehung und des Schrittzählers:
8. Feinabstimmung
Die magische Zahl ist im gesamten Projekt: 42 ... nein Scherz, es ist 70 . Mit turn(70) kommen die Greeps am weitesten. Verwendest du etwa 90°-Drehungen bleiben die Greeps dauernd hängen, mit 70°-Drehungen nicht so sehr. Probier es aus! Tipp: Um Steckenbleiben noch unwahrscheinlicher zu machen, nimm 69°-Drehungen.
Beim Schrittzähler kommt es immer drauf an, was man erreichen will. Soll Wasser umgangen werden, empfehlen sich Werte zwischen 30 und 40. Bei der Suche nach Tomaten, wird auch der Schrittzähler verwendet, um sich zu merken, dass der Greeps vor kurzem orange Farbe gesehen hat und in der Nähe eines Haufens ist. Hier empfiehlt es sich, den Greeps sich ungefähr 250 Schritte lang an die Farbe erinnern zu lassen, damit er den Haufen auch wirklich einkreist. Aber das sind nur Richtwerte, probiert auch andere Werte aus, und wer weiß, vielleicht gelangt ihr zu noch besseren Ergebnissen.
9. Zu guter Letzt: Zufall
Es lohnt sich, auch etwas Zufall einzubauen. Das heißt: Ist der Greep gerade einfach nur auf der Suche kann man das Ergebnis mit einem eingeworfenen turn(randomNumber) aus Greenfoot.getRandomNumber variieren. Aber Achtung: Der Greep sollte beim Rückweg zum Schiff oder während er einer Farbspur folgt auf keinen Fall vom Zufall beeinflusst werden.
Apropos: Es empfiehlt sich eine Zufallsdrehung von -1° bis 1°, alles andere ist übertrieben.
Wir hoffen, wir konnten helfen!
Super toll fänden wir es, wenn du dir (als kleines Dankeschön sozusagen) mal unsere anderen Projekte anschaust, runterlädst oder vielleicht sogar Mitglied bei ADE Studios wirst. DANKE!
1. Strukturiere die Greeps - du darfst zwar nur in der Greep-Klasse arbeiten, niemand verbietet es aber dir innerhalb dieser Klasse deine eigenen Methoden zu schreiben. Mithilfe von passenden Namen bleibt alles übersichtlich und du sparst wahrscheinlich noch Code.
2. Akzeptiere die fehlende Organisation. Greeps können nicht direkt miteinander kommunizieren (darauf gehen wir später noch ein) und es gibt auch kein kollektives Bewusstsein. Die Greeps werden zufällig vom Raumschiff ausgegeben, deswegen ist der Versuch, die Greeps in Gruppen zu möglichst effektiver Suche zu organisieren, zwecklos. Also: jeder Greep kämpft für sich.
Versetze dich in EINES der Objekte, und stelle dir vor, wie du vorgehen würdest.
3. Unterteile dir Aufgaben. Es ist sinnvoll, die Aufgaben eines Greep zu unterteilen. Dabei gibt es 1. Die Suche nach Tomaten; 2. Das Abtransportieren, nachdem diese gefunden wurden. Lege dafür unterschiedliche Methoden an.
4. Lasse die Greeps suchen: Da die Greeps ziemlich blind sind, gibt es nur eine Suchstrategie: Stumpf durch die Gegend irren, bis man auf Tomaten stößt. Anders geht's leider nicht. Vergiss aber nicht: Move() funktioniert nur einmal pro Aufruf. Es können sich Fehler einschleichen, d.h dass sich ein Greep zweimal hintereinander dreht, statt sich erst zu drehen, dann zu gehen und dann wieder zu drehen, weil der Zwischenschritt move() nicht mehr möglich ist.
5. Farbe:
Greeps können Farbkleckse spucken. Auch wenn der Nutzen dieser Funktion von vielen anderen in Frage gestellt wurde, hat sie sich bei uns ausgezahlt. Die Greeps sollten, wenn sie Tomaten abtransportieren, eine Farbspur hinterlassen, an der sie und andere wieder zum Haufen finden.
Dabei gibt es diesen Trick: Sieht ein Greep Farbe, dreht er sich erst zum Mutterschiff und dann um 180°. Er schaut also nun vom Mutterschiff weg. Und genau in dieser Richtung liegen tendenziell Tomaten.
Auch wenn die Greeps nicht immer ankommen werden, kommen sie doch wenigstens in die Nähe der Haufen. Manchmal bilden sich sogar Hochgeschwindigkeitsstraßen und gefundene Haufen werden in kurzer Zeit vollkommen geplündert.
Wichtig: Die Farbkleckse sollten erst ein oder zwei Schritte nach dem Fund einer Tomate gemacht werden, damit die Greeps nicht vom Haufen weglaufen, wenn sie auf einen Klecks hinter ihm stoßen.
Wir verwenden zwei Farben. Rot steht für den Weg zu einem Haufen, orange für die unmittelbare Umgebung eines Haufens. Trifft ein Greep auf Orange, dreht er sich einfach nur etwas nach rechts, damit er den Haufen dann Stück für Stück einkreist.
In der Nähe von Wasser sollte die Farbe grundsätzlich ignoriert werden, da die Greeps sonst Gefahr laufen, stecken zu bleiben.
6. Speicher:
Versuchst du den Ort gefundener Tomaten mit dem bereitgestellten Speicher zu vermerken? Vergiss es! Der Speicherplatz von einem Integer bis 255 und zwei Booleans (flags) reicht einfach nicht aus! Stattdessen solltest du die Flags nutzen, um den aktuellen Zustand des Greeps zu vermerken (also Suche oder Antransport, am Wasser oder nicht, Farbe gesehen oder nicht) und den Integer als Schrittzähler zu benutzen (siehe Wasser umgehen).
7. Wasser umgehen: Wie kommt der Greep zum Schiff? - Klar: turnHome() und dann Luflinie nach Hause. Oft liegt allerdings Wasser dazwischen. Dies ist das größte Problem dieses Projekts und hat am meisten Zeit beansprucht. Wir haben es mit allem möglichen Tricks versucht, bis hin zu Rechte-Hand-Regel oder Pledge-Algorithmus, aber am Ende war es viel einfacher:
Die Greeps drehen sich einfach ein bisschen, wenn sie auf Wasser stoßen, und laufen daran dann entlang, bis sie wieder freie Bahn haben.
Das geht so:
--> Beim Kontakt mit Wasser -> Drehung, dann weitergehen. Ein Schrittzähler wird aktiviert, der verhindert, dass der Greep sich weiterhin zum Schiff dreht, da er sonst steckenbleiben würde. Der Schrittzähler ist mit setMemory() bzw. getMemory zu verwenden und nur bei getMemory()=0 (also Memory nicht größer als null), dreht der Greep sich nach Hause, sonst nicht, Nach jedem Schritt wird der Zähler wieder um eines runtergesetzt.
So schaffen es die Greeps Wasser teils großflächig zu umgehen und sparen immens Zeit. Der Feinschliff liegt hier noch bei der Bestimmung der Drehung und des Schrittzählers:
8. Feinabstimmung
Die magische Zahl ist im gesamten Projekt: 42 ... nein Scherz, es ist 70 . Mit turn(70) kommen die Greeps am weitesten. Verwendest du etwa 90°-Drehungen bleiben die Greeps dauernd hängen, mit 70°-Drehungen nicht so sehr. Probier es aus! Tipp: Um Steckenbleiben noch unwahrscheinlicher zu machen, nimm 69°-Drehungen.
Beim Schrittzähler kommt es immer drauf an, was man erreichen will. Soll Wasser umgangen werden, empfehlen sich Werte zwischen 30 und 40. Bei der Suche nach Tomaten, wird auch der Schrittzähler verwendet, um sich zu merken, dass der Greeps vor kurzem orange Farbe gesehen hat und in der Nähe eines Haufens ist. Hier empfiehlt es sich, den Greeps sich ungefähr 250 Schritte lang an die Farbe erinnern zu lassen, damit er den Haufen auch wirklich einkreist. Aber das sind nur Richtwerte, probiert auch andere Werte aus, und wer weiß, vielleicht gelangt ihr zu noch besseren Ergebnissen.
9. Zu guter Letzt: Zufall
Es lohnt sich, auch etwas Zufall einzubauen. Das heißt: Ist der Greep gerade einfach nur auf der Suche kann man das Ergebnis mit einem eingeworfenen turn(randomNumber) aus Greenfoot.getRandomNumber variieren. Aber Achtung: Der Greep sollte beim Rückweg zum Schiff oder während er einer Farbspur folgt auf keinen Fall vom Zufall beeinflusst werden.
Apropos: Es empfiehlt sich eine Zufallsdrehung von -1° bis 1°, alles andere ist übertrieben.
Wir hoffen, wir konnten helfen!
Super toll fänden wir es, wenn du dir (als kleines Dankeschön sozusagen) mal unsere anderen Projekte anschaust, runterlädst oder vielleicht sogar Mitglied bei ADE Studios wirst. DANKE!