Die Webseiten der Fachschaft Informatik am ERG Saalfeld


Hilfeseite - Türme von Hanoi mit Turtle - Darstellung der Scheiben



Darstellung des Bodens

import turtle

turtle.Screen().bgcolor("white")
bob = turtle.Turtle()
bob.hideturtle()
bob.width(1)
bob.speed(-1)

def boden():
    bob.color("black")
    bob.penup()
    bob.setpos(-370,-60)
    bob.pendown()
    bob.begin_fill()
    bob.forward(700)
    bob.left(90)
    bob.forward(8)
    bob.left(90)
    bob.forward(700)
    bob.left(90)
    bob.forward(8)
    bob.left(90)
    bob.end_fill()

boden()

turtle.done()


Das Programm (und damit der Boden) stellte sich so dar:


Als erstes versuchte ich eine große Scheibe zu zeichen, die natürlich gut 3 mal nebeneinander passt.

Dazu folgendes Programm:

import turtle

turtle.Screen().bgcolor("white")
my_turtle = turtle.Turtle()
my_turtle.hideturtle()
my_turtle.width(1)
my_turtle.speed(-1)

my_turtle.penup()
my_turtle.setpos(-350,-50)
my_turtle.pendown()
my_turtle.begin_fill()
my_turtle.forward(150)
my_turtle.left(90)
my_turtle.forward(25)
my_turtle.left(90)
my_turtle.forward(150)
my_turtle.left(90)
my_turtle.forward(25)
my_turtle.left(90)
my_turtle.end_fill()

my_turtle.penup()
my_turtle.setpos(-100,-50)
my_turtle.pendown()
my_turtle.begin_fill()
my_turtle.forward(150)
my_turtle.left(90)
my_turtle.forward(25)
my_turtle.left(90)
my_turtle.forward(150)
my_turtle.left(90)
my_turtle.forward(25)
my_turtle.left(90)
my_turtle.end_fill()

my_turtle.penup()
my_turtle.setpos(150,-50)
my_turtle.pendown()
my_turtle.begin_fill()
my_turtle.forward(150)
my_turtle.left(90)
my_turtle.forward(25)
my_turtle.left(90)
my_turtle.forward(150)
my_turtle.left(90)
my_turtle.forward(25)
my_turtle.left(90)
my_turtle.end_fill()

turtle.done()


Das sah dann so aus:

Das geht ja schon erstmal von der Breite (es ist aber zwischen de Scheiben noch reichlich Platz) und von der Höhe auch (für ca. 8 bis 9 Scheiben).

Es geht jetzt darum, die Scheiben für den Turm zu erstellen. Dabei scheint es sinnvoll zu sein, statt mit der Breite 150 besser 160 zu nehmen. Dann kannn jede Scheibe für die kleinere Scheibe links und rechts jeweisl 10 Pixel weniger werden und es bleiben gut zu händelnde Zahlen (hoffe ich). Außerdem mache ich die Höhe der Scheibe nur 23 Pixel hoch, damit zwischen den Scheiben ein kleiner Spalt zu sehen sein wird. Um das Programm kürzer zu machen, stecke ich die gleichen Anweisungen in eine Funktion und probiere mal Farben aus. siehe www.trinket.io/docs/colors.

import turtle

turtle.Screen().bgcolor("white")
my_turtle = turtle.Turtle()
my_turtle.hideturtle()
my_turtle.width(1)
my_turtle.speed(-1)

turtle.Screen().bgcolor("white")
my_turtle = turtle.Turtle()
my_turtle.hideturtle()
my_turtle.width(1)
my_turtle.speed(-1)


def zeichnen():
    my_turtle.color(farbe)
    my_turtle.penup()
    my_turtle.setpos(pos_x,pos_y)
    my_turtle.pendown()
    my_turtle.begin_fill()
    my_turtle.forward(breite)
    my_turtle.left(90)
    my_turtle.forward(23)                         # hier 23 statt 25  - kleinerer Streifen
    my_turtle.left(90)
    my_turtle.forward(breite)
    my_turtle.left(90)
    my_turtle.forward(23)
    my_turtle.left(90)
    my_turtle.end_fill()

# zuerst die 3 Scheiben nebeneinander
farbe  = "blue"
breite = 160
pos_x  = -350
pos_y  = -50
zeichnen()

farbe  = "medium blue"
breite = 160
pos_x  = -100
pos_y  = -50
zeichnen()

farbe  = "light steel blue"
breite = 160
pos_x  = 150
pos_y  = -50
zeichnen()

# jetzt kleiner werdende Scheiben auf den ersten Stab
farbe  = "cadet blue"
breite = 140
pos_x  = -340
pos_y  = -25
zeichnen()

farbe  = "lime green"
breite = 120
pos_x  = -330
pos_y  = -0
zeichnen()

farbe  = "green"
breite = 100
pos_x  = -320
pos_y  = 25
zeichnen()

farbe  = "goldenrod"
breite = 80
pos_x  = -310
pos_y  = 50
zeichnen()

farbe  = "peru"
breite = 60
pos_x  = -300
pos_y  = 75
zeichnen()

farbe  = "brown"
breite = 40
pos_x  = -290
pos_y  = 100
zeichnen()

farbe  = "crimson"
breite = 20
pos_x  = -280
pos_y  = 125
zeichnen()

turtle.done()

Das sieht so aus:


Wenn ich die Scheiben mit dieser Breite verwende, dann sind es 8 Scheiben, die ich verwenden kann. Also genau die Scheiben, die auf dem 1. Stab sind. Die anderen beiden werden verworfen. Da die Werte für pos_x und pos_y berechnet werden (die Formeln werden in einem nächsten Schritt erstellt), werden die Scheiben einmal durch die Farbe und zum anderen durch die Breite beschrieben / festgelegt. Es ergibt sich erstmal:

my_disc_farbe  = ["crimson", "brown", "peru", "goldenrod", "green", "lime green", "cadet blue", "blue"]
my_disc_breite = [20, 40, 60, 80, 100, 120, 140, 160]


Es fehlt noch das Löschen einer Scheibe. Das wird dadurch umgesetzt, dass ich eine große, weisse Scheibe (also der Farbe des Hintergrundes) darüber zeichen. Diese Scheibe bekommt bei mir genau wie der Version im Textmodus die Nummer 0. Deshalb:

my_disc_farbe  = ["white", "crimson", "brown", "peru", "goldenrod", "green", "lime green", "cadet blue", "blue"]
my_disc_breite = [160, 20, 40, 60, 80, 100, 120, 140, 160]

 

zurück


© ERG Saalfeld   -   HD. Kirmse 4.05.2023