๊ณ ๋ฑํ๊ต๋ ํ๋ณผ ๊ฒ์ ์ ์ํ๋ ๊ฑธ ์ ๋ฆฌํด์ ์ฌ๋ ค๋ณด๊ณ ์ ํ๋ค.
๋น์ Pygame์ ์ฒ์ ์จ๋ดค์ผ๋ฉฐ ์ด๋ค ์๋ฆฌ๋ก ๊ฒ์์ด ๋์๊ฐ๋์ง ์์๋ณด๊ณ ์ ํ์ ์
์ด์ ๋ชจ์ฌ์ ๊ฐ์ด ์ฝ๋ฉํ๋ ๊ธฐ์ต์ด ์๋ค. ์ง๊ธ๋ ์์งํ ์๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์๋ฒฝํ ์ดํดํ๋ฉฐ ์ฝ๋๋ฅผ ์๋ฒฝํ๊ฒ ๊ตฌํํด๋ณด๋ผ ํ๋ฉด ํ ์์ ์ ์์ผ๋, ๊ฒ์์ด ์ด๋ค ์ฉ์ผ๋ก ์ ์๋๋์ง ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๋ฐ์ ์์ด ํฐ ๋์์ด ๋ฌ๋ ๊ฒ ๊ฐ๋ค.
์ฌ์ฐจ ๋งํ์ง๋ง Pygame
์ ์ฌ์ฉํด์ ํ์ผ๋ ๋ฐ๋ผํด๋ณผ ์ฌ๋๋ค์ ์ธ์คํจํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋๋ ์ฌ๋ฌ highlight์ ๊ธ์ ์๊น์ด ์ด์ VS code๋ฅผ ์ฌ์ฉํ๋๊ฑธ ์ข์ํ๋ค.
์์งํ ์๋์ฝ๋ค๋ ์คํ์ด๋๋ฅผ ์ฐ๋ฉด ๋ฝ๋๊ฐ ์๋๋ค๊ณ ํด์ผํ ๊น...๋ฌผ๋ก sciphy๊ฐ์ ํน์ ํด์ ์ธ ๋ ๋ spider๊ฐ ๋ ์ง๊ด์ ์ด๊ณ ๋ณด๊ธฐ ํธํ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ ๊ฐ์ ๋ง๋ ํ๋ซํผ์ ์ฐ๋ฉด ๋๊ฒ ๋ค.
์๋ ๊ฒ pip install pygame ์ ์
๋ ฅํด์ฃผ๋ฉด pygame์ด ๊น๋ฆฐ๋ค.
์ฝ๋ฉํ ์ค๋น๊ฐ ๋ ๊ฒ์ด๋ค.
์ด๋ ์ธ์ด์์๋ ํ๋๋ ์ค์ํ ๊ฒ ๊ฐ๋ค.
์ด๊ธฐ๊ฐ, ๋ณ์๋ค์ ์ง์ ํด์ฃผ๋ ์ค์ํ ๋ถ๋ถ์ด๋ ์ด๊ธฐ ํ๋๋ฅผ ์ ์ก๊ณ ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋จผ์ ํ์ด๊ฒ์๊ณผ ์์คํ
์ importํด์ฃผ๋ ์์
์ ๊ฑฐ์ณค๋ค.
import pygame as pg
import sys
๋ค์์ผ๋ก ํ๋๋ฅผ ์์ฑํด์ค๋ค.
Size = [640, 480]
Width = Size[0]
Height = Size[1]
black = (0, 0, 0)
white = (255, 255, 255)
blue = (0, 0, 255)
yellow = (200, 200, 0)
State_Wait = 0
State_play = 1
State_Won = 2
State_Over = 3
Brick_Width = 60
Brick_Height = 15
Paddle_Width = 60
Paddle_Height = 15
Ball_Size = 16
Ball_Radius = int(Ball_Size/2)
Max_Paddle_X = Width - Paddle_Width
Max_Ball_X = Width - Ball_Size
Max_Ball_Y = Height - Ball_Size
Paddle_Y = Height - Paddle_Height - 10
์ฐจ๋ก์ฐจ๋ก ์ดํด๋ณด๋ฉด
1 . Size๋ก ํด์๋ ํฌ๊ธฐ ์ค์
2 . Width/Height๋ก ๊ฐ๋ก, ์ธ๋ก ํฌ๊ธฐ ์ค์
3 . black, white, blue, yellow ๋ฑ ๊ฒ์ ๋ด์์ ์ฌ์ฉํ ์๊น ์ค์
4 . ๊ฒ์ ์ ์ง/ํ๋ ์ด/์ด๊น/ํจ๋ฐฐ ์ํ ์ซ์ ์ค์
5 . PingBall ๋ฒฝ๋ ํฌ๊ธฐ ์ค์
6 . PingBall ํจ๋ค(ํ๋ ์ด์ด) ํฌ๊ธฐ ์ค์
7 . ๋ณผ ์ฌ์ด์ฆ ๋ฐ ํจ๋ค๊ณผ ๋ณผ์ด ์ต๋๋ก ์์ง์ผ ์ ์๋ ๊ฑฐ๋ฆฌ ์ค์
์ ๋ ๋์๊ฒ ๋ค.
๋ง๋ถ์ฌ์ ์๊น ๋ด๊ฐ VS Code๊ฐ ์ด๋ป์ ์ ์ฉํ๋ค๊ณ ํ๋๋ฐ ๊ทธ ์์ค ํ๋๊ฐ ์ ๋ ๊ฒ ์๊น์ ์
๋ ฅํ๋ฉด
์ด๋ฐ์ฉ์ผ๋ก ๊ตฌ๋ณํ๊ธฐ ์ฝ๊ฒ ์๊น์ highlightํด์ ๋์ค๋ ๊ธฐ๋ฅ์ด ์๋ค. ์์ ๋ฝ๋๋์ง ์์ต๋๊น?
์ฝ๋ ์์ฒด๋ ํฌ๊ฒ ๋ ๋ถ๋ฅ๋ก ๋๋ด๋ค. Class๋ฅผ ํ๋ ์ง์ ํด์ Pingball์ ๋ฉ์ธ ๊ธฐ๋ฅ์ ํ๋ ํ๋ณผํด๋์ค, ๊ทธ๋ฆฌ๊ณ ๋ฉ์ธํจ์ ์์ฒด ์คํ์ํค๋ init. Init ์คํ์ ๊ฐ๋จํ๋๊น ์ฌ๊ธฐ ์ ๊ฒ ๋ค.
if __name__ == "__main__":
PingBall().run()
ํ๋ ์ฃผ์ํด์ผ ํ ์ ์ ์์ ์คํ ์ฝ๋๋ pingballํด๋์ค ๋ฐ์ ๋ค์ฌ์ฐ๊ธฐ ํด์ผํ๋ค. ๋ง์ฝ ์์ผ๋ก ๋ค์ฌ์ฐ๊ธฐํ๋ฉด ๋ถ๋ช
ํ ์ค๋ฅ๊ฐ ๋๋ค.
์ด์ ํ๋์ ์คํ ๋ฑ์ ์ค๋น๊ฐ ๋ค ๋ฌ์ผ๋ ๋ฉ์ธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
ํต์ฌ ์ฝ๋๋ ์ด 10๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ํ๋ํ๋ ๊ทธ ๊ธฐ๋ฅ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด์๋ฉด
1 .
__init__
: ํ์ด๊ฒ์ ์ด๊ธฐํ์ํจ ์๋์ฐ์ฐฝ ๋ง๋ค๊ณ Fps/Font๋ฑ ๊ธฐ๋ณธ์ค์
2 . init_game : ๊ธฐ๋ณธ ๋ชฉ์จ/์ค์ฝ์ด/์ํ ์ค์ ๋ฐ ๊ณต๊ณผ ํจ๋ค์ ์์น์ค์
3 . create_bricks : for๋ฌธ์ ํ์ฉํ์ฌ ์ค์ง์ ์ธ ๋ฒฝ๋์ ๋ง๋ฆ
4 . draw_bricks : ๋ฒฝ๋์ ์๊น ์ง์ ๋ฐ ๋ฒฝ๋ ๊ทธ๋ฆฌ๊ธฐ
5 . check_input : ํค๋ณด๋๊ฐ ๋๋ ธ์ ๋ ์ด๋ป๊ฒ ํด์ผํ ์ง ํธ๋ฆฌ๊ฑฐ ์ค์
6 . move_ball : ๊ณต์ด ์ด๋์ ๋ฟ์ผ๋ฉด ๋ฉ์ถ๊ณ ํ๊ธฐ๋์ง ๋ฑ ์ค์
7 . handle_collisions : ์น๋ฆฌ ์กฐ๊ฑด ๋ฌ์ฑ์ ๋๋ด๋ ์ฝ๋
8 . show_stats : ์ ์์ ๋ชฉ์จ ํ์
9 . show_message : ๋ฉ์ธ์ง ํ์
10 . run : ๋ฉ์ธํจ์๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ฒ์์ ๋์ฒด ์ด๊ฑธ ์ด๋ป๊ฒ ์ง์ผ ํ ์ง ๋ง๋งํ๋ค. ๊ทธ๋์ ์ ํ๋ธ๋ก ๊ฐ์๋ ์ฐพ์๋ณด๊ณ , ๊ตฌ๊ธ๋ง์ ์ด์ฌํ ํ๋๊น ์ด์ ๋๋ก ์ฝ๋ฉ์ ํ๋ฉด ์ค๋ฅ์์ด ์ ์๋ํจ์ ํ์ธ ํ ์ ์์๋ค. ์์ ์ฝ๋๋ฅผ ํ๋ํ๋ ์์ฑํ๊ณ ์ค๋ช ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
def __init__(self):
pg.init()
self.screen = pg.display.set_mode(Size)
pg.display.set_caption("PingBall_Game")
self.fps = pg.time.Clock()
self.font = pg.font.Font(None, 30)
self.init_game()
Init์ ์๋์ฐ ์ฐฝ์ ์ด๊ธฐํ์์ผ์ฃผ๊ณ Fps๋ ๊ธฐ๋ณธ ํฐํธ๊ฐ์๊ฑธ ์ค์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
ํ๊ฐ์ง ์ฃผ์ํ ์ ์ด ์๋ค๋ฉด ๋ด๊ฐ init๊ณผ init_game์ ๋ฐ๋ก ์ง ์ด์ ๋ init๋ง ๊ฐ์ง๊ณ ๋ ์๋์ฐ์ฐฝ ์์ฒด๊ฐ ๊ณ์ ์ ์ง๋์ง ์๋๋ค. ๊ทธ๋์ ๋ฐ๋ก ์ฝ๋๋ฅผ ์ง์ฃผ๊ฑฐ๋ ๋ฉ์ธ ๋ฉ์๋๊ฐ์ ๊ณณ์ ๊ฒ์๋ฃจํ๋ฅผ ์ค์ ํด์ผ ํ๋ค. ๊ฒ์๋ฃจํ์ ๋ํ ๋ถ๊ฐ์ ์ธ ๋ด์ฉ์ ์๊ณ ์ถ๋ค๋ฉด ์ด ๊ณณ ์ฐธ์กฐ.
def init_game(self):
self.lives = 3
self.score = 0
self.state = State_Wait
self.paddle = pg.Rect(300, Paddle_Y, Paddle_Width, Paddle_Height)
self.ball = pg.Rect(300, Paddle_Y - Ball_Size, Ball_Size, Ball_Size)
self.create_bricks()
์ฒซ ๋ชฉ์จ์ 3๊ฐ, ์ค์ฝ์ด๋ ๋น์ฐํ 0์ผ๋ก ํด๋์๊ณ ์ํ๋ ๊ธฐ๋ค๋ฆผ์ผ๋ก ํ๋ค. pg.Rect๋ฅผ ์ฌ์ฉํด ํจ๋ค๊ณผ ๊ณต์ ์์น๋ฅผ ์ฑ์ ํด์ฃผ๋ฉด ๋๋ค.
def create_bricks(self):
Y = 35
self.bricks = []
for i in range(7):
X = 35
for j in range(8):
self.bricks.append(pg.Rect(X, Y, Brick_Width, Brick_Height))
X += Brick_Width + 10
Y += Brick_Height + 5
Gui๋ก ๋ช๋ฒ ๊ตฌํ์ ํด๋ณด๋ค๋ณด๋๊น ๋์ด๋์๋ brick 56๊ฐ๊ฐ ์ ๋นํ๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ค.
X์ Y๋ Brick ๊ฐ์ ๊ฐ๊ฒฉ์ ์ค์ ํด์ฃผ๊ธฐ ์ํด ์ ์ด๋ ๊ฑฐ๋ค. Y์ ์ด๊ธฐ๊ฐ์ 35, X์ ์ด๊ธฐ๊ฐ ๋ํ 35๋ก ์ง์ ํ ํ ํ
์คํธ๋ฅผ ํตํด ๊ฐ๊ฐ 10,5 ์ฉ ์ฆ๊ฐ์ฐ์ฐ์ ํ์ฌ ๋ฒฝ๋๊ฐ์ ๊ฐ๊ฒฉ์ ์ง์ ํด์ฃผ์๋ค.
def draw_bricks(self):
for brick in self.bricks:
pg.draw.rect(self.screen, yellow, brick)
๋ฒฝ๋์ ๋ ธ๋์์ผ๋ก ๊ทธ๋ ค์ค๋ค.
def check_input(self):
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
self.paddle.left -= 5
if self.paddle.left < 0:
self.paddle.left = 0
if keys[pg.K_RIGHT]:
self.paddle.left += 5
if self.paddle.left > Max_Paddle_X:
self.paddle.left = Max_Paddle_X
if keys[pg.K_SPACE] and self.state == State_Wait:
self.ball_move = [5, -5]
self.state = State_play
if keys[pg.K_r] and (self.state == State_Over or self.state == State_Won):
self.init_game()
๋ง๊ทธ๋๋ก ํค๋ณด๋ ์ธํ์ ๋ฐ์์ฃผ๋ ์ฝ๋๋ค. ํค๋ณด๋ ์ธํ ๋ ํํธ๋ก ๊ฐ๊ฒ ๋ผ ์์ผ๋ฉด ํจ๋ค์ ์ผ์ชฝ์ผ๋ก 5๋งํผ ์ฎ๊ธด๋ค๋๊ฐ ํ๋ ์ฝ๋ ๋ง์ด๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ฒ ๋๋ฉด +5 ๋ฅผ ์ฆ๊ฐ์ฐ์ฐ ํด์ฃผ๋ฉด ๋๋ค. ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ ์ฐฝ์ ๋์ด๊ฐ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ Max๊ฐ๊ณผ 0๊ฐ ๋ฑ์ ์ด์ฉํด์ ์ฐฝ์ ํฌ๊ธฐ๋งํผ๋ง ์์ง์ด๊ฒ ์ค์ ํด์ผํ๋ค.
def move_ball(self):
self.ball.left += self.ball_move[0]
self.ball.top += self.ball_move[1]
if self.ball.left <= 0:
self.ball.left = 0
self.ball_move[0] = -self.ball_move[0]
elif self.ball.left >= Max_Ball_X:
self.ball.left = Max_Ball_X
self.ball_move[0] = -self.ball_move[0]
if self.ball.top < 0:
self.ball.top = 0
self.ball_move[1] = -self.ball_move[1]
์ด ์ฝ๋ ๋ํ top ๋ฑ์ ์ค์ ํด์ ๊ณต์ด ํ๋ฉด ๋ฐ์ผ๋ก ์๋๊ฐ๊ฒ ์ฝ๋ฉํ๋๊ฑฐ๋ค.
def handle_collisions(self):
for brick in self.bricks:
if self.ball.colliderect(brick):
self.score += 1
self.ball_move[1] = -self.ball_move[1]
self.bricks.remove(brick)
break
if len(self.bricks) == 0:
self.state = State_Won
if self.ball.colliderect(self.paddle):
self.ball.top = Paddle_Y - Ball_Size
self.ball_move[1] = -self.ball_move[1]
elif self.ball.top > self.paddle.top:
self.lives -= 1
if self.lives > 0:
self.state = State_Wait
else:
self.state = State_Over
๋ฒฝ๋์ ์ถฉ๋ํ๋ฉด ๋ฒฝ๋์ด ํ๋ ์ฌ๋ผ์ง๊ณ ์ ์๊ฐ ์ฌ๋ผ๊ฐ๊ฒ ํ๋ ์ถฉ๋ ์ด๋ฒคํธ์ ๋ฒฝ๋์ ์ ๋ถ ์ ๊ฑฐํ์ ์์ ์ํ๋ฅผ won์ผ๋ก ํํํ๊ฒ ํ๋ ์ฝ๋๋ค.
def show_stats(self):
if self.font:
font_surface = self.font.render("Score : " + str(self.score)
+ " Lives : " + str(self.lives), True, white)
self.screen.blit(font_surface, (205, 5))
def show_message(self, message):
if self.font:
size = self.font.size(message)
font_surface = self.font.render(message, False, white)
x = (Size[0] - size[0]) // 2
y = (Size[1] - size[1]) // 2
self.screen.blit(font_surface, (x, y))
ํ์ฌ ์คํฏ(์ ์์ ๋ชฉ์จ)์ ๋ณด์ฌ์ฃผ๋ ์ฝ๋ํ๊ณ ๋ฉ์ธ์ง๋ก ์ถ๋ ฅํด์ฃผ๋ ์ฝ๋๋ค.
def run(self):
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
self.screen.fill(black)
self.check_input()
if self.state == State_play:
self.move_ball()
self.handle_collisions()
elif self.state == State_Wait:
self.ball.left = self.paddle.left + self.paddle.width / 2
self.ball.top = self.paddle.top - self.ball.height
self.show_message("Press space to lanch the ball")
elif self.state == State_Over:
self.show_message("Game over! press R to play again")
elif self.state == State_Won:
self.show_message("You Win! press R to play again")
self.draw_bricks()
pg.draw.rect(self.screen, blue, self.paddle)
pg.draw.circle(self.screen, white, (self.ball.left + Ball_Radius,
self.ball.top + Ball_Radius), Ball_Radius)
self.show_stats()
self.fps.tick(60)
pg.display.update()
Fps, ๋์คํ๋ ์ด, ์ํ(state)์ ๋ฐ๋ฅธ ๋ฉ์ธ์ง ์ถ๋ ฅ ๋ฑ์ ๋ด๋นํ๋ run ๋ฉ์๋๋ฅผ ์์ฑํ๋ฉด ๋๋๋ค.
์๊น ๋งํ๋ฏ์ด init์์ ์๋์ฐ ์ฐฝ์ ํญ์ ์ด์ด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ๊ฒฝ์ฐ๋ while์ true๋ฅผ ์จ์ ๋ฌดํ๋ฃจํ์์ผฐ๋ค. ์ด์ ๊ฒ์ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด
์๊น ์ค์ ํ๋ ๋ชฉ์จ/์ค์ฝ์ด ๋ค์ ์ด์์๊ณ ์ํ๋ฉ์ธ์ง, ๋ฒฝ๋, ๊ณต, ํจ๋ค๊น์ง ์ด์์์ด ์ถ๋ ฅ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
์ํ๋ณํ์๋ ํฐ ์ด์์ด ์์ผ๋ฉฐ ์ค์ฝ์ด ๋ํ ์ ์ฌ๋ผ๊ฐ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์๋ค
์ธ์ ๋ ๊ทธ๋ฌ๋ฏ์ด ์๋์ ์ฝ๋ ์ ๋ฌธ์ ์ฒจ๋ถํ๋ค.
import pygame as pg
import sys
Size = [640, 480]
Width = Size[0]
Height = Size[1]
black = (0, 0, 0)
white = (255, 255, 255)
blue = (0, 0, 255)
yellow = (200, 200, 0)
State_Wait = 0
State_play = 1
State_Won = 2
State_Over = 3
Brick_Width = 60
Brick_Height = 15
Paddle_Width = 60
Paddle_Height = 15
Ball_Size = 16
Ball_Radius = int(Ball_Size/2)
Max_Paddle_X = Width - Paddle_Width
Max_Ball_X = Width - Ball_Size
Max_Ball_Y = Height - Ball_Size
Paddle_Y = Height - Paddle_Height - 10
class PingBall:
def __init__(self):
pg.init()
self.screen = pg.display.set_mode(Size)
pg.display.set_caption("PingBall_Game")
self.fps = pg.time.Clock()
self.font = pg.font.Font(None, 30)
self.init_game()
def init_game(self):
self.lives = 3
self.score = 0
self.state = State_Wait
self.paddle = pg.Rect(300, Paddle_Y, Paddle_Width, Paddle_Height)
self.ball = pg.Rect(300, Paddle_Y - Ball_Size, Ball_Size, Ball_Size)
self.create_bricks()
def create_bricks(self):
Y = 35
self.bricks = []
for i in range(7):
X = 35
for j in range(8):
self.bricks.append(pg.Rect(X, Y, Brick_Width, Brick_Height))
X += Brick_Width + 10
Y += Brick_Height + 5
def draw_bricks(self):
for brick in self.bricks:
pg.draw.rect(self.screen, yellow, brick)
def check_input(self):
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
self.paddle.left -= 5
if self.paddle.left < 0:
self.paddle.left = 0
if keys[pg.K_RIGHT]:
self.paddle.left += 5
if self.paddle.left > Max_Paddle_X:
self.paddle.left = Max_Paddle_X
if keys[pg.K_SPACE] and self.state == State_Wait:
self.ball_move = [5, -5]
self.state = State_play
if keys[pg.K_r] and (self.state == State_Over or self.state == State_Won):
self.init_game()
def move_ball(self):
self.ball.left += self.ball_move[0]
self.ball.top += self.ball_move[1]
if self.ball.left <= 0:
self.ball.left = 0
self.ball_move[0] = -self.ball_move[0]
elif self.ball.left >= Max_Ball_X:
self.ball.left = Max_Ball_X
self.ball_move[0] = -self.ball_move[0]
if self.ball.top < 0:
self.ball.top = 0
self.ball_move[1] = -self.ball_move[1]
def handle_collisions(self):
for brick in self.bricks:
if self.ball.colliderect(brick):
self.score += 1
self.ball_move[1] = -self.ball_move[1]
self.bricks.remove(brick)
break
if len(self.bricks) == 0:
self.state = State_Won
if self.ball.colliderect(self.paddle):
self.ball.top = Paddle_Y - Ball_Size
self.ball_move[1] = -self.ball_move[1]
elif self.ball.top > self.paddle.top:
self.lives -= 1
if self.lives > 0:
self.state = State_Wait
else:
self.state = State_Over
def show_stats(self):
if self.font:
font_surface = self.font.render("Score : " + str(self.score)
+ " Lives : " + str(self.lives), True, white)
self.screen.blit(font_surface, (205, 5))
def show_message(self, message):
if self.font:
size = self.font.size(message)
font_surface = self.font.render(message, False, white)
x = (Size[0] - size[0]) // 2
y = (Size[1] - size[1]) // 2
self.screen.blit(font_surface, (x, y))
def run(self):
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
self.screen.fill(black)
self.check_input()
if self.state == State_play:
self.move_ball()
self.handle_collisions()
elif self.state == State_Wait:
self.ball.left = self.paddle.left + self.paddle.width / 2
self.ball.top = self.paddle.top - self.ball.height
self.show_message("Press space to lanch the ball")
elif self.state == State_Over:
self.show_message("Game over! press R to play again")
elif self.state == State_Won:
self.show_message("You Win! press R to play again")
self.draw_bricks()
pg.draw.rect(self.screen, blue, self.paddle)
pg.draw.circle(self.screen, white, (self.ball.left + Ball_Radius,
self.ball.top + Ball_Radius), Ball_Radius)
self.show_stats()
self.fps.tick(60)
pg.display.update()
if __name__ == "__main__":
PingBall().run()