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.

Handgezeichnete Karikatur: Drohne mit Dinosaurierhut über einem Feld, ein Apfel liegt unten

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.

python
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.

python
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.

python
# 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.

python
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.

python
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.

python
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.

python
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.