22일차까지 배운 내용을 토대로 핑퐁 게임을 작성해보았다.

가장 어려웠던 부분은 공이 튕기는것을 구현하는 것이였다.

ball.py부분을 눈여겨 보면 좋을거같다.

main.py

import time
from turtle import Turtle,Screen
from paddle import Paddle
from ball import Ball
from scoreboard import ScoreBoard

screen = Screen()

screen.setup(width=800, height=600)
screen.bgcolor("black")
screen.title("퐁")
screen.tracer(0) # 화면 갱신 지연

r_paddle = Paddle(x_cor=350)
l_paddle = Paddle(x_cor=-350)
ball = Ball()
scoreboard = ScoreBoard()
screen.listen()
screen.onkey(fun=r_paddle.up, key="Up")
screen.onkey(fun=r_paddle.down, key="Down")
screen.onkey(fun=l_paddle.up, key="w")
screen.onkey(fun=l_paddle.down, key="s")

game_is_on = True
while game_is_on :
    time.sleep(ball.move_speed) # while 구문을 돌때마다 지연
    screen.update() # paddle이 생성된 후에 스크린 업데이트
    ball.move()

    # 벽과 충돌 감지
    if ball.ycor() > 280 or ball.ycor() < -280 :
        ball.wall_bounce()

    # 패들과 충돌 감지
    if ball.distance(r_paddle) < 50 and ball.xcor() > 320 or ball.distance(l_paddle) < 50 and ball.xcor() < -320 :
        ball.paddle_bounce()

    # 오른쪽 패들이 공을 놓쳤을 때
    if ball.xcor() > 360 :
        ball.reset_position()
        scoreboard.l_score += 1
        scoreboard.update()

    # 오른쪽 패들이 공을 놓쳤을 때
    if ball.xcor() < -360 :
        ball.reset_position()
        scoreboard.r_score += 1
        scoreboard.update()

screen.exitonclick()

ball.py

from turtle import Turtle

class Ball(Turtle):
    def __init__(self):
        super().__init__()
        self.shape("circle")
        self.color("blue")
        self.shapesize(0.5,0.5)
        self.x_move = 10
        self.y_move = 10
        self.move_speed = 0.1

    def move(self):
        """공이 움직이도록 하는 함수"""
        self.penup()
        new_x = self.xcor() + self.x_move
        new_y = self.ycor() + self.y_move
        self.goto(new_x,new_y)

    def wall_bounce(self):
        """벽에 부딪힐 경우"""
        self.y_move *= -1

    def paddle_bounce(self):
        """패들에 부딪힐 경우"""
        self.x_move *= -1
        self.move_speed *=0.9# 패들과 부딪힐 때 공 속도 상승def reset_position(self):
        """공의 원위치 및 반대방향 시작"""
        self.home()
        self.paddle_bounce()

paddle.py

from turtle import Turtle

class Paddle(Turtle) :
    def __init__(self,x_cor):
        super().__init__()
        self.shape("square")
        self.color("white")
        self.penup()
        self.goto(x_cor, 0)
        self.shapesize(stretch_len=1, stretch_wid=5)

    def up(self):
        """키 입력과 관련된 함수"""
        new_y = self.ycor() + 20
        self.goto(self.xcor(),new_y)

    def down(self):
        """키 입력과 관련된 함수"""
        new_y = self.ycor() - 20
        self.goto(self.xcor(),new_y)

scoreboard.py

from turtle import Turtle

class ScoreBoard(Turtle):
    def __init__(self):
        super().__init__()
        self.color("white")
        self.penup()
        self.hideturtle()
        self.l_score = 0
        self.r_score = 0
        self.goto(-100,200)
        self.write(self.l_score,align="center",font=("Courier",40,"normal"))
        self.goto(100,200)
        self.write(self.r_score, align="center",font=("Courier",40,"normal"))

    def update(self):
        """스코어보드 업데이트"""
        self.clear()
        self.goto(-100, 200)
        self.write(self.l_score, align="center", font=("Courier", 40, "normal"))
        self.goto(100, 200)
        self.write(self.r_score, align="center", font=("Courier", 40, "normal"))