我怎样才能使蛇的颜色按照彩虹的颜色顺序变化?
def draw_snake(self, window):
colorList = ["Red", "Orange", "Yellow", "Green", "Cyan", "Blue", "Purple"]
for randomNumber in range(0,7):
snakeColor = colorList[randomNumber]
for segment in self.body:
pygame.draw.rect(window, pygame.Color(snakeColor), pygame.Rect(segment[0], segment[1], 9, 9))
答案 0 :(得分:0)
您需要更改迭代器的“ randomNumber”。当您到达列表的末尾时,将其重新设置为0。它将从您的第一种颜色更改为最后一种颜色,然后将其返回到第一种颜色,只是将颜色按彩虹的顺序排列。>
答案 1 :(得分:0)
由于draw_snake
似乎是类的一种方法,因此我建议为类实例添加一些属性,以使颜色选择更加容易。添加您的__init__
方法:
self.colortimer = 0
self.colorList = ["Red", "Orange", "Yellow", "Green", "Cyan", "Blue", "Purple"]
self.itercolors = iter(self.colorList) #makes an iterator from the colorList
如果还没有时间,您需要pygame.time.Clock来跟踪时间。
在pygame主循环之前 创建它:
clock = pygame.time.Clock()
记住,在主循环中要调用:
clock.tick()
更新时钟。您只需要在循环中调用一次即可。它将计算自上次调用以来经过了几毫秒。
现在draw_snake
方法可以用以下方式重写:
def draw_snake(self, window):
self.colortimer += clock.get_time()
if self.colortimer > COLORDURATION: #in milliseconds
self.colortimer = 0
#here we set the color to the next element from the iterator.
#if the iterator is exausted, we catch the StopIteration exception
#to recreate it and start again.
try:
self.snakeColor = next(self.itercolors)
except StopIteration:
self.itercolors = iter(self.colorList)
self.snakeColor = next(self.itercolors)
for segment in self.body:
pygame.draw.rect(window, pygame.Color(self.snakeColor), pygame.Rect(segment[0], segment[1], 9, 9))
COLORDURATION
是您需要在全局范围内定义的常量(也可以根据需要将其设为class属性)。这是颜色更改为下一个颜色之前必须经过的时间(以毫秒为单位)。例如,COLORDURATION = 1000
如果要每秒更改颜色。
注意:我在这里假设draw_snake
在每个主循环迭代中被调用一次(多次调用或少于一次调用是没有意义的。)
您可以import itertools
并使用itertools.cycle
来简化上面的代码。使用:
self.itercolors = itertools.cycle(self.colorList)
代替:
self.itercolors = iter(self.colorList)
和draw_snake
变为:
def draw_snake(self, window):
self.colortimer += clock.get_time()
if timer > COLORDURATION: #in milliseconds
self.snakeColor = next(self.itercolors)
for segment in self.body:
pygame.draw.rect(window, pygame.Color(self.snakeColor), pygame.Rect(segment[0], segment[1], 9, 9))