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