利用python的turtle库实现图像化冒泡算法
这是选修课老师留下的一个作业,使用turtle绘制一幅画面
关于turtle库,选修课课上并没有讲到太多,所以更多的是我根据官方文档和自己的理解来进行代码实现
官方文档:https://docs.python.org/zh-cn/3/library/turtle.html#
逻辑过程:
- 绘制初始列表的柱状图
- 进行冒泡排序,当正在比较的两个数字需要交换位置时,清除掉原有柱形,
- 绘制新的图形
我在官方文档中并没有找到清除局部图像的函数,使用多个turtle对象每一个柱状图由一个turtle控制,即可实现单独重绘图形
代码实现:
将多个turtle对象封装到list中,方便之后进行操作
pen=list()
n=0
for i in li:
n+=1
tem=turtle.Turtle()
pen.append(tem)
tem.hideturtle()
tem.penup()
#使每个画笔起始点不同
tem.goto(50*n,0)
实现绘制柱形,冒泡算法的函数
def block(pen,higth):
pen.fillcolor(random.random(),random.random(),random.random())
pen.begin_fill()
pen.left(90)
pen.forward(higth*10)
pen.write(higth)
pen.right(90)
pen.forward(50)
pen.right(90)
pen.forward(higth*10)
pen.right(90)
pen.forward(50)
pen.end_fill()
pen.right(180)
def bubble(li):
for i in range(len(li)-1):
for j in range(len(li)-1-i):
#显示小海龟,展示当前对比的元素,停顿2s后隐藏
pen[j].showturtle()
pen[j+1].showturtle()
time.sleep(2)
pen[j].hideturtle()
pen[j+1].hideturtle()
if li[j]>li[j+1]:
temp=li[j]
li[j]=li[j+1]
li[j+1]=temp
#清除原有
pen[j].clear()
pen[j+1].clear()
#绘制新的柱状图
block(pen[j],li[j])
block(pen[j+1],li[j+1])
之后需要初始化图形,执行bubble函数即可
完整代码如下
import turtle
import time
import random
#根据数值画柱状图
def block(pen,higth):
pen.fillcolor(random.random(),random.random(),random.random())
pen.begin_fill()
pen.left(90)
pen.forward(higth*10)
pen.write(higth)
pen.right(90)
pen.forward(50)
pen.right(90)
pen.forward(higth*10)
pen.right(90)
pen.forward(50)
pen.end_fill()
pen.right(180)
#冒泡算法
def bubble(li):
for i in range(len(li)-1):
for j in range(len(li)-1-i):
#显示小海龟,展示当前对比的元素,停顿2s后隐藏
pen[j].showturtle()
pen[j+1].showturtle()
time.sleep(2)
pen[j].hideturtle()
pen[j+1].hideturtle()
if li[j]>li[j+1]:
temp=li[j]
li[j]=li[j+1]
li[j+1]=temp
#清除原有
pen[j].clear()
pen[j+1].clear()
#绘制新的柱状图
block(pen[j],li[j])
block(pen[j+1],li[j+1])
#需要进行排序的列表
li=[5,2,3,7,9,1,6]
pen=list()
n=0
#将画笔对象装到pen中
for i in li:
n+=1
tem=turtle.Turtle()
pen.append(tem)
tem.hideturtle()
tem.penup()
#使每个画笔起始点不同,否则会重叠在一起
tem.goto(50*n,0)
#绘制初始图形
for i in range(len(li)):
block(pen[i],li[i])
bubble(li)
运行示例