Hexagonaler Random Walker (mit der Turtle und in Trinket)

Python
Turtle
Trinket
Creative Coding
Autor:in

Jörg Kantel

Veröffentlichungsdatum

5. Januar 2024

Da ich mit meinen Spiralen Blut geleckt hatte, wollte ich unbedingt zu Beginn des Jahres noch etwas mit Pythons Turtle anstellen. Also habe ich den hexagonalen Random Walk, den ich im Dezember 2017 schon einmal hier in diesem Blog Kritzelheft vorgestellt hatte, wieder aus der Mottenkiste hervorgekramt und ein wenig aufgehübscht.

Die wichtigste Änderung war, daß ich nun, wenn der Random Walker das Spielfeld verlassen will, ihn zurück an Start schicke, und er seine Reise neu antreten muß (das ist ein wenig wie beim Monopoly-Spiel). Außerdem habe ich, um die Reise farbiger zu gestalten, nicht nur auf die bewährte Coding Train Farbpalette zurückgegriffen, sondern auch die Schildkörte angewiesen, alle zwanzig Schritte ihre Farbe zu wechseln.

Da die Reise durch das hexagonale Turtle-Universum nur dann Spaß macht, wenn man der Schildkröte bei ihrem Herumirren zusehen kann, habe ich mich an meine Trinket-Experimente erinnert, den Random-Walk auch dort implementiert und das Ergebnis dann in diese Seite eingebunden:

Das lief erstaunlich schmerzfrei ab, der Trinket-Code verlangte nur eine Änderung von meiner Original-Python-Implementierung: Die Hintergrundfarbe des Canvas kann erst initialisiert werden, nachdem der Turtle-Screen erstellt wurde.

Die restlichen Änderungen sind rein kosmetischer Natur (Anpassung an die Breite der Webseite etc.).

Nun für alle neugierigen, kreativen Codiererinnen und Codierer unter Euch da draußen den vollständigen Quellcode, den es auch wie immer in meinem GitHub-Repositorium gibt:

import turtle as t
import random as r

WIDTH, HEIGHT = 540, 640
MIN_X = -WIDTH//2 + 10
MAX_X = WIDTH//2 - 20
MIN_Y = HEIGHT//2 - 10
MAX_Y = -HEIGHT//2 + 20 
BORDERSIZE = 1
STEPSIZE = 15

codingtrain = ["#f05025", "#f89e50", "#f8ef22", "#f063a4",
               "#9252a1", "#817ac6", "#62c777", "#31c5f4"]

wn = t.Screen()
wn.colormode(255)
wn.bgcolor("#2a282d")
wn.setup(width = WIDTH, height = HEIGHT, startx = 1300, starty = 30)
wn.title("🐢 Hexagonaler Random Walk 🐢")

# Draw Border
border = t.Turtle()
border.speed(0)
border.pensize(BORDERSIZE)
border.pencolor("#e6e2cc")
border.penup()
border.hideturtle()
border.goto(MIN_X, MIN_Y)
border.pendown()
border.goto(MAX_X, MIN_Y)
border.goto(MAX_X, MAX_Y)
border.goto(MIN_X, MAX_Y)
border.goto(MIN_X, MIN_Y)

# Start Random Walk
hexi = t.Turtle()
hexi.speed(0)
hexi.pensize(2)

def go_home():
    hexi.penup()
    hexi.home()
    hexi.pendown()

for step in range(5000):

    # Set Pencolor
    if step%20 == 0:
        hexi.pencolor(codingtrain[r.randint(0, len(codingtrain) - 1)])

    # Roll Dice and set Angle
    roll = r.randint(0, 5)
    angle = roll*60
    hexi.seth(angle)
    
    # Check Border
    if hexi.xcor() >= MAX_X:
        go_home()
    elif hexi.xcor() <= MIN_X:
        go_home()
    elif hexi.ycor() <= MAX_Y:
        go_home()
    elif hexi.ycor() >= MIN_Y:
        go_home()
    else:
        hexi.fd(STEPSIZE)

print("I did it, Babe!")
wn.exitonclick()
wn.mainloop()

Und die Trinket-Implementierung findet Ihr natürlich auf Trinket selber. Ihr könnt Euch davon eine Fork erstellen und weiter damit herumspielen. Habt Spaß dabei!