from tkinter import *
import random
import time

win=Tk()
win.title('Арканоид 2024')
win.resizable(0,0)
canvas=Canvas(master=win,width=500,height=400)
canvas.pack()

class Ball:
    def __init__(self,canvas,color,paddle,target1,target2,
                 target3,target4):
        self.canvas=canvas
        self.life = 3
        self.paddle=paddle
        self.target1 = target1
        self.target2 = target2
        self.target3 = target3
        self.target4 = target4
        self.id=self.canvas.create_oval(10,10,25,25,fill=color)
        self.text=self.canvas.create_text(480,380,
                                          text="♥ "+str(self.life),
                                          font="32")
        self.canvas.move(self.id,245,150)
        osy=[-4,-3,-2,-1,1,2,3,4]
        self.x=random.choice(osy)
        self.y=-3

    def hitTarget(self, posBall):   #[x0,y0,x1,y1]
        try:
            pos=self.canvas.coords(self.target1.id)
            if posBall[1]<=pos[3]:
                if posBall[0]>pos[0] and posBall[0]<pos[2]:
                    return 1
                if posBall[2]>pos[0] and posBall[2]<pos[2]:
                    return 1
        except:
            pass
        try:
            pos = self.canvas.coords(self.target2.id)
            if posBall[1] <= pos[3]:
                if posBall[0] > pos[0] and posBall[0] < pos[2]:
                    return 2
                if posBall[2] > pos[0] and posBall[2] < pos[2]:
                    return 2
        except:
            pass
        try:
            pos = self.canvas.coords(self.target3.id)
            if posBall[1] <= pos[3]:
                if posBall[0] > pos[0] and posBall[0] < pos[2]:
                 return 3
                if posBall[2] > pos[0] and posBall[2] < pos[2]:
                 return 3
        except:
            pass
        try:
            pos=self.canvas.coords(self.target4.id)
            if posBall[1]<=pos[3]:
                if posBall[0]>pos[0] and posBall[0]<pos[2]:
                    return 4
                if posBall[2]>pos[0] and posBall[2]<pos[2]:
                    return 4
            return 0
        except:
            pass


    def hitPaddle(self,posBall):
        posPaddle=self.canvas.coords(self.paddle.id)
        if posBall[2]>=posPaddle[0] and posBall[0]<=posPaddle[2]:
            if posBall[1]>posPaddle[1] and posBall[1]<posPaddle[3]:
                return True
            if posBall[3]>posPaddle[1] and posBall[3]<posPaddle[3]:
                return True
        return False



    def draw(self):
        self.canvas.move(self.id,self.x,self.y)
        pos=self.canvas.coords(self.id)  # [0,1,2,3]
        if pos[1]<=0:
            self.y *= -1
        if pos[3]>=400:
            self.y *= -1
            self.life -= 1
            self.canvas.delete(self.text)
            self.text = self.canvas.create_text(480, 380,
                                                text="♥ " + str(self.life),
                                                font="32")
        if pos[0]<=0:
            self.x *= -1
        if pos[2]>=500:
            self.x *= -1
        if self.hitPaddle(pos)==True:
            self.y *= -1
        if self.hitTarget(pos)==1:
            self.y *= -1
            try:
                canvas.delete(self.target1.id)
            except:
                pass
        if self.hitTarget(pos)==2:
            self.y *= -1
            try:
                canvas.delete(self.target2.id)
            except:
                pass
        if self.hitTarget(pos) == 3:
            self.y *= -1
            try:
                canvas.delete(self.target3.id)
            except:
                pass
        if self.hitTarget(pos) ==4:
            self.y *= -1
            try:
                canvas.delete(self.target4.id)
            except:
                pass

class Paddle:
    def __init__(self,canvas,color):
        self.canvas=canvas
        self.id=canvas.create_rectangle(0,0,100,10,fill=color)
        self.canvas.move(self.id,200,350)
        self.x=0
        self.canvas.bind_all('<KeyPress-Left>',self.turnLeft)
        self.canvas.bind_all('<KeyPress-Right>', self.turnRight)
    def draw(self):
        self.canvas.move(self.id,self.x,0)
        pos=self.canvas.coords(self.id)
        if pos[0]<=0:
            self.x=0
        if pos[2]>=500:
            self.x=0
    def turnLeft(self, event):
        self.x = -3
    def turnRight(self, event):
        self.x = 3

class Target:
    def __init__(self,canvas,color,x0,y0,x1,y1):
        self.id=canvas.create_rectangle(x0,y0,x1,y1,fill=color)

target1=Target(canvas,'lime',20,10,120,20)
target2=Target(canvas,'yellow',140,10,240,20)
target3=Target(canvas,'pink',260,10,360,20)
target4=Target(canvas,'magenta',380,10,480,20)

paddle=Paddle(canvas,'purple')
alexa=Ball(canvas,'red', paddle,target1,target2,target3,target4)
text = canvas.create_text(120,380,text='by Кузьмина Александра',font='26')
while True:
    if alexa.life >= 0:
        alexa.draw()
        paddle.draw()
    else:
        canvas.delete(alexa.text)
        text = canvas.create_text(250,200,
                                  text='Game over',
                                  font='72')
    win.update()
    time.sleep(0.01)