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
|