为什么 pygame.draw.rect 会无限重绘矩形?

Why is pygame.draw.rect infinitely re-drawing rectangles?

我有这个 pygame 代码,我希望它为宝石闪电战风格的游戏绘制一块矩形板。这就是我所拥有的,当您 运行 它时,它会无限更新屏幕上的垃圾邮件新矩形。

import pygame as pg
import sys, random
pg.init()
clock = pg.time.Clock()
cell_size = 40
cell_num = 20
disp = pg.display.set_mode((cell_size * cell_num, cell_size * cell_num))
bg = pg.Surface((cell_size * cell_num, cell_size * cell_num))
bg.fill('white')
gold = pg.Color(221, 238, 81)
sea_foam = pg.Color(81, 238, 143)
pink = pg.Color(238, 145, 251)
gr33n = pg.Color(0, 255, 35)
blu = pg.Color(0, 236, 255)
colors_list = [gold, sea_foam, pink, gr33n, blu]

class Board:
  def __init__(self):
    self.x = [0, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600, 640, 680, 720, 760, 800]
    self.y = [0, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600, 640, 680, 720, 760, 800]

def drawBoard(self):
    for i in range(0,21):
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[0], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[1], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[2], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[3], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[4], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[5], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[6], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[7], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[8], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[9], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[10], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[11], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[12], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[13], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[14], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[15], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[16], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[17], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[18], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[19], cell_size, cell_size))
        pg.draw.rect(disp, random.choice(colors_list), (self.x[i], self.y[20], cell_size, cell_size))


game = Board()
while True:

for event in pg.event.get():

    if event.type == pg.QUIT:
        pg.quit()
        sys.exit()

disp.blit(bg,(0,0))
game.drawBoard()
pg.display.update()
clock.tick(60)

试试这个:

n = 1
game = Board()
while True:

for event in pg.event.get():

    if event.type == pg.QUIT:
        pg.quit()
        sys.exit()
   
    clock.tick(60)

    while n == 1:      
        disp.blit(bg,(0,0))
        game.drawBoard()
        pg.display.update()
        n -= 1



你每一帧都在生成新的颜色。您需要在开始时为每颗宝石生成一次颜色,然后使用它们绘制矩形。

class Board:
    def __init__(self):
        self.x = [0, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600, 640, 680, 720, 760, 800]
        self.y = [0, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600, 640, 680, 720, 760, 800]
        self.size = (21, 20)
        #generate random color for every posible jewel on screen once
        self.colors= [random.choice(colors_list) for i in range(self.size[0] * self.size[1])] 

    def drawBoard(self):
        #go through every jwell position on board and draw them. 
        for x in range(self.size[0]):
            for y in range(self.size[1]):
                pg.draw.rect(disp, self.colors[y * self.size[0] + x], (self.x[x], self.y[y], cell_size, cell_size))