import tkinter
from random import choice, randint
from math import cos, sin, pi
import time
import signal

ball_initial_number = 10
ball_minimal_radius = 10
ball_maximal_radius = 40

#ball_available_colors = '0123456789ABCDEF'#['green', 'blue', 'red', 'lightgray', '#FF00FF', '#FFFF00']
#balls_coord = []#список координат шариков
#balls_num = []#список номеров шариков

ball_available_colors = ['green', 'blue', 'red', 'lightgray', '#FF00FF', '#FFFF00']
ball_bonus_for_color = [       2,      2,     3,           1,         1,         1]
balls = list()
step_fly = 1.5
bonus = 0

def accumulation_of_bonus(color):
    """
    За подбитые шарики основного цвета дается 2 балл,
    за шарики дополнительных цветов - 1 балл
    :param color:
    :return:
    """
    bonus = ball_bonus_for_color[ball_available_colors.index(color)]
    label_bonus["text"] =  str(int(label_bonus["text"]) + bonus)


def click_ball(event):
    """
    Обработчик событий от мышки для игрового холста
    :param event:мышка указывет
     По клику мышкой нужно удалять тот объект, на который
     А также засчитывать его очки
    :return:
    """
    obj = canvas.find_closest(event.x, event.y)
    x1, y1, x2, y2 = canvas.coords(obj)
    R = (x2 - x1) / 2
    xc = x1 + R
    yc = y1 + R
    i = 0
    while (i < len(balls)) and (obj[0] != balls[i][1]):
        i += 1
    if i < len(balls) and (xc - event.x)**2 + (yc - event.y) ** 2 <= R**2:
        accumulation_of_bonus(canvas.itemcget( obj[0], "fill"))
        canvas.delete(balls[i][1])
        balls[:i+1] = balls[:i]
        create_random_ball()

def move_all_balls():
    """
    передвигат все шарики на чуть-чуть
    :return:
    """
    for obj in canvas.find_all():
        dx = randint(-1, 1)
        dy = randint(-1, 1)
        canvas.move(obj, dx, dy)

def create_random_ball():
    """
    создает шарик в случайном месте игрового холста
    шарик не выходит за границу игрового поля
    :return:
    """
    global balls
    R = randint(ball_minimal_radius, ball_maximal_radius)
    x = randint(0+R, int(canvas['width'])-1-R)
    y = randint(0+R, int(canvas['width'])-1-R)
    angle = randint(0,359)
    id_oval = canvas.create_oval(x-R,y-R,x+R, y+R, width=1, fill=random_color())
    balls.append([angle, id_oval])


def random_color():
    """
    случайный цвет из некоторого набора цветов
    :return:
    """
    return choice(ball_available_colors)

def init_ball_catch_game():
    """
     Создает необхоимое для игры количство шариков,по которым нужно будет кликать

     """
    for i in range(ball_initial_number):
        create_random_ball()


def init_main_window():
    """
    Инициализация главного окна
        :return:
    """
    global root, frame_bonus,frame_canvas, label_bonus, canvas
    root  = tkinter.Tk()
    frame_bonus = tkinter.Frame(root)
    label_caption = tkinter.Label(frame_bonus, text="  Накопленные очки  ", width=20, font="Calibri 14")
    label_bonus = tkinter.Label(frame_bonus, text="0", font="Calibri 14")
    label_caption.grid(row=0, column=0)
    label_bonus.grid(row=0, column=1)
    frame_bonus.pack()

    frame_canvas = tkinter.Frame(root)
    frame_canvas.pack()

    canvas = tkinter.Canvas(frame_canvas, background='white', width=400, height=400)
    canvas.bind('<Button>', click_ball)
    canvas.pack()

def gradus_to_radians(angle_in_gradus):
    return angle_in_gradus * pi / 180

def move_balls():
    for i in range(len(balls)):
        x1, y1, x2, y2 = canvas.coords(balls[i][1])
        if y1 <= 0:
            balls[i][0] = 360 - balls[i][0]
        elif y2 >= 400:
            balls[i][0] = 360 - balls[i][0]
        elif x1 <= 0:
            balls[i][0] = 180 - balls[i][0]
        elif x2 >= 400:
            balls[i][0] = 180 - balls[i][0]
        dx = step_fly * cos(gradus_to_radians(balls[i][0]))
        dy = step_fly * sin(gradus_to_radians(balls[i][0]))
        canvas.move(balls[i][1],dx,  dy)



def main():
     move_balls()
     root.after(30, main)

if __name__ == "__main__":
    init_main_window()
    init_ball_catch_game()
    main()
    root.mainloop()

    print("Приходите поиграть еще!")