我想制作插入分类整理器,整理工作但不能完成

问题描述 投票:0回答:1

就像标题说的那样,我想使用python和pygame创建可视化的插入排序。排序工作正常,但是要进行可视化处理则永远不会获得正确的输出。

排序效果很好,但是屏幕栏不会更改其位置。我还添加了一些颜色以更好地理解代码。

代码:-

import pygame
import random

pygame.init()
screen = pygame.display.set_mode((1000, 700))
pygame.display.set_caption("SORTING VISUALS")


class Rect:
    def __init__(self, x, y, width, height):
        self.X = x
        self.Y = y
        self.width = width
        self.height = height
        self.colour = BLACK

    def show(self):
        pygame.draw.rect(screen, self.colour, (self.X, self.Y, self.width, self.height))

    def changeCol(self, colour):
        self.colour = colour


WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
GRAY = (148, 0, 211)

L = []
rect = []
n = 100  # n belongs till [50,220]
WidthOfEachBar = 800 // (n + 1)


def array(n_):
    global L
    arr = [(3 * i) for i in range(1, n_ + 1)]
    for a in range(n_):
        random_no = random.choice(arr)
        L.append(random_no + 10)
        arr.remove(random_no)


array(n)

for i in range(n):
    x = (i + 1) * (1 + WidthOfEachBar)
    y = 680 - L[i]
    rect.append(Rect(x, y, WidthOfEachBar, L[i]))


# /*-------------------------------------- INSERTION SORT FUNCTION----------------------------------------------------*/
def equal(b):
    a = Rect(0, 0, 0, 0)
    a.X = b.X
    a.Y = b.Y
    a.width = b.width
    a.height = b.height
    a.colour = b.colour
    return a


def insertionsort():
    global rect, n
    for oo in range(n):
        print(rect[oo].height, end=" ")
    print()
    for i in range(1, n):
        print("outer loop")
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        rect[i].colour = GREEN
        key = rect[i]
        key.X = rect[i].X
        j = i - 1
        while j >= 0 and key.height < rect[j].height:
            for oo in range(n):
                print(rect[oo].height, end=" ")
            print()
            rect[j + 1] = rect[j]
            rect[j + 1].X = rect[j].X
            j = j - 1

        rect[j + 1] = key
        rect[j + 1].X = key.X

        screen.fill(WHITE)
        for a in range(n):
            rect[a].show()
        pygame.display.update()
        rect[j+1].colour = BLACK


sorted_insertion = False
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            break
    if not sorted_insertion:
        insertionsort()
        for oo in range(n):
            print(rect[oo].height, end=" ")
        print()
        print("came once")
        sorted_insertion = True
        for a in range(n):
            rect[a].show()
        pygame.display.update()

这里屏幕每次都更新,但我不明白问题所在。该代码非常可疑,我知道,但是任何帮助都将非常有用...

python pygame insertion-sort
1个回答
0
投票

您必须交换列表元素和.X属性,而不是在以下情况下分配:

rect[j + 1] = rect[j]rect[j + 1].X = rect[j].X

rect[j + 1], rect[j] = rect[j], rect[j + 1]
rect[j + 1].X, rect[j].X = rect[j].X, rect[j + 1].X 

功能insertionsort

def insertionsort():
    global rect, n
    for oo in range(n):
        print(rect[oo].height, end=" ")
    print()
    for i in range(1, n):
        print("outer loop")
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        rect[i].colour = GREEN
        key = rect[i]
        key.X = rect[i].X
        j = i - 1
        while j >= 0 and key.height < rect[j].height:
            for oo in range(n):
                print(rect[oo].height, end=" ")
            print()
            rect[j + 1], rect[j] = rect[j], rect[j + 1]
            rect[j + 1].X, rect[j].X = rect[j].X, rect[j + 1].X
            j = j - 1

        rect[j + 1], key = key, rect[j + 1]
        rect[j + 1].X, key.X = key.X, rect[j + 1].X

        screen.fill(WHITE)
        for a in range(n):
            rect[a].show()
        pygame.display.update()
        rect[j+1].colour = BLACK
© www.soinside.com 2019 - 2024. All rights reserved.