Die Webseiten der Fachschaft Informatik am ERG Saalfeld


"Türme von Hanoi" in Python (Turtle-Version)

import turtle
import time
import sys               # wegen Anzahl der Scheiben als Parameter


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]


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


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



class Scheibe():
    def __init__(self, nummer_scheibe):
        Scheibe.farbe  = my_disc_farbe[nummer_scheibe]
        Scheibe.breite = my_disc_breite[nummer_scheibe]

    def zeichnen(self, stab, scheiben_nr_auf_stab):
        # für die Scheibenmitte gilt
        # x_mitte =  250 * stab - 520
        # y_mitte =  25 * scheiben_nr_auf_stab - 75
        # um die Scheibe zu zeichnen brauchen wir aber nicht die Mitte der Scheibe, sondern die linke untere Ecke
        # d.h. ich muss noch die Hälfte der Breite nach vorn gehen ; y -Wert bleibt wie bei Mitte
        pos_x  =  250 * stab - 520  -  self.breite / 2
        pos_y  =   25 * scheiben_nr_auf_stab - 75
        my_turtle.color(self.farbe)
        my_turtle.penup()
        my_turtle.setpos(pos_x,pos_y)
        my_turtle.pendown()
        my_turtle.begin_fill()
        my_turtle.forward(self.breite)
        my_turtle.left(90)
        my_turtle.forward(23)                         # hier 23 statt 25  - kleiner streifen
        my_turtle.left(90)
        my_turtle.forward(self.breite)
        my_turtle.left(90)
        my_turtle.forward(23)
        my_turtle.left(90)
        my_turtle.end_fill()

    def loeschen(self, stab, scheiben_nr_auf_stab):
        # löschen ist das zeichnen der Scheibe 0
        pos_x  =  250 * stab - 520  -  my_disc_breite[0] / 2
        pos_y  =   25 * scheiben_nr_auf_stab - 75
        my_turtle.color(my_disc_farbe[0])
        my_turtle.penup()
        my_turtle.setpos(pos_x,pos_y)
        my_turtle.pendown()
        my_turtle.begin_fill()
        my_turtle.forward(my_disc_breite[0])
        my_turtle.left(90)
        my_turtle.forward(23)
        my_turtle.left(90)
        my_turtle.forward(my_disc_breite[0])
        my_turtle.left(90)
        my_turtle.forward(23)
        my_turtle.left(90)
        my_turtle.end_fill()


class Stab():
    def __init__(self,nr):
        self.anzahl = 0
        self.nummer = nr      # z.B.: stab_a = 1, stab_b = 2, stab_c = 3
        self.scheiben = []      # Liste von Scheiben, die auf diesem Stab sind

    def scheibe_aufnehmen(self, nummer_scheibe):
        self.scheiben.append(nummer_scheibe)
        self.anzahl += 1                      # Anzahl um 1 erhöhen
        hilf = Scheibe(nummer_scheibe)
        stab_nr = self.nummer
        scheiben_nr_auf_stab = self.anzahl
        hilf.zeichnen(stab_nr, scheiben_nr_auf_stab)

    def scheibe_abgeben(self):
        aktuelle_scheibe = self.scheiben.pop() # Rückgabe ist Nummer der Scheibe (int)
        stab_nr = self.nummer
        scheiben_nr_auf_stab = self.anzahl
        hilf = Scheibe(scheiben_nr_auf_stab)
        hilf.loeschen(stab_nr, scheiben_nr_auf_stab)
        self.anzahl -= 1                       # Anzahl um 1 verkleinert
        return aktuelle_scheibe            # das ist die Nummer der Scheibe / my_disc


def bewege (anzahl,stab_a,stab_b,stab_c):
    if anzahl > 0:
        bewege(anzahl-1,stab_a,stab_c,stab_b)
        aktuelle_disc = stab_a.scheibe_abgeben()
        stab_c.scheibe_aufnehmen(aktuelle_disc)
        global anzahl_bewegungen
        anzahl_bewegungen += 1                 # Anzahl um 1 erhöhen
        time.sleep(3/10)                 # sonst ist das Programm viel zu schnell
        bewege(anzahl-1,stab_b,stab_a,stab_c)




stab_a = Stab(1)
stab_b = Stab(2)
stab_c = Stab(3)

boden()


anzahl_bewegungen = 0                                       # Initialisierung


# wir lesen die Anzahl der Scheiben ein
anzahl_scheiben = int(sys.argv[1])


for i in range(anzahl_scheiben, 0, -1):
    stab_a.scheibe_aufnehmen(i)

time.sleep(2)                                     # 2s zum Anschauen, bevor es losgeht

bewege(anzahl_scheiben,stab_a,stab_b,stab_c)


time.sleep(5/10)                               # Pause 1/2 sekunde
my_turtle.color("black")
my_turtle.penup()
my_turtle.setpos(-320,-150)
my_turtle.pendown()
my_turtle.write("Bin fertig!",move=False,align='left', font=('Arial',12,'normal'))

my_turtle.penup()
my_turtle.setpos(-320,-180)
my_turtle.pendown()
my_string = "Anzahl der Bewegungen: " + str(anzahl_bewegungen)
my_turtle.write(my_string, move=False,align='left', font=('Arial',12,'normal'))


turtle.done()

 

zurück


© ERG Saalfeld   -   HD. Kirmse 13.05.2023