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