Вслед за прекрасным введением @ 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](https://i.stack.imgur.com/bN1NY.png)