Fix issue number in comment.
[python.git] / Demo / turtle / tdemo_minimal_hanoi.py
blob4e2ad48a7a6baa97a493eca2780a40641243ab4d
1 #!/usr/bin/python
2 """ turtle-example-suite:
4 tdemo_minimal_hanoi.py
6 A minimal 'Towers of Hanoi' animation:
7 A tower of 6 discs is transferred from the
8 left to the right peg.
10 An imho quite elegant and concise
11 implementation using a tower class, which
12 is derived from the built-in type list.
14 Discs are turtles with shape "square", but
15 stretched to rectangles by shapesize()
16 ---------------------------------------
17 To exit press STOP button
18 ---------------------------------------
19 """
20 from turtle import *
22 class Disc(Turtle):
23 def __init__(self, n):
24 Turtle.__init__(self, shape="square", visible=False)
25 self.pu()
26 self.shapesize(1.5, n*1.5, 2) # square-->rectangle
27 self.fillcolor(n/6., 0, 1-n/6.)
28 self.st()
30 class Tower(list):
31 "Hanoi tower, a subclass of built-in type list"
32 def __init__(self, x):
33 "create an empty tower. x is x-position of peg"
34 self.x = x
35 def push(self, d):
36 d.setx(self.x)
37 d.sety(-150+34*len(self))
38 self.append(d)
39 def pop(self):
40 d = list.pop(self)
41 d.sety(150)
42 return d
44 def hanoi(n, from_, with_, to_):
45 if n > 0:
46 hanoi(n-1, from_, to_, with_)
47 to_.push(from_.pop())
48 hanoi(n-1, with_, from_, to_)
50 def play():
51 onkey(None,"space")
52 clear()
53 hanoi(6, t1, t2, t3)
54 write("press STOP button to exit",
55 align="center", font=("Courier", 16, "bold"))
57 def main():
58 global t1, t2, t3
59 ht(); penup(); goto(0, -225) # writer turtle
60 t1 = Tower(-250)
61 t2 = Tower(0)
62 t3 = Tower(250)
63 # make tower of 6 discs
64 for i in range(6,0,-1):
65 t1.push(Disc(i))
66 # prepare spartanic user interface ;-)
67 write("press spacebar to start game",
68 align="center", font=("Courier", 16, "bold"))
69 onkey(play, "space")
70 listen()
71 return "EVENTLOOP"
73 if __name__=="__main__":
74 msg = main()
75 print msg
76 mainloop()