汉诺塔侧视版本
Python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是Python的内部库。
turtle库
汉诺塔
import turtle
def draw_post():
'''画三个柱子'''
h.speed(0)
h.up()
h.left(90)
h.pensize(10)
d(-350,-200)
d(0,-200)
d(350,-200)
def d(x,y):
'''画一个柱子'''
h.goto(x,y)
h.down()
h.fd(300)
h.up()
def draw():
'''依次绘制圆盘至a上面'''
for index,t in enumerate(a[1]):
t.goto(a[0][index][0],a[0][index][1])
a_line(t)
def a_line(t):
'''画一个侧视圆盘'''
t.speed(0)
t.down()
t.fd(t.width)
t.back(2*t.width)
t.up()
def prepare_pen():
for x in range(num,0,-1):
t = turtle.Turtle()
t.up()
t.ht()
t.speed(0)
t.pensize(high)
t.width = x*20
t.color(color[x-1])
a[1].append(t)
def m(n,a,b,c):
'''递归实现汉诺塔'''
if n == 1:
a[1][-1].speed(speed)
a[1][-1].goto(c[0][c[2]][0],c[0][c[2]][1])
a[1][-1].clear()
a_line(a[1][-1])
ob = a[1].pop()
a[2] = len(a[1])
c[1].append(ob)
c[2] = len(c[1])
return
else:
m(n-1,a,c,b)
m(1,a,b,c)
m(n-1,b,a,c)
if __name__ == "__main__":
#turtle.tracer(0,0)
# 画布大小
turtle.setup(1000,700)
# 每个饼的高度
high = 40
# 饼的数量,受颜色限制,最多7个
num = 5
# 速度 0 最快 0-10 递增
speed = 10
# 饼的颜色
color = ["red","green","pink","blue","purple","black","yellow"]
# 三个存放饼相关数据的列表,[[坐标],[饼],最新的放置索引]
a = [[[-350,-200+x*high] for x in range(num)],[],6]
b = [[[0,-200+x*high] for x in range(num)],[],0]
c = [[[350,-200+x*high] for x in range(num)],[],0]
# 准备所有的饼
prepare_pen()
# 画三个柱子
h = turtle.Turtle()
draw_post()
# 饼的初始化
draw()
# 递归实现汉诺塔
m(num,a,b,c)
turtle.done()
汉诺塔俯视版本
import turtle
def prepare_pen():
'''准备绘制汉诺塔的画笔'''
for i in range(num,0,-1):
t = turtle.Turtle()
t.speed(5)
t.up()
t.ht()
t.n = i
t.size = (i+1)*40
t.color(color[i-1])
a[0].append(t)
def init():
'''初始化汉诺塔'''
for p in a[0]:
p.goto(a[1][0], a[1][1])
p.dot(p.size)
p.write(p.n)
def write_symbol():
'''绘制三个位置符号'''
p = [a,b,c]
h = turtle.Turtle()
h.ht()
h.speed(0)
for u in p:
h.up()
h.goto(u[1][0],u[1][1])
h.write(u[2],font=("楷体",30))
def m(n,a,b,c):
'''递归实现汉诺塔'''
if n == 1:
a[0][-1].goto(c[1][0],c[1][1])
a[0][-1].clear()
a[0][-1].dot(a[0][-1].size)
a[0][-1].write(a[0][-1].n)
ob = a[0].pop()
c[0].append(ob)
return
else:
m(n-1,a,c,b) # 手电需要吧(n-1)个圆盘移动到 b
m(1,a,b,c) # 将a的最后一个圆盘一定到 c
m(n-1,b,a,c) # 在将b的(n-1)个圆盘移动到 c
if __name__ == "__main__":
# 准备三个位置的信息列表[[饼],坐标,符号]
a =[[],[-100,100],"A"]
b =[[],[-50,-200],"B"]
c =[[],[200,0],"C"]
# 饼的颜色
color = ["red","green","pink","blue","purple","black","yellow"]
# 绘制三个位置符号
write_symbol()
# 饼的数量
num = 7
# 准备饼
prepare_pen()
# 饼的初始化
init()
# 递归实现汉诺塔
m(num,a,b,c)
turtle.done()