PythonPygame赢了';t排序函数后重新绘制

PythonPygame赢了';t排序函数后重新绘制,python,pygame,draw,Python,Pygame,Draw,我正试图用python编写一个程序来绘制一些列,然后将它们从小到大排序。 绘图将与pygame模块一起完成 到目前为止,该计划仍在运作: 使用c键,将在列表中放置一组新的随机长度列。这在pygame窗口中立即可见。当您多次按c键时,窗口将显示新列,正如预期的那样 使用s键必须调用排序例程,排序后必须在pygame窗口上重新绘制列。此函数的重绘不会发生。 我试着放一些打印语句(现在代码中注释掉了)来跟踪发生的事情。这表明列表中的列的顺序确实在变化,因此存在某种排序。它只会在窗口上打印新的顺序 代码

我正试图用python编写一个程序来绘制一些列,然后将它们从小到大排序。 绘图将与pygame模块一起完成

到目前为止,该计划仍在运作: 使用c键,将在列表中放置一组新的随机长度列。这在pygame窗口中立即可见。当您多次按c键时,窗口将显示新列,正如预期的那样

使用s键必须调用排序例程,排序后必须在pygame窗口上重新绘制列。此函数的重绘不会发生。 我试着放一些打印语句(现在代码中注释掉了)来跟踪发生的事情。这表明列表中的列的顺序确实在变化,因此存在某种排序。它只会在窗口上打印新的顺序

代码如下:

import pygame
import math
import random
from queue import PriorityQueue

WIDTH = 800
WIN = pygame.display.set_mode((WIDTH, WIDTH))
pygame.display.set_caption("Sorting Columns")

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 255, 0)
WHITE = (255, 255, 255)
GREY = (128, 128, 128)
TURQUOISE = (64, 224, 208)

class Column:
    def __init__(self, col, HIGHT, WIDTH, total_cols):
        self.col = col
        self.hight = HIGHT
        self.x = col * WIDTH
        self.y = WIDTH
        self.color = TURQUOISE
        self.neighbors = []
        self.WIDTH = WIDTH
        self.total_cols = total_cols

    def get_pos(self):
        return self.col

    def get_hight(self):
        return self.HIGHT

    def is_open(self):
        return self.color == GREEN

    def make_newcolumn(self):
        self.color = TURQUOISE

    def make_sorted(self):
        self.color = BLUE

    def update_neighbors(self, grid):
        pass

    def draw(self, win):
        pygame.draw.rect(win, self.color, (self.x, 800-self.hight, self.WIDTH, 800))

    def __lt__(self, other):
        return False


def sort_columns(draw, COLS, grid):
    for i in range(COLS):
        #print(grid[i].hight)
        count = i + 1
        #print(count)
        #print(len(grid))
        #print(i)
        #print(COLS)
        #print(grid[(count)].hight)
        if count < len(grid):
            #print("\n\n\n")
            #print(grid[i].hight)
            #print(grid[count].hight)
            if grid[i].hight > grid[count].hight:
                #print(grid[i].hight)
                #print(grid[count].hight)
                temp1 = grid[i]
                grid[i] = grid[count]
                grid[count] = temp1
                #print(grid[i].hight)
                #print(grid[count].hight)
                #print("hello")
                count += 1
    for k in range(COLS):
        print(grid[k].hight)
            
    draw()

    return False
    


def make_cols(cols, WIDTH):
    columns = []
    gap = WIDTH // cols
    for i in range(cols):
        h = random.randrange(10, 790, 10)
        print(h)
        kolom = Column(i, h, gap, cols)
        columns.append(kolom)

    return columns


def draw_cols(win, cols, WIDTH):
    gap = WIDTH // cols
    for j in range(cols):
        pygame.draw.line(win, GREY, (j * gap, 0), (j * gap, WIDTH))


def draw(win, grid, cols, WIDTH):
    win.fill(WHITE)

    for Column in grid:
        Column.draw(win)

    draw_cols(win, cols, WIDTH)
    pygame.display.update()


def main(win, WIDTH):
    COLS = 5
    grid = make_cols(COLS, WIDTH)

    run = True
    while run:
        draw(win, grid, COLS, WIDTH)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    pass

                if event.key == pygame.K_c:
                    grid = make_cols(COLS, WIDTH)
                    draw(win, grid, COLS, WIDTH)

                if event.key == pygame.K_s:
                    print("\n")
                    sort_columns(lambda: draw(win, grid, COLS, WIDTH),COLS, grid)
                    draw(win, grid, COLS, WIDTH)

    pygame.quit()

main(WIN, WIDTH)
导入pygame
输入数学
随机输入
从队列导入优先级队列
宽度=800
WIN=pygame.display.set_模式((宽度,宽度))
pygame.display.set_标题(“排序列”)
红色=(255,0,0)
绿色=(0,255,0)
蓝色=(0,255,0)
白色=(255,255,255)
灰色=(128128128)
绿松石=(64224208)
类别栏:
定义初始值(自身、列、高、宽、总列):
self.col=col
self.hight=高
self.x=列*宽度
self.y=宽度
self.color=绿松石色
self.neights=[]
self.WIDTH=宽度
self.total\u cols=总计
def获取位置(自身):
返回self.col
def get_hight(自我):
回归自我高度
def打开(自身):
返回self.color==绿色
def make_newcolumn(自):
self.color=绿松石色
def使_排序(自):
self.color=蓝色
def更新_邻居(自身、网格):
通过
def抽签(自我,赢):
pygame.draw.rect(赢,self.color,(self.x,800-self.hight,self.WIDTH,800))
定义(自身、其他):
返回错误
def sort_列(绘图、列、网格):
对于范围内的i(COLS):
#打印(网格[i].高)
计数=i+1
#打印(计数)
#打印(透镜(网格))
#印刷品(一)
#打印(COLS)
#打印(网格[(计数)]。高)
如果计数grid[count].hight:
#打印(网格[i].高)
#打印(网格[计数].高)
temp1=网格[i]
网格[i]=网格[count]
网格[计数]=temp1
#打印(网格[i].高)
#打印(网格[计数].高)
#打印(“你好”)
计数+=1
对于范围内的k(COLS):
打印(网格[k]。高)
画()
返回错误
def make_cols(cols,宽度):
列=[]
间隙=宽度//cols
对于范围内的i(cols):
h=random.randrange(10790,10)
打印(h)
kolom=列(i,h,间隙,cols)
columns.append(kolom)
返回列
def draw_cols(赢、分、宽):
间隙=宽度//cols
对于范围内的j(cols):
pygame.draw.line(赢,灰色,(j*gap,0),(j*gap,宽度))
def绘图(win、grid、cols、宽度):
win.fill(白色)
对于网格中的柱:
列。平局(赢)
抽签(赢、分、宽)
pygame.display.update()
def主(win,宽度):
COLS=5
网格=制造列(列,宽度)
运行=真
运行时:
绘制(win、grid、COLS、WIDTH)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
通过
如果event.key==pygame.K_c:
网格=制造列(列,宽度)
绘制(win、grid、COLS、WIDTH)
如果event.key==pygame.K_:
打印(“\n”)
对列进行排序(lambda:draw(win、grid、COLS、WIDTH)、COLS、grid)
绘制(win、grid、COLS、WIDTH)
pygame.quit()
主(WIN,宽度)
通过主循环中的lambda函数调用draw函数。 有人能告诉我为什么这不起作用吗

另外,我很清楚排序功能还远没有准备好,我正在使用它。
如果图形将显示列列表的顺序,这将很有帮助,这样我就可以继续此操作。

您需要复制网格,而不是修改原始网格。此外,列表具有内置的排序功能,可以根据键对元素进行排序。您还尝试调用draw in排序功能。这不起作用,因为排序仅限于只要按住s键,y键就会发生

最后一件事,因为窗口是800像素,它离开屏幕,所以你看不见 整个专栏让事情看起来很奇怪

import pygame
import math
import random
from queue import PriorityQueue

WIDTH = 800
WIN = pygame.display.set_mode((WIDTH, WIDTH))
pygame.display.set_caption("Sorting Columns")

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 255, 0)
WHITE = (255, 255, 255)
GREY = (128, 128, 128)
TURQUOISE = (64, 224, 208)

class Column:
    def __init__(self, col, HIGHT, WIDTH, total_cols):
        self.col = col
        self.hight = HIGHT
        self.x = col * WIDTH
        self.y = WIDTH
        self.color = TURQUOISE
        self.neighbors = []
        self.WIDTH = WIDTH
        self.total_cols = total_cols

    def get_pos(self):
        return self.col

    def get_hight(self):
        return self.HIGHT

    def is_open(self):
        return self.color == GREEN

    def make_newcolumn(self):
        self.color = TURQUOISE

    def make_sorted(self):
        self.color = BLUE

    def update_neighbors(self, grid):
        pass

    def draw(self, win):
        pygame.draw.rect(win, self.color, (self.x, 800 - self.hight, self.WIDTH, 800))

    def __lt__(self, other):
        return False


def sort_columns(grid):
    grid.sort(key=lambda h: h.hight)
    return grid


def make_cols(cols, WIDTH):
    columns = []
    gap = WIDTH // cols
    for i in range(cols):
        h = random.randrange(10, 790, 10)
        kolom = Column(i, h, gap, cols)
        columns.append(kolom)

    return columns


def draw_cols(win, cols, WIDTH):
    gap = WIDTH // cols
    for j in range(cols):
        pygame.draw.line(win, GREY, (j * gap, 0), (j * gap, WIDTH))


def draw(win, grid, cols, WIDTH):

    for Column in grid:
        Column.draw(win)

    draw_cols(win, cols, WIDTH)
    pygame.display.update()


def main(win, WIDTH):
    COLS = 3
    grid = make_cols(COLS, WIDTH)
    grid_ = make_cols(COLS, WIDTH)
    run = True
    while run:
        win.fill(WHITE)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    pass

                if event.key == pygame.K_c:
                    grid_ = make_cols(COLS, WIDTH)

                if event.key == pygame.K_s:
                    gird = sort_columns(grid)
                    grid_ = grid
                    
        draw(win, grid_, COLS, WIDTH)
                

    pygame.quit()

main(WIN, WIDTH)
pygame.draw.rect(win,self.color,(self.x,800-self.hight,self.WIDTH,800))

您尚未更新x。即使在网格中对
s进行了排序,每个
也会在同一位置重新绘制