20. Semafor

from pygame import *

CIERNA = Color(0, 0, 0)
BIELA = Color(255, 255, 255)

ZELENA = Color(0, 255, 0)
CERVENA = Color(255, 0, 0)
ORANZOVA = Color(255, 255, 0)

okno = display.set_mode([1200, 900])

X = 500
Y = 100
SIRKA = 400
VYSKA = int(SIRKA * 1.5)
POLOMER = SIRKA // 6

# Nakreslíme semafór
okno.fill(BIELA)
# Okraj
draw.rect(okno, CIERNA, Rect([X, Y], [SIRKA, VYSKA]), 1)
# Horné červené svetlo
draw.circle(okno, CERVENA, [X + SIRKA // 2, Y + SIRKA // 4], POLOMER)
# Stredné oranžové svetlo
draw.circle(okno, ORANZOVA, [X + SIRKA // 2, Y + SIRKA // 2 + SIRKA // 4], POLOMER)
# Dolné zelené svetlo
draw.circle(okno, ZELENA, [X + SIRKA // 2, Y + 2 * (SIRKA // 2) + SIRKA // 4], POLOMER)

while True:
    udalost = event.poll()
    if udalost.type == MOUSEBUTTONDOWN and udalost.button == 1:
        # Po stalčení ľavého tlačidla myši zistíme vzdialenosť od
        # horného červeného svetla
        vzX = udalost.pos[0] - (X + SIRKA // 2)     # Počet krokov po x-ovej osi
        vzY = udalost.pos[1] - (Y + SIRKA // 4)     # Počet krokov po y-ovej osi

        # Výpočet vzdialenosti medzi pozíciou pri klinkutí myši a stredom kruhu
        # Pytagorova veta: https://oskole.detiamy.sk/clanok/pytagorova-veta-a-jej-odvodenie
        vz = (vzX ** 2 + vzY ** 2) ** (1/2)

        if vz <= POLOMER:
            # Ak sa nachádza vnútri kruhu prefarbíme na semaforové svetlo na čiernu
            draw.circle(okno, CIERNA, [X + SIRKA // 2, Y + SIRKA // 4], POLOMER)
        else:
            # Ak sa nachádza mimo kruhu prefarbíme na semaforové svetlo späť na červenú
            draw.circle(okno, CERVENA, [X + SIRKA // 2, Y + SIRKA // 4], POLOMER)

    display.update()