Создание игры смешивания цветов: если вы нажмете красный и желтый, какую команду можно использовать, чтобы цвет стал оранжевым? - PullRequest
1 голос
/ 06 апреля 2020

Я использую python с черепахой, и у меня нарисованы 3 трубы для краски: красная, желтая и синяя. В каждой пробирке есть кнопка, которую вы нажимаете, и чаша под ней меняет цвет, как будто вы «смешиваете» цвета. Я уже щелкнул красным, и чаша стала красной (вместе с другими цветами), но теперь мне нужна какая-то команда или утверждение, чтобы, если вы нажмете на красную трубку, а затем нажмете на желтую трубку, чаша станет оранжевой. Я понятия не имею, где go по этому поводу, у каждой из 3 трубок есть своя черепаха.

У меня есть функции, чтобы сделать чашу красной, желтой и красной. У меня также есть функция для того, чтобы сделать миску оранжевой. НО, если бы на самом деле была команда, которую я не знаю о том, где можно смешивать цвета, или команда «если нажал», я бы использовал это.

Пожалуйста, помогите! Крайний срок: 25 апреля

Пример одной из моих функций:

def redColor(x, y):
  red.hideturtle()
  red.tracer(0,0)
  red.seth(0)
  red.goto(-140,-80)
  red.pd()
  red.fillcolor('red')

  red.begin_fill()
  red.pensize(1)
  red.fd(280)
  red.rt(135)
  red.fd(66)
  red.rt(45)
  red.fd(190)
  red.rt(45)
  red.fd(66)
  red.end_fill()
  red.update()

Пример команд нажатия на экране:

red.onclick(redColor)
ylw.onclick(ylwColor)
blue.onclick(blueColor) 

1 Ответ

1 голос
/ 07 апреля 2020

Внутренне Python представляет цвет с использованием RGB цветовой модели : для каждого цвета сохраняется интенсивность R ed, G reen и B lue компонент. Это позволяет 256 возможных значений для каждого компонента (от 0 до 255), таким образом, 256 оттенков красного, 256 оттенков зеленого и 256 оттенков синего. Это позволяет комбинировать 256 * 256 * 256 = ~ 16 миллионов цветов.

Вы можете попробовать этот онлайн RGB-микшер (ссылка взята с сайта Википедии), чтобы почувствовать эту цветовую модель.

Например, (255,0, 0) будет максимальная интенсивность красного, без зеленого и синего, так что это дает вам полный красный цвет. Принимая во внимание, что (255 255,0) - это максимальная интенсивность красного и зеленого без синего, в результате чего получается желтый цвет.

Чтобы смешать два таких цвета RGB, вы можете просто взять среднее значение для каждого компонента. Таким образом, при смешивании полностью красного (255,0,0) с желтым (255,255,0) среднее значение красных компонентов будет (255 + 255) / 2 = 255, среднее значение зеленых компонентов будет (0 + 255 ) / 2 = ~ 128 и среднее значение синих компонентов будет (0 + 0) / 2 = 0.

Существует также альтернативное представление, где интенсивность каждого компонента представлена ​​в виде значения между 0,0 и 1,0 вместо 0 до 255. Таким образом, в этом представлении полный красный будет (1,0, 0,0, 0,0), а желтый будет (1,0, 1,0, 0,0). Тогда оранжевый снова будет средним для каждого компонента, то есть (1,0, 0,5, 0,0). На самом деле не имеет значения, какой из них вы используете, но в нашем случае представление 0,0-1,0 проще, потому что нам не нужно беспокоиться о округлении при взятии среднего.

Чтобы использовать это с вашими черепахами, вы необходимо сделать два шага:

  • Переключить экран для использования цветового представления 0.0-1.0 с помощью screen.colormode(1.0) ( reference ).
  • Установить цвет ваша черепаха с fillcolor((1.0,0.0,0.0)) вместо fillcolor('red'). Когда вы звоните fillcolor() на свою черепаху, она даст вам представление RGB ( ссылка ).

Соберите все вместе:

import turtle

# Use the 0.0-1.0 color model instead of the 0-255 one
screen = turtle.Screen()
screen.colormode(1.0)

red_turtle = turtle.Turtle()
red_turtle.fillcolor((1.0, 0.0, 0.0))

yellow_turtle = turtle.Turtle()
yellow_turtle.fillcolor((1.0, 1.0, 0.0))

# Get the RGB values of the red and yellow turtle
r1,g1,b1 = red_turtle.fillcolor()
r2,g2,b2 = yellow_turtle.fillcolor()

# Take the average of each component, resulting in orange
r3 = (r1 + r2) / 2.0
g3 = (g1 + g2) / 2.0
b3 = (b1 + b2) / 2.0

orange_turtle = turtle.Turtle()
orange_turtle.fillcolor((r3, g3, b3))

turtle.done()
...