使用pygame實現視覺化氣泡排序

2021-09-22 21:21:11 字數 4092 閱讀 4749

視覺化氣泡排序,使用pygame實現動畫演示,**很簡單,大概100行多一點,適合向我一樣的新手用於練手的小專案

**已經進行了詳細的注釋

環境: python3.7.3 + pychram

import pygame

from random import randint

gap = 10 #豎條的間隔

width = 30 #豎條的寬度

screensize = (600, 250) #顯示螢幕的尺寸

barxposition = #豎條在座標軸的位置

bars = #豎條物件列表

#生成顏色

class color(object):

@staticmethod

def randomcolor():

r,g,b = randint(0,225),randint(0,255),randint(0,255)

return (r,g,b)

@staticmethod

def calculatecolor(self,num):

pass

class bar(object):

def __init__(self, n,num,screen,width = 30):

self.n = n

self.locationx = barxposition[n]

self.locationy = screensize[1]-50-num

self.num = num

self.color = color.randomcolor()

self.width = width

self.font = pygame.font.font(none, 20)

self.screen = screen

#繪製豎條及其上方的數字

def bardraw(self):

pygame.draw.rect(self.screen, self.color,

((self.locationx,self.locationy), (self.width, self.num)))

self.txt = self.font.render("{}".format(self.num), true, self.color)

self.screen.blit(self.txt, (self.locationx+5,self.locationy-20))

#移動豎條,flag是用於判斷移動方向 true向右 false向左

def move(self,flag):

pace = 2 #移動的步長

#消除移動前的豎條

pygame.draw.rect(self.screen, (255, 255, 235),

((self.locationx, self.locationy), (self.width, self.num)))

if flag:

self.locationx += pace

else:

self.locationx -= pace

# 繪製移動後的豎條

pygame.draw.rect(self.screen, self.color,

((self.locationx , self.locationy), (self.width, self.num)))

#交換相鄰兩個豎條

def changelocation(self,otherball):

#清除當前位置影象與文字

pygame.draw.rect(self.screen, (255, 255, 235),

((self.locationx, self.locationy-20), (self.width, self.num+20)))

pygame.draw.rect(otherball.screen, (255, 255, 235),

((otherball.locationx, otherball.locationy - 20), (otherball.width, otherball.num + 20)))

#豎條移動的動畫

for n in range(20):

self.move(true)

otherball.move(false)

pygame.time.delay(40)

pygame.display.flip()

#移動後,重新寫上豎條對應的數字

self.screen.blit(self.txt, (self.locationx + 5, self.locationy - 20))

otherball.screen.blit(otherball.txt, (otherball.locationx + 5, otherball.locationy - 20))

#交換豎條物件在列表的位置,同時交換排位數字

bars[self.n],bars[otherball.n] = bars[otherball.n],bars[self.n]

self.n,otherball.n = otherball.n,self.n

pygame.display.flip()

pygame.time.delay(200) #此延時控制排序動畫的快慢

#氣泡排序

def algorithm(nums):

for i in range(len(nums) - 1):

for j in range(len(nums) - 1 - i):

if nums[j] > nums[j + 1]:

bars[j].changelocation(bars[j + 1])

nums[j], nums[j + 1] = nums[j + 1], nums[j]

#計算十二個豎條在軸上的位置

def barx(gap,width,barxs):

for n in range(12):

barx = 50 + gap + (gap + width) * n

def main():

nums =

pygame.init()

screen = pygame.display.set_mode(screensize)

pygame.display.set_caption("演算法") #標題

screen.fill((255, 255, 235)) #背景色

barx(gap,width,barxposition) #計算bar位置並存於barxs

pygame.draw.aaline(screen,(0,255,0),(50,screensize[1]-50),

(screensize[0]-50,screensize[1]-50)) #繪製座標軸

pygame.display.flip()

#生成十二個豎條並繪製

for n in range(12):

num = randint(20,160)

tempbar = bar(n,num,screen)

tempbar.bardraw()

pygame.time.delay(50) #此處延時是為了開始時演示動畫效果

pygame.display.flip()

algorithm(nums) #排序

#等待關閉視窗事件

run = true

while run:

for event in pygame.event.get():

if event.type == pygame.quit:

run = false

if __name__ == "__main__":

main()

**已經上傳到gayhub(傳送門:感覺還行的兄弟,麻煩給個star吧

cv2實現氣泡排序視覺化

之前在網上看到別人用opencv,pygame實現多種排序演算法的視覺化,十分有趣。參考文章 python實現排序演算法過程的視覺化 便通過氣泡排序進行嘗試,簡化了程式,主要嘗試opencv視覺化資料排序過程。import numpy as np import os import cv2 class...

資料視覺化 R語言實現網路視覺化

最近在學習貝葉斯網路,當用k2演算法建立了貝葉斯網路結構之後,用r語言工具可以很清楚地實現網路視覺化。例如,在鐵達尼號資料集中,最後生成的貝葉斯網路結構如下 age,portembarked,numparentschildren,age numparentschildren,passengercla...

pyecharts實現資料視覺化

本文講述了乙個非常炫酷的視覺化工具以及本萌新試驗中遇到的問題和解決方法。git clone cd pyecharts pip install r requirements.txt python setup.py install import sys from pyecharts.charts imp...