import math
import random
import pygame
import sys
class Ball :
def __init__ ( self, radius) :
self. radius = radius
self. pos = [ screen_width // 2 , screen_height - 20 - radius]
self. velocity = [ 2 , - 2 ]
def draw ( self, surface) :
pygame. draw. circle( surface, WHITE, self. pos, self. radius)
def update ( self) :
self. pos[ 0 ] += self. velocity[ 0 ]
self. pos[ 1 ] += self. velocity[ 1 ]
if self. pos[ 0 ] < self. radius or self. pos[ 0 ] > ( screen_width - self. radius) :
self. velocity[ 0 ] *= - 1
if self. pos[ 1 ] <= self. radius or self. pos[ 1 ] > ( screen_height - self. radius) :
self. velocity[ 1 ] *= - 1
class Paddle :
def __init__ ( self, width, height) :
self. width = width
self. height = height
self. pos = [ screen_width // 2 - width // 2 , screen_height - 20 ]
self. velocity = [ - 5 , 0 ]
def draw ( self, surface) :
pygame. draw. rect( surface, WHITE, ( self. pos[ 0 ] , self. pos[ 1 ] , self. width, self. height) , 0 , 0 )
def update ( self) :
keys = pygame. key. get_pressed( )
if keys[ pygame. K_LEFT] and self. pos[ 0 ] > 0 :
self. pos[ 0 ] += self. velocity[ 0 ]
if keys[ pygame. K_RIGHT] and self. pos[ 0 ] < screen_width - self. width:
self. pos[ 0 ] -= self. velocity[ 0 ]
class Brick :
def __init__ ( self, x, y, width, height, color) :
self. rect = pygame. Rect( x, y, width, height)
self. color = color
def draw ( self, surface) :
pygame. draw. rect( surface, self. color, self. rect)
def check_collision ( ball, brick) :
if ( brick. rect. x - ball. radius <= ball. pos[ 0 ] <= brick. rect. x + brick. rect. width + ball. radius) and (
brick. rect. y <= ball. pos[ 1 ] <= brick. rect. y + brick. rect. height) :
return 1
if ( brick. rect. y - ball. radius <= ball. pos[ 1 ] <= brick. rect. y + brick. rect. height + ball. radius) and (
brick. rect. x <= ball. pos[ 0 ] <= brick. rect. x + brick. rect. width) :
return 2
return 0
def update_bricks ( ball, bricks) :
score = 0
for brick in bricks[ : ] :
if check_collision( ball, brick) == 1 :
bricks. remove( brick)
ball. velocity[ 0 ] *= - 1
score += 10
break
elif check_collision( ball, brick) == 2 :
bricks. remove( brick)
ball. velocity[ 1 ] *= - 1
score += 10
break
return score
def create_explosion ( brick) :
pass
def update_explosions ( explosions, bricks) :
for explosion in explosions[ : ] :
if explosion. is_finished( ) :
explosions. remove( explosion)
if explosion. intersects( brick) :
bricks. remove( brick)
if __name__ == '__main__' :
pygame. init( )
screen_width, screen_height = 640 , 480
screen = pygame. display. set_mode( ( screen_width, screen_height) )
pygame. display. set_caption( 'Bounce Game' )
clock = pygame. time. Clock( )
WHITE = ( 255 , 255 , 255 )
BLACK = ( 0 , 0 , 0 )
RED = ( 255 , 0 , 0 )
ball = Ball( 10 )
paddle = Paddle( 80 , 10 )
bricks = [ ]
for x in range ( 0 , screen_width, 80 ) :
for y in range ( 0 , screen_height // 4 , 20 ) :
brick = Brick( x + 2 , y + 2 , 80 - 2 , 20 - 2 , ( 255 , 255 , 255 ) )
bricks. append( brick)
score = 0
running = True
while running:
for event in pygame. event. get( ) :
if event. type == pygame. QUIT:
running = False
ball. update( )
paddle. update( )
if ball. pos[ 1 ] + ball. radius > paddle. pos[ 1 ] :
if ball. pos[ 0 ] < paddle. pos[ 0 ] or ball. pos[ 0 ] > paddle. pos[ 0 ] + paddle. width:
score -= 1
else :
ss = abs ( ball. pos[ 0 ] - ( paddle. pos[ 0 ] + paddle. width// 2 ) ) / 20
ball. velocity[ 0 ] = 2 + ss* 2
ball. velocity[ 1 ] *= - 1
screen. fill( BLACK)
ball. draw( screen)
paddle. draw( screen)
xx = random. randint( 0 , 255 )
for brick in bricks:
brick. draw( screen)
if ball. pos[ 1 ] <= screen_height// 2 :
score += update_bricks( ball, bricks)
font = pygame. font. Font( None , 36 )
score_text = font. render( 'Score: ' + str ( score) , True , RED)
screen. blit( score_text, ( 10 , 10 ) )
pygame. display. flip( )
clock. tick( 60 )
pygame. quit( )
sys. exit( )