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

时间:2019-03-20 14:10:18

标签: python turtle-graphics

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

# 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可以完成的所有操作。我不知道是否有一种方法可以做多色。我会分别做每个分支,但整个目标是使用一个函数。我似乎无法弄清楚如何将多种颜色合并到一个函数中。

2 个答案:

答案 0 :(得分:1)

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

这里采用简单的方式,它将为每个分支赋予单独的颜色,并在使用完所有分支后重复:

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

尽管这是确定性的,但它始终会按照您写入的顺序遍历颜色列表。您可以使用random.shuffle通过对每个雪花的列表进行混洗来混合处理(您需要{ {1}})。或者还有很多其他选项,取决于您想要的效果。例如,您可以使用import random为每个分支选择随机颜色。

答案 1 :(得分:0)

在@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)循环结构是允许flag进入False(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()

enter image description here