如何为每个分支着色不同? Python 雪花函数

How do I color each branch differently? Python snowflake function

这是我的代码。我似乎无法为每个分支选择不同的颜色。它只是从我提供的列表中随机选择。

# Multi-color Snowflake Turtle

import turtle

# Assign a name to your turtle
snow = turtle.Turtle()
snow.shape("turtle")

colors = ["blue", "red", "yellow", "green"]

# Declare the function, snowflake
def snowflake(size, pensize, x, y):
    # turtle.pen(pensize=10)
    snow.penup()
    snow.goto(x, y)
    snow.forward(10*size)
    snow.left(45)
    snow.pendown()
    for color in colors:
        snow.color(color)

    for i in range(8):
        branch(size)
        snow.left(45)

# Create the branches
def branch(size):
    for i in range(3):
        for i in range(3):
            snow.forward(10.0*size/3)
            snow.backward(10.0*size/3)
            snow.right(45)
        snow.left(90)
        snow.backward(10.0*size/3)
        snow.left(45)
    snow.right(90)
    snow.forward(10.0*size)


snowflake(8, 6, 0, 0)

我仍然不熟悉 Python 可以做的所有不同事情。我不知道是否有办法进行多色。我会分别做每个分支,但整个目标是使用一个函数。我似乎无法弄清楚如何将多种颜色合并到一个函数中。

您当前的代码始终以绿色绘制雪花,因为您的循环设置颜色在循环绘制雪花分支之前运行。如果您想在绘制时选择颜色,则需要将两个循环合并为一个。

这是一个简单的方法,它会给每个分支一个单独的颜色,当它们都被使用时重复:

for i in range(8):
    snow.color(colors[i%4])
    branch(size)
    snow.left(45)

虽然这是相当确定的,但它始终会按照您写入的顺序遍历颜色列表。您可以通过使用 random.shuffle(您需要先到 import random)。或者还有很多其他选项,具体取决于您想要的效果。例如,您可以使用 random.choice 为每个分支选择随机颜色。

跟进@Blckknght 对这个问题的出色介绍 (+1),这比人们想象的要复杂得多。如果我们使用模数 (%) 方法,即使我们打乱颜色,我们也会得到重复的图案,例如第一个和第五个分支总是相同的颜色,不管是什么颜色,等等。

颜色的数量少于分支的数量,我们真正想要的是随机的,我们不希望相邻的分支是相同的颜色。最后一个标准看起来很简单,直到我们意识到我们不希望最终分支的颜色与我们返回时的第一个分支相同!所以,我们可能会尝试这样的事情:

first_color = random.choice(colors)
snow.pencolor(first_color)

for flag in range(-6, 2):

    branch(distance)
    snow.left(45)

    new_color = old_color = snow.pencolor()

    while new_color == old_color or (not flag and new_color == first_color):
        new_color = random.choice(colors)

    snow.pencolor(new_color)

奇怪的 range(-6, 2) 循环构造允许 flagFalse (0) 只有一次迭代,我们需要确保第一个和最后一个分支不颜色搭配。完整代码:

# Multi-color Snowflake Turtle

from turtle import Screen, Turtle
from random import choice

COLORS = ["blue", "red", "yellow", "green"]

# Declare the function, snowflake
def snowflake(size, pensize, x, y):
    snow.width(pensize)

    distance = 10 * size

    snow.penup()
    snow.goto(x, y)
    snow.forward(distance)
    snow.left(45)
    snow.pendown()

    first_color = choice(COLORS)
    snow.pencolor(first_color)

    for flag in range(-6, 2):

        branch(distance)
        snow.left(45)

        new_color = old_color = snow.pencolor()

        while new_color == old_color or (not flag and new_color == first_color):
            new_color = choice(COLORS)

        snow.pencolor(new_color)

    snow.hideturtle()

# Create the branches
def branch(distance):

    for _ in range(3):
        for _ in range(3):
            snow.forward(distance / 3)
            snow.backward(distance / 3)
            snow.right(45)
        snow.left(90)
        snow.backward(distance / 3)
        snow.left(45)

    snow.right(90)
    snow.penup()
    snow.forward(distance)
    snow.pendown()

# Assign a name to your turtle
snow = Turtle("turtle")

screen = Screen()

snowflake(8, 6, 0, 0)

screen.exitonclick()