使用turtle模块完成汉诺塔

汉诺塔侧视版本

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()    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值