import turtle   #tuodaan ohjelmaan aliohjelmakirjasto turtle
import winsound #mahdollistetaan äänien käyttäminen ohjelmassa

#Ikkuna
wn = turtle.Screen()  #luodaan ikkuna
wn.title("Pong") #annetaan ikkunalle otsikko
wn.bgcolor("black")  #asetetaan ikkunan taustaväri
wn.setup(width=800, height=600) #asetetaan ikkunan mitat (leveys, korkeus)
wn.tracer(0)

#Pisteet
pisteet_a = 0   #alustetaan pelaaja A:n pisteet, arvoksi 0
pisteet_b = 0   #alustetaan pelaaja B:n pisteet, arvoksi 0


#Maila A

maila_a = turtle.Turtle()   #luodaan maila-objekti
maila_a.speed(0)            #asetetaan mailan nopeus
maila_a.shape("square")     #annetaan mailalle muoto
maila_a.color("white")      #annetaan mailalle väri
maila_a.shapesize(stretch_wid=5, stretch_len=1) #muokataan mailan mittoja
maila_a.penup()             #nostetaan "kynä ylös"
maila_a.goto(-350,0)        #annetaan mailalle sijainti ikkunassa


#Maila B

maila_b = turtle.Turtle()   #luodaan maila-objekti
maila_b.speed(0)            #asetetaan mailan nopeus
maila_b.shape("square")     #annetaan mailalle muoto
maila_b.color("white")      #annetaan mailalle väri
maila_b.shapesize(stretch_wid=5, stretch_len=1) #muokataan mailan mittoja
maila_b.penup()             #nostetaan "kynä ylös"
maila_b.goto(350,0)        #annetaan mailalle sijainti ikkunassa

#Pallo

pallo = turtle.Turtle()   #luodaan pallo-objekti
pallo.speed(0)            #asetetaan pallolle nopeus
pallo.shape("square")     #annetaan pallolle muoto
pallo.color("white")      #annetaan pallolle väri
pallo.penup()             #nostetaan "kynä ylös"
pallo.goto(0,0)        #annetaan pallolle sijainti ikkunassa
pallo.dx = 0.1          #pallon muutos x-akselin suuntaan 0.1 pikseliä
pallo.dy = 0.1          #pallon muutos y-akselin suuntaan 0.1 pikseliä

#Liitu
liitu = turtle.Turtle() #luodaan liitu objekti, jolla kirjoitetaan pelaajien pisteet ruudulle
liitu.speed(0)  #animaation nopeus
liitu.color("white") #liidun väri
liitu.penup() #nostetaan liitu-objektin pinnasta irti ettei perässä näkyvä viiva tule näkyviin
liitu.hideturtle() #piilotetaan liitu objekti
liitu.goto(0,260) #pelaajien pisteiden sijainti ruudulla
liitu.write("Pelaaja A: 0 Pelaaja B: 0", align="center", font=("Courier", 24, "normal")) #kirjoitettava teksti, sijanti ja fontti

#Funktio
def maila_a_up():
    y = maila_a.ycor()      #asetetaan mailan A sijainti y-akselin suhteen
    y += 20     #kasvatetaan maila A:n y-akselin arvoa luvulla 20
    if y > 250:
        y = 250
    maila_a.sety(y)  #asetetaan mailalle uusi sijanti y-akselin suhteen
    
def maila_a_down():
    y = maila_a.ycor()      #asetetaan mailan A sijainti y-akselin suhteen
    y -= 20     #vähennetään maila A:n y-akselin arvoa luvulla 20
    if y < -250:
        y = -250
    maila_a.sety(y)  #asetetaan mailalle uusi sijanti y-akselin suhteen

def maila_b_up():
    y = maila_b.ycor()      #asetetaan mailan B sijainti y-akselin suhteen
    y += 20     #kasvatetaan maila B:n y-akselin arvoa luvulla 20
    if y > 250:
        y = 250
    maila_b.sety(y)  #asetetaan mailalle uusi sijanti y-akselin suhteen

def maila_b_down():
    y = maila_b.ycor()      #asetetaan mailan B sijainti y-akselin suhteen
    y -= 20     #vähennetään maila B:n y-akselin arvoa luvulla 20
    if y < -250:
        y = -250
    maila_b.sety(y)  #asetetaan mailalle uusi sijanti y-akselin suhteen

#Pelinäppäinten asettaminen
wn.listen()  #asetetaan ikkuna odottamaan toimintoa
wn.onkeypress(maila_a_up, "w")
wn.onkeypress(maila_a_down, "s")
wn.onkeypress(maila_b_up, "Up")
wn.onkeypress(maila_b_down, "Down")

#Pelin pääsilmukka

while True:     #while-silmukan arvoksi annetaan True (tosi) -> suoritetaan
    wn.update() #päivitetään ikkunaa

    #Pallon liikuttaminen
    pallo.setx(pallo.xcor() + pallo.dx)
    pallo.sety(pallo.ycor() + pallo.dy)

    #Pelialueen rajojen tutkiminen
    if pallo.ycor() > 290:  #ikkunan koko on 600 pikseliä ja puolet siitä on 300 - pallon koko -> 290
        pallo.sety(290)     #asetetaan pallon y-akselin arvoksi 290
        pallo.dy *= -1 #törmäämisen jälkeen asetetaan pallo liikkumaan alaspäin
        winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)

    if pallo.ycor() < -290:  #ikkunan koko on 600 pikseliä ja puolet siitä on 300 - pallon koko -> -290
        pallo.sety(-290)     #asetetaan pallon y-akselin arvoksi -290
        pallo.dy *= -1 #törmäämisen jälkeen asetetaan pallo liikkumaan alaspäin
        winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)

    if pallo.xcor() > 390:  #ikkunan koko on 800 pikseliä ja puolet siitä on 400 - pallon koko -> 390
        pallo.goto(0,0) #jos pallo menee päädystä yli, siirretään se takasin keskelle
        pallo.dx *= -1 #ja muutetaan pallo lähtemään toiseen suuntaan
        pisteet_a += 1 #kasvatetaan muutujan arvoa yhdellä
        liitu.clear()
        liitu.write("Pelaaja A: {} Pelaaja B: {}".format(pisteet_a, pisteet_b), align="center", font=("Courier", 24, "normal"))

    if pallo.xcor() < -390:  #ikkunan koko on 800 pikseliä ja puolet siitä on 400 - pallon koko -> -390
        pallo.goto(0,0) #jos pallo menee päädystä yli, siirretään se takasin keskelle
        pallo.dx *= -1 #ja muutetaan pallo lähtemään toiseen suuntaan
        pisteet_b += 1  #kasvatetaan muutujan arvoa yhdellä
        liitu.clear()
        liitu.write("Pelaaja A: {} Pelaaja B: {}".format(pisteet_a, pisteet_b), align="center", font=("Courier", 24, "normal"))

    #Mailan ja pallon törmääminen
    if (pallo.xcor() > 340 and pallo.xcor() < 350 and pallo.ycor() < maila_b.ycor() + 40 and pallo.ycor() > maila_b.ycor() -40):
        pallo.setx(340)  #asetetaan pallon x-koordinaatiksi arvo 340
        pallo.dx *= -1   #osuman jälkeen vaihdetaan pallon suunta
        winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)
        
    if (pallo.xcor() < -340 and pallo.xcor() > -350 and pallo.ycor() < maila_a.ycor() + 40 and pallo.ycor() > maila_a.ycor() -40):
        pallo.setx(-340)  #asetetaan pallon x-koordinaatiksi arvo -340
        pallo.dx *= -1   #osuman jälkeen vaihdetaan pallon suunta
        winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)

























        





















    
