<p>正如我在评论中所说,每次调用函数时都会生成不同的颜色,而闪烁问题可能是由于调用太频繁而导致的。您可以通过将<code>rand_color</code>设为全局变量并在函数调用之前在函数外部定义它的值来解决这个问题。在</p>
<p>然而,我认为<a href="https://stackoverflow.com/a/31486997/355230">John Rodger's answer</a>中使用类的思想是一个好主意,但它的实现方式不同,并试图利用面向对象编程而不是重新发明整个轮子。下面是我的意思的一个可运行的例子。每次运行它时,它都会生成一个随机着色的矩形来表示一个<code>Thing</code>对象,并且这个颜色不会随着显示器的更新而改变或闪烁。在</p>
<pre><code>import pygame, sys
from pygame.locals import *
import random
FPS = 30 # frames per second
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
class Thing(pygame.Rect):
def __init__(self, *args, **kwargs):
super(Thing, self).__init__(*args, **kwargs) # init Rect base class
# define additional attributes
self.color = tuple(random.randrange(0, 256) for _ in range(3))
self.x_speed, self.y_speed = 5, 5 # how fast it moves
def draw(self, surface, width=0):
pygame.draw.rect(surface, self.color, self, width)
def main():
pygame.init()
fpsclock = pygame.time.Clock()
pygame.key.set_repeat(250) # enable keyboard repeat for held down keys
gameDisplay = pygame.display.set_mode((500,400), 0,32)
gameDisplay.fill(WHITE)
thingx,thingy, thingw,thingh = 200,150, 100,50
thing = Thing(thingx, thingy, thingw, thingh) # create an instance
while True: # display update loop
gameDisplay.fill(WHITE)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_DOWN:
thing.y += thing.y_speed
elif event.key == K_UP:
thing.y -= thing.y_speed
elif event.key == K_RIGHT:
thing.x += thing.x_speed
elif event.key == K_LEFT:
thing.x -= thing.x_speed
thing.draw(gameDisplay) # display at current position
pygame.display.update()
fpsclock.tick(FPS)
main()
</code></pre>