Hexagonaler Random Walk mit TigerJython

TigerJython
Turtle
Python
Nature of Code
Simulation
Autor:in

Jörg Kantel

Veröffentlichungsdatum

18. Juni 2025

Der bei Microsoft forschende Psychologe und Informatiker Dan Goldstein berichtet in seinem Blog, wie er mit seiner neunjährigen Tochter in einem Bagel-Shop warten mußte. Um sich die Langeweile zu verkürzen, kramte er ein hexagonal-kariertes Blatt Papier und einen Würfel hervor (Psychologen bei Microsoft haben immer einen hexagonal-karierten Notizblock und einen Würfel in der Tasche). Und dann entschied er, daß, wenn eine Eins gewürfelt wurde, die Tochter auf dem Papier einen Strich nach oben (nach Norden) malen durfte, bei einer Zwei ging es nach Nordost, bei einer Drei nach Südost und so weiter in alle sechs Richtungen, die ein Hexagon erlaubt. Heraus kam ein Random Walk in sechs Richtungen.

Als ich dies las, dachte ich, daß dies doch ein schönes Projekt für eine Realisierung mit der Turtle sei. Zuerst stellte ich mir die Frage, wie man denn der Schildkröte beibringt, ein Hexagon zu zeichnen. Ein Blick in die Wikipedia half mir weiter, denn dort konnte ich entnehmen, daß die Schildkröte an jedem der sechs Endpunkt einen Winkel von \(60°\) einschlagen mußte, entweder konsequent nach rechts oder konsequent nach links. Die sechs Winkel für die sechs möglichen Richtungen sind also \(0°\), \(60°\), \(120°\), \(180°\), \(240°\) und \(300°\). Brute Force zeichnet sich ein Hexagon also so:

hexi = gt.Turtle(tf)
hexi.setHeading(0)
hexi.forward(100)
hexi.setHeading(60)
hexi.forward(100)
hexi.setHeading(120)
hexi.forward(100)
hexi.setHeading(180)
hexi.forward(100)
hexi.setHeading(240)
hexi.forward(100)
hexi.setHeading(300)
hexi.forward(100)

Natürlich geht das in einer Schleife viel kompakter und einfacher:

hexi = gt.Turtle(tf)

for in in range(6):
    angle = i*60
    hexi.setHeading(angle)
    hexi.forward(100)

Für die eigentliche Realisierung in TigerJython habe ich dann noch auf die bewährte Coding Train Farbpalette zurückgegriffen, damit auch alles schön bunt wird. Außerdem habe ich mit Pythons randint-Modul einen Würfel simuiert, der dafür sorgt, daß der Random Walk auf wirklich (pseudo-) zufällig ist:

# Roll Dice and set Angle
roll = randint(0, 5)
angle = roll*60
hexi.setHeading(angle)

Und schießlich habe ich noch als Reminiszenz an Christian Thompson (aka TokyoEdtech, Ihr wisst schon, der Mann, der Unglaubliches mit Pythons Turtle anstellt) dem Turtle-Playground einen Rand spendiert. Das hat zwar den Quellcode fast verdoppelt, aber er ist immer noch recht kurz geraten:

# Hexagonaler Random Walker

import gturtle as gt
from random import randint

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

codingtrain = [makeColor(240, 80, 37), makeColor(248, 158, 80),
               makeColor(248, 239, 34), makeColor(49, 197, 244),
               makeColor(240, 99, 164), makeColor(146, 82, 161),
               makeColor(129, 122, 198),  makeColor(98, 199, 119)]

gt.setPlaygroundSize(WIDTH, HEIGHT)
tf = gt.TurtleFrame()
tf.title = "Hexagonaler Random Walker"
tf.clean(makeColor("#2a282d"))

# Draw Border
border = gt.Turtle(tf)
border.penWidth(BORDERSIZE)
border.setPenColor("#e6e2cc")
border.penUp()
border.hideTurtle()
border.moveTo(MIN_X, MIN_Y)
border.penDown()
border.moveTo(MAX_X, MIN_Y)
border.moveTo(MAX_X, MAX_Y)
border.moveTo(MIN_X, MAX_Y)
border.moveTo(MIN_X, MIN_Y)
border.penUp()

# Start Random Walk
hexi = gt.Turtle(tf)
hexi.hideTurtle()
hexi.penWidth(2)
# hexi.speed(1000)

def goHome():
    hexi.penUp()
    hexi.home()
    hexi.penDown()

for step in range(5000):
    
    # Set Pencolor
    if step%20 == 0:
        c = gt.makeColor(codingtrain[randint(0, len(codingtrain) - 1)])
        hexi.setPenColor(c)
        
    # Roll Dice and set Angle
    roll = randint(0, 5)
    angle = roll*60
    hexi.setHeading(angle)
    
    # Check Border
    if hexi.getX() >= MAX_X:
        goHome()
    elif hexi.getX() <= MIN_X:
        goHome()
    elif hexi.getY() <= MAX_Y:
        goHome()
    elif hexi.getY() >= MIN_Y:
        goHome()
    else:
        hexi.forward(STEPSIZE)

print("I did it, Babe!")

Und dann habe ich, wenn die Turtle das Spielfeld verlässt, sie wieder nach Hause geschickt (ein wenig wie beim Monopoly-Spiel: »Gehe nicht über Los und ziehe keine 4.000 Euro ein«), wo sie ihre Reise wieder neu beginnt. Dadurch wollte ich vermeiden, daß sie irgendwann im Nirwana verschwindet.

Weiterführende Literatur

Random-Walk-Modelle finden einige interessanten Anwendungen von der Biologie bis zur Finanzwirtschaft. Wer sich da hineinlesen will, findet hier ein paar interessante Beiträge:

Und auch im oben verlinkten Original-Blog-Post, der mich zu diesem Beitrag inspirierte, hat Dan Goldstein ein paar überraschende Überlegungen zum (hexagonalen) Zufallsspaziergang der Schildkröte angestellt.


Bild: Hexawalk mit Tiger und Python, erstellt mit OpenArt.ai. Prompt: »Colored franco-belgian comic style. Illustration of a tiger in a red dressing gown and a python with glasses wandering through a surreal, hexagonal landscape«. Modell: Flux (Pro), Style: None.