~ubuntu-branches/ubuntu/trusty/python3.4/trusty-proposed

« back to all changes in this revision

Viewing changes to Lib/turtledemo/minimal_hanoi.py

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-11-25 09:44:27 UTC
  • Revision ID: package-import@ubuntu.com-20131125094427-lzxj8ap5w01lmo7f
Tags: upstream-3.4~b1
ImportĀ upstreamĀ versionĀ 3.4~b1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python3
 
2
"""       turtle-example-suite:
 
3
 
 
4
         tdemo_minimal_hanoi.py
 
5
 
 
6
A minimal 'Towers of Hanoi' animation:
 
7
A tower of 6 discs is transferred from the
 
8
left to the right peg.
 
9
 
 
10
An imho quite elegant and concise
 
11
implementation using a tower class, which
 
12
is derived from the built-in type list.
 
13
 
 
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 *
 
21
 
 
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()
 
29
 
 
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
 
43
 
 
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_)
 
49
 
 
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"))
 
56
 
 
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"
 
72
 
 
73
if __name__=="__main__":
 
74
    msg = main()
 
75
    print(msg)
 
76
    mainloop()