Я пытаюсь заставить лепестки вращаться от оранжевого к желтому и обратно к оранжевому в цикле, но они всегда заканчиваются четвертым лепестком черного цвета?

Вопрос или проблема

Я выполняю задание по использованию черепашки для создания лепестков подсолнуха с помощью пятиугольников. Все вроде как должно быть, за исключением цвета лепестков. В условии строго указано, что цвета этих пятиугольников должны чередоваться: “оранжевый, желтый, оранжевый, желтый”, и это должно повторяться. Для этого мы должны использовать функции, и поскольку я в основном новичок в информатике, у меня возникают проблемы с тем, чтобы найти причину, по которой четвертый лепесток подсолнуха в каждом тестовом запуске оказывается черным вместо желтого.

Я пытался определить термин “желтый” как “tur.pencolor(‘yellow’)” (tur — это имя черепашки в моей программе), но это просто ничего не изменило. На данном этапе, с моими ограниченными знаниями в этой области, я в замешательстве и ищу помощь, чтобы кто-то мне помог разобраться с этой функциональной ситуацией!

Вот мой код на данный момент:

import turtle
# Определяем функцию draw_petal

def draw_petal(tur, speed, n_sided, radius):
    """
    Рисует лепесток подсолнуха с помощью графики черепашки.

    Параметры:
    - tur (turtle.Turtle): Объект черепашки, используемый для рисования.
    - speed (int): Скорость рисования черепашки. Принимает стандартные значения скорости черепашки.
    - n_sided (int): Количество сторон лепестка, определяющее его форму.
    - radius (float): Радиус лепестка, измеряемый от центра до любой вершины.

    Функция рисует лепесток как многоугольник с n сторон с заданным радиусом. Форма лепестка 
    определяется количеством сторон (n_sided), а его размер — радиусом.

    Примечание: Черепашка начнет рисовать с текущей позиции и направления.
    """
    # TODO: Уберите pass и добавьте свой код ниже
    angle = 360 / n_sided

    for i in range(n_sided):
        tur.forward(radius)
        tur.left(angle)

# Определяем функцию draw_sunflower
def draw_sunflower(tur, speed, n_sided, radius, num_petal):
    """
    Рисует подсолнух с помощью графики черепашки.

    Параметры:
    - tur (turtle.Turtle): Объект черепашки, используемый для рисования.
    - speed (int): Скорость рисования черепашки. Принимает стандартные значения скорости черепашки.
    - n_sided (int): Количество сторон каждого лепестка, определяющее форму лепестка.
    - radius (float): Радиус каждого лепестка, измеряемый от центра до любой вершины.
    - num_petal (int): Общее количество лепестков, которые нужно нарисовать для подсолнуха.

    Функция будет чередовать цвета лепестков между 'оранжевым' и 'желтым'. Угол направления и текущий
    цвет каждого лепестка выводятся в консоль в процессе рисования для диагностических целей.

    Примечание: Эта функция предполагает, что вспомогательная функция `draw_petal` определена где-то еще для рисования отдельных лепестков.
    """
    # TODO: Уберите pass и добавьте свой код ниже
    tur.speed(speed)
    angle_increment = 360 / num_petal
    c = tur.color()

    for i in range(num_petal):
        draw_petal(tur, speed, n_sided, radius)
        if(i % 2 == 0):
            tur.color("yellow")
        if(i % 2 == 1):
            tur.color("orange")
        # Диагностический вывод
        print(f"Текущий цвет: {c}, угол направления {tur.heading()} градусов")

        tur.left(angle_increment)

# Определите функцию main() для рисования подсолнухов с помощью графики черепашки.
#
# Эта функция настраивает окружение черепашки и запрашивает у пользователя 
# ввод для рисования подсолнуха. Пользователь может выбрать скорость 
# анимации, количество сторон для лепестка, радиус лепестков и 
# общее количество лепестков.
#
# После рисования подсолнуха на основе ввода пользователя программа 
# спрашивает, хочет ли пользователь нарисовать еще один подсолнух. Если 
# пользователь вводит "да", экран будет очищен, и пользователя 
# попросят ввести новые значения. Если пользователь вводит "нет", 
# отображается сообщение с предложением пользователю щелкнуть по окну для выхода.
#
# Если пользователь вводит любую другую команду, выводится сообщение об ошибке, 
# и пользователю снова задают вопрос.
#
# Функция завершает работу, ожидая, пока пользователь щелкнет по окну черепашки, 
# после чего окно закроется, и программа завершится.

def main():
    screen = turtle.Screen()
    screen.title("Рисование подсолнуха")

    tur = turtle.Turtle()

    while True:
        # Ввод пользователя
        speed = int(input("Введите скорость анимации: "))
        n_sided = int(input("Введите количество сторон лепестка: "))
        radius = float(input("Введите радиус лепестков: "))
        num_petal = int(input("Введите количество лепестков: "))

        # Рисуем подсолнух
        draw_sunflower(tur, speed, n_sided, radius, num_petal)

        # Спрашиваем, хочет ли пользователь нарисовать еще один подсолнух
        response = input("Нарисовать другой подсолнух?" )

        if response == "да":
            tur.clear()
            tur.penup()
            tur.home()
            tur.pendown()
        elif response == "нет":
            tur.penup()
            tur.goto(0, -200)
            tur.write("Щелкните по окну для выхода...", align="right", font=("Courier", 12, "normal"))
            break
            turtle.exitonclick()
        else:
            print("Неверная команда! Пожалуйста, попробуйте снова…")

    screen.mainloop()

# Запускаем программу
if __name__ == "__main__":
    main()

# turtle.exitonclick()

Вам просто нужно подумать о порядке выполнения действий – он последовательный, если не указано иное.

Убедитесь, что вы задаете цвет ПЕРЕД использованием его для рисования лепестка.

Убедитесь, что вы обновляете c каждый раз, когда цвет меняется, иначе вы просто получите “черный”.

def draw_sunflower(tur, speed, n_sided, radius, num_petal):
    tur.speed(speed)
    angle_increment = 360 / num_petal

    for i in range(num_petal):
        if(i % 2 == 0):
            tur.color("yellow")
        if(i % 2 == 1):
            tur.color("orange")
        draw_petal(tur, speed, n_sided, radius)           # <=== ТЕПЕРЬ ВЫ МОЖЕТЕ НАРИСОВАТЬ СВОЙ ЛЕПЕСТОК!
        # Диагностический вывод
        c = tur.color()                                   # <=== ОБНОВИТЕ ЭТО ПЕРЕД ВЫВОДОМ
        print(f"Текущий цвет: {c}, угол направления {tur.heading()} градусов")

        tur.left(angle_increment)

Я не могу воспроизвести, просто нарисовав 4 лепестка, однако я заметил, что “последний” лепесток, о котором вы говорите, оказывается черным каждый раз, потому что вы не меняете цвет кисти до того, как нарисуете лепесток здесь:

draw_petal(tur, speed, n_sided, radius)
if(i % 2 == 0):
    tur.color("yellow")
if(i % 2 == 1):
    tur.color("orange")

Вместо этого вы хотите сначала определить цвет для рисования лепестка, а затем нарисовать его так:

if (i % 2): # == 1 истинно, == 0 ложно -> иначе
    tur.color("orange")
else:
    tur.color("yellow")
draw_petal(tur, speed, n_sided, radius)

Я также обновил условие, так как вы в основном проверяли только на четность (нечетные/четные). То, что вы сделали, не было неправильным, но это можно было записать немного элегантнее. При проверке остатка от деления значения на 2 вы всегда получите 1 или 0, так что вы можете использовать if/else вместо двух if, это также избавляет вас от необходимости проверять остаток дважды для каждого случая.
Когда вы делите на 2, если вы получаете 1, у вас нечетное число, но 1 также соответствует true, что здесь соответствует оранжевому. В противном случае у вас будет четное число и оно будет соответствовать 0 или false, поэтому вы можете использовать else.

ИЗМЕНЕНИЕ: Как указывает lastchance в своем ответе, поскольку вы выводите цвет, вам нужно будет обновить значение c с новым цветом, чтобы оно не было устаревшим/неправильным, когда вы выводите его значение.

Ответ или решение

Кажется, у вас возникла проблема с тем, что цвет четвертой лепестка оказывается черным вместо желтого, как вы и предусмотрели. Давайте разберемся в вашей логике кода и предложим решение.

Проблема в коде

В вашем коде порядок выполнения команд имеет значение. Вы сначала рисуете лепесток, а затем устанавливаете его цвет, что приводит к тому, что потусторонние артефакты (по умолчанию черный цвет) отображаются на последнем лепестке. Также, когда вы вызываете функцию tur.color() для получения текущего цвета, вы не обновляете значение перед его выводом.

Решение

Чтобы исправить эту ошибку, вам нужно сначала установить цвет, а затем рисовать лепесток. Вы также можете оптимизировать проверку на четность, используя конструкцию if-else. Вот исправленная версия вашего кода:

def draw_sunflower(tur, speed, n_sided, radius, num_petal):
    tur.speed(speed)
    angle_increment = 360 / num_petal

    for i in range(num_petal):
        # Устанавливаем цвет в зависимости от индекса лепестка
        if i % 2 == 0:
            tur.color("yellow")
        else:
            tur.color("orange")

        # Рисуем лепесток с установленным цветом
        draw_petal(tur, speed, n_sided, radius)

        # Обновляем цвет перед выводом
        c = tur.color()
        print(f"Текущий цвет: {c}, угол поворота {tur.heading()} градусов")

        tur.left(angle_increment)

Разъяснения коду

  1. Цвет перед рисованием: Вы устанавливаете цвет перед тем, как рисовать лепесток. Это предотвращает появление черного цвета, так как именно этот цвет используется, когда вы не меняете цвет явно.

  2. Оптимизированная проверка: Вместо использования двух отдельных условий для определения цвета лепестка, мы используем if-else, что делает код более читаемым и эффективным.

  3. Обновление цвета: Теперь система обновляет значение переменной c до вывода, что гарантирует корректность информации в терминале.

С этими исправлениями ваш код должен корректно отображать цвет лепестков, как вы задумали, чередуя "желтый" и "оранжевый".

Если у вас будут дополнительные вопросы или понадобятся разъяснения, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...