import turtle
from random import choice, randint
window = turtle.Screen()
window.title("Pin-Pong")
window.setup(width=1.0, height=1.0) # открытие окна и его заливка
window.bgcolor("black")
window.tracer(2)
border = turtle.Turtle()
border.speed(0)
border.color("green")
border.begin_fill()
border.goto(-500, 300) # рисование поля
border.goto(500, 300)
border.goto(500, -300)
border.goto(-500, -300)
border.goto(-500, 300)
border.end_fill()
border.goto(0, 300)
border.color("white")
border.setheading(270)
for i in range(25):
if i % 2 == 0:
border.forward(24)
else: # центральная штриховая линия
border.up()
border.forward(24)
border.down()
border.hideturtle()
rocket_a = turtle.Turtle()
rocket_a.color("white")
rocket_a.shape("square")
rocket_a.shapesize(stretch_len=1, stretch_wid=5) # создание и установка первой ракетки
rocket_a.up()
rocket_a.goto(-450, 0)
def move_up():
y = rocket_a.ycor() + 10
if y > 250:
y = 250
rocket_a.sety(y)
# движение при нажатии "W" и "S"
def move_down():
y = rocket_a.ycor() - 10
if y < -250:
y = -250
rocket_a.sety(y)
window.listen()
window.onkeypress(move_up, "w")
window.onkeypress(move_down, "s")
rocket_b = turtle.Turtle()
rocket_b.color("white")
rocket_b.shape("square")
rocket_b.shapesize(stretch_len=1, stretch_wid=5) # создание и установка второй ракетки
rocket_b.up()
rocket_b.goto(450, 0)
def move_up():
y = rocket_b.ycor() + 10
if y > 250:
y = 250
rocket_b.sety(y)
# движение при нажатии "O" и "L"
def move_down():
y = rocket_b.ycor() - 10
if y < -250:
y = -250
rocket_b.sety(y)
window.listen()
window.onkeypress(move_up, "o")
window.onkeypress(move_down, "l")
score_a = 0
score_b = 0
FONT = ("Arial", 44)
s1 = turtle.Turtle(visible=False)
s1.color("red")
s1.up()
s1.setposition(-200, 300)
s1.write(score_a, font=FONT)
# создание счётчика
s2 = turtle.Turtle(visible=False)
s2.color("red")
s2.up()
s2.setposition(200, 300)
s2.write(score_b, font=FONT)
ball = turtle.Turtle()
ball.shape("circle")
ball.color("red")
ball.up() # создание мяча
ball.speed(0)
ball.dx = 3
ball.dy = 3
while True:
window.update()
ball.setx(ball.xcor() + ball.dx)
ball.sety(ball.ycor() + ball.dy)
if ball.ycor() >= 290:
ball.dy = -ball.dy
# отражение от потолка и пола
if ball.ycor() <= -290:
ball.dy = -ball.dy
if ball.xcor() >= 490:
score_a += 1
s1.clear() # гол в правые ворота
s1.write(score_a, font=FONT)
ball.goto(0, randint(-150, 150))
ball.dx = choice([-4, -3, -2, 2, 3, 4]) # респаун мяча
ball.dy = choice([-4, -3, -2, 2, 3, 4])
if ball.xcor() <= -490:
score_b += 1
s2.clear() # гол в левые ворота
s2.write(score_b, font=FONT)
ball.goto(0, randint(-50, 50))
ball.dx = choice([-4, -3, -2, 2, 3, 4]) # респаун мяча
ball.dy = choice([-4, -3, -2, 2, 3, 4])
if rocket_b.ycor() - 50 <= ball.ycor() <= rocket_b.ycor() + 50 \
and rocket_b.xcor() - 20 <= ball.xcor() <= rocket_b.xcor() + 20: # отражение мяча от правой ракетки
ball.dx = -ball.dx
if rocket_a.ycor() - 50 <= ball.ycor() <= rocket_a.ycor() + 50 \
and rocket_a.xcor() - 20 <= ball.xcor() <= rocket_a.xcor() + 20: # отражение мяча от левой ракетки
ball.dx = -ball.dx