Dinosaurier-Hut: denk wie eine Schlange, nicht wie ein Bauer
Der Dinosaurier-Hut ist kein Ernte-Skript. Hut auf, Äpfel gegen Kaktus, jeder Apfel verlängert den Schwanz, Knochen gibt es erst beim Absetzen. Erst die Idee, dann optional das ganze Skript.
Schritt 1 — Hut aufsetzen
Ohne Hut passiert nichts. Eine Funktion, ein Hutname. Danach kauft das Spiel bei genug Kaktus einen Apfel und legt ihn unter die Drohne.
change_hat(Hats.Dinosaur_Hat) Nur eine Drohne kann den Hut tragen. clear() setzt den Strohhut zurück und leert den Hof.
Schritt 2 — Warum Kaktus zählt
Der Apfel wird nicht mit plant() gesetzt. Das Spiel bezahlt ihn mit Kaktus aus dem Inventar. Ohne Kaktus erscheint kein Apfel.
if num_items(Items.Cactus) == 0:
print("need cactus before the hat is useful") Schritt 3 — Ein weiterer Zug frisst, harvest nicht
Auf dem Apfel stehen reicht nicht. Der nächste erfolgreiche move frisst ihn und legt ein Schwanzstück auf das verlassene Feld. harvest() ist hier falsch.
# hat is on, apple is under the drone
move(East)
# that move ate the apple and grew the first tail tile Schritt 4 — Der Schwanz ist eine Wand
move() ist False auf dem eigenen Schwanz. Das letzte Stück weicht beim Zug aus. Mit dem Hut gibt es kein Umwickeln am Feldrand. Ist der Hof voll, schlagen alle Züge fehl.
if can_move(North):
move(North)
else:
print("blocked by tail or the farm edge") Schritt 5 — Den Apfel nach dem nächsten fragen
measure() auf einem Apfel liefert das nächste Apfel-Paar. Messen, solange du noch darauf stehst, dann dorthin laufen, dann erneut messen.
next_x, next_y = measure()
print(next_x, next_y) Schritt 6 — Knochen erst beim Absetzen
Ein anderer Hut erntet den Schwanz. Du bekommst n² Knochen. Länge 16 ergibt 256. Nicht harvest() auf den Schwanz.
change_hat(Hats.Straw_Hat)
# tail is gone; inventory gained n**2 Items.Bone Optional: erst auf einem kleinen Hof üben
Ein voller Hof dauert lange. set_world_size() verkleinert das Raster (mindestens 3) und leert es. Das folgende Übungsloop nutzt nur die Schritte oben.
set_world_size(5)
clear()
change_hat(Hats.Dinosaur_Hat)
def walk_to(x, y):
while get_pos_x() != x or get_pos_y() != y:
if get_pos_x() < x:
if not move(East):
return False
elif get_pos_x() > x:
if not move(West):
return False
elif get_pos_y() < y:
if not move(North):
return False
else:
if not move(South):
return False
return True
while True:
nxt = measure()
if nxt == None:
break
next_x, next_y = nxt
if not walk_to(next_x, next_y):
break
change_hat(Hats.Straw_Hat) Ein Lehrpfad, keine Bestzeit. Er läuft absichtlich in den eigenen Schwanz. Hof leeren, dann den Hut aufsetzen.