以彩虹的顺序改变蛇的颜色

时间:2019-07-19 20:29:35

标签: python python-3.x pygame

我怎样才能使蛇的颜色按照彩虹的颜色顺序变化?

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))

2 个答案:

答案 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在每个主循环迭代中被调用一次(多次调用或少于一次调用是没有意义的。)

在@Justin Ezequiel的评论后进行编辑:

您可以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))