from io import text_encoding
from tkinter import *
import random
import time

win=Tk()
win.title('Arcanoid 2025 The BEST')
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=5
        self.text=self.canvas.create_text(450,380,font='26',text='Life: '+str(self.life))
        self.paddle=paddle
        self.target1 = target1
        self.target2 = target2
        self.target3 = target3
        self.target4 = target4
        self.id=canvas.create_oval(10,10,25,25,fill=color)
        self.canvas.move(self.id,245,150)
        self.x=random.choice([-3,-2,-1,1,2,3])
        self.y=-3
    def draw(self):
        self.canvas.move(self.id,self.x,self.y)
        pos=self.canvas.coords(self.id)  # pos[x0,y0,x1,y1]
        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(450, 380, font='26', text='Life: ' + str(self.life))
        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
            self.canvas.delete(self.target1.id)
        if self.hitTarget(pos)==2:
            self.y *= -1
            self.canvas.delete(self.target2.id)
        if self.hitTarget(pos)==3:
            self.y *= -1
            self.canvas.delete(self.target3.id)
        if self.hitTarget(pos)==4:
            self.y *= -1
            self.canvas.delete(self.target4.id)

    def hitPaddle(self,posBall):
        posPaddle=self.canvas.coords(self.paddle.id)  #[x0,y0,x1,y1]
        if posBall[3]>=posPaddle[1]:
            if posBall[0]>=posPaddle[0] and posBall[0]<=posPaddle[2]:
                return True
            if posBall[2]>=posPaddle[0] and posBall[2]<=posPaddle[2]:
                return True
        return False

    def hitTarget(self,posBall):
        try:
            posTarget1=self.canvas.coords(self.target1.id)
            if posBall[1]<=posTarget1[3]:
                if posBall[0]>=posTarget1[0] and posBall[0]<=posTarget1[2]:
                    return 1
                if posBall[2]>=posTarget1[0] and posBall[2]<=posTarget1[2]:
                    return 1
        except:
            pass
        try:
            posTarget2=self.canvas.coords(self.target2.id)
            if posBall[1]<=posTarget2[3]:
                if posBall[0]>=posTarget2[0] and posBall[0]<=posTarget2[2]:
                    return 2
                if posBall[2]>=posTarget2[0] and posBall[2]<=posTarget2[2]:
                    return 2
        except:
            pass
        try:
            posTarget3=self.canvas.coords(self.target3.id)
            if posBall[1]<=posTarget3[3]:
                if posBall[0]>=posTarget3[0] and posBall[0]<=posTarget3[2]:
                    return 3
                if posBall[2]>=posTarget3[0] and posBall[2]<=posTarget3[2]:
                    return 3
        except:
            pass
        try:
            posTarget4=self.canvas.coords(self.target4.id)
            if posBall[1]<=posTarget4[3]:
                if posBall[0]>=posTarget4[0] and posBall[0]<=posTarget4[2]:
                    return 4
                if posBall[2]>=posTarget4[0] and posBall[2]<=posTarget4[2]:
                    return 4
        except:
            pass


        return 0


        
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.moveLeft)
        self.canvas.bind_all('<KeyPress-Right>', self.moveRight)
    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 moveLeft(self,event):
        self.x = -2
    def moveRight(self,event):
        self.x = 2

class Target:
    def __init__(self,canvas,color,x0,y0,x1,y1):
        self.canvas=canvas
        self.id=self.canvas.create_rectangle(x0,y0,x1,y1,fill=color)

target1=Target(canvas,'lime',20,10,120,20)
target2=Target(canvas,'lime',140,10,240,20)
target3=Target(canvas,'lime',260,10,360,20)
target4=Target(canvas,'lime',380,10,480,20)


paddle=Paddle(canvas,'pink')
ball=Ball(canvas,'red',paddle,target1,target2,target3,target4)
canvas.create_text(100,380,text='алексеенко артём',font='26')
while True:
    if ball.life>0:
        ball.draw()
        paddle.draw()
    else:
        canvas.delete(ball.text)
        canvas.create_text(250,200,text='GAME OVER',font='42')
    win.update()
    time.sleep(0.01)
