Как мне покрасить каждую ветку по-разному? Функция Python снежинки - PullRequest
0 голосов
/ 20 марта 2019

Вот мой код.Я не могу выбрать другой цвет для каждой ветви.Он просто выбирает случайно из списка, который я представил.

# 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 ]

1 голос
/ 20 марта 2019

Ваш текущий код всегда рисует ваши снежинки зеленым цветом, потому что ваши настройки цвета цикла запускаются до цикла, рисующего ветви снежинки.Если вы хотите выбрать цвет при рисовании, вам нужно объединить два цикла в один.

Вот простой способ, который даст каждой ветви отдельный цвет, повторяя, когда все они были использованы:

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

Это довольно детерминистично, хотя, он всегда будет проходить через список цветов в том порядке, в котором вы его написали. Вы можете смешать вещи, перетасовывая список для каждой снежинки, используя random.shuffle (высначала надо будет import random).Или есть много других вариантов, в зависимости от желаемого эффекта.Вы можете использовать random.choice, чтобы выбрать случайный цвет для каждой ветви, например.

0 голосов
/ 20 марта 2019

Вслед за прекрасным введением @ 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

...