"""用python3的海龟画图模块制作的动态演示冒泡排序算法,作者:李兴球"""
from turtle import *
from random import randint
from time import sleep
class Column(Turtle):
def __init__(self,x):
Turtle.__init__(self,shape='square')
"""形状square的初始大小为20x20,所以半高就是10"""
self.up() #抬笔
r = randint(0,255)
g = randint(0,255)
b = randint(0,255)
self.fillcolor(r,g,b)
self.scale = randint(1,38) # 20 * self.scale 为柱子高度
self.setx(x)
self.__half__ = self.screen.window_height()//2 #屏幕的半高
self.shapesize(self.scale,1) #相对于自身坐标系前进的垂直方向放大
"""10*self.scale是柱子的半高,往下移屏幕半高,再抬高自身高一半加30,让所有柱子和屏幕底边对齐"""
self.sety(0- self.__half__ + 10*self.scale + 30)
if __name__=="__main__":
width,height=800,800
screen = Screen()
screen.colormode(255)
screen.setup(width,height)
screen.title("冒泡排序动态演示,作者:李兴球 2018/10/1")
screen.delay(0)
xcors = [x for x in range(40-width//2,width//2-20,40) ]
columns = [Column(x) for x in xcors ] #生成所有柱子
length = len(columns)
while True:
排序了吗 = False #描述是否交换了数据的标志
for i in range(0,length-1 ): #由于越往后,越不要排这么多次数了.
c1 = columns[i] #代表前面柱子
c2 = columns[i + 1] #代表后面柱子
if c1.scale > c2.scale: #如果前面的柱子更高,则交换位置
x1 = c1.xcor() #保留前面柱子c1的x坐标
x2 = c2.xcor() #保留后面柱子c2的x坐标
columns[i] = c2 #让前面的柱子赋值为后面柱子
columns[i+1] = c1 #让后面的柱子赋值为前面柱子
columns[i].setx(x1) #交换列表中项目后,重新设置x坐标
columns[i+1].setx(x2) #交换列表中项目后,重新设置x坐标
排序了吗 = True
screen.update()
sleep(0.1)
length = length - 1
if 排序了吗 == False:break #如果一次都没有排序,则退出while循环