Description
import tkinter
import time
CANVAS_WIDTH = 600 # Width of drawing canvas in pixels
CANVAS_HEIGHT = 800 # Height of drawing canvas in pixels
N_RAWS = 8 # How many rows of bricks are there?
N_COLMS = 10 # How many columns of bricks are there?
SPACING = 5 # How much space is there between each brick?
BRICK_START_Y = 50 # The y coordinate of the top-most brick
BRICK_HEIGHT = 20 # How many pixels high is each brick
BRICK_WIDTH = (CANVAS_WIDTH - (N_COLMS+1) * SPACING ) / N_COLMS
BALL_SIZE = 40
PADDLE_Y = CANVAS_HEIGHT - 40
PADDLE_WIDTH = 80
PADDLE_HEIGHT = 20
def main():
canvas = make_canvas(CANVAS_WIDTH, CANVAS_HEIGHT, 'Brick Breaker')
bricks_list = []
for raw in range(N_RAWS): # to draw all raws
for col in range(N_COLMS): # to draw all column
bricks_list.append(draw_rectangle(canvas, raw, col)) # calling rect function
ball = make_ball(canvas)
paddle = canvas.create_rectangle(CANVAS_WIDTH/2, CANVAS_HEIGHT - 40,
(CANVAS_WIDTH/2 - PADDLE_WIDTH/2) + PADDLE_WIDTH,
(CANVAS_HEIGHT - 40) + PADDLE_HEIGHT, fill='blue', outline='blue')
change_x = 10
change_y = 20
while True:
mouse_x = canvas.winfo_pointerx()
canvas.moveto(paddle, mouse_x, PADDLE_Y)
canvas.move(ball, change_x, change_y)
if hit_top_wall(canvas, ball) or hit_bottom_wall(canvas, ball):
change_y = change_y * -1
elif hit_right_wall(canvas, ball) or hit_left_wall(canvas, ball):
change_x = change_x * -1
elif hit_paddle(canvas, ball, paddle):
change_y = change_y * -1
elif hit_bricks(canvas, ball, bricks_list):
change_y = change_y * -1
canvas.update()
time.sleep(1/17)
def draw_rectangle(canvas, raw, col): # define function to creat rectangle
x1 = SPACING + (SPACING * col) + (BRICK_WIDTH * col)
y1 = BRICK_START_Y + (SPACING * raw) + (BRICK_HEIGHT * raw)
x2 = x1 + BRICK_WIDTH
y2 = y1 + BRICK_HEIGHT
color = 'red'
return canvas.create_rectangle(x1, y1, x2, y2, fill=color, outline=color)
def make_ball(canvas):
x1 = (CANVAS_WIDTH / 2) - (BALL_SIZE / 2)
y1 = (CANVAS_HEIGHT / 2) - (BALL_SIZE / 2)
return canvas.create_oval(x1, y1, x1 + BALL_SIZE, y1 + BALL_SIZE, fill='black')
def hit_bottom_wall(canvas, ball):
ball_top_y = get_top_y(canvas, ball)
return ball_top_y > CANVAS_HEIGHT - BALL_SIZE
def hit_right_wall(canvas, ball):
ball_left_x = get_left_x(canvas, ball)
return ball_left_x > CANVAS_WIDTH - BALL_SIZE
def hit_top_wall(canvas, ball):
ball_top_y = get_top_y(canvas, ball)
return ball_top_y == 0
def hit_left_wall(canvas, ball):
ball_left_x = get_left_x(canvas, ball)
return ball_left_x == 0
def hit_paddle(canvas, ball, paddle):
ball_coords = canvas.coords(ball)
x1 = ball_coords[0]
y1 = ball_coords[1]
x2 = ball_coords[2]
y2 = ball_coords[3]
colliding_list = canvas.find_overlapping(x1, y1, x2, y2)
return len(colliding_list) > 1 and (colliding_list[0] == paddle or colliding_list[1] == paddle)
def hit_bricks(canvas, ball, bricks_list):
ball_coords = canvas.coords(ball)
x1 = ball_coords[0]
y1 = ball_coords[1]
x2 = ball_coords[2]
y2 = ball_coords[3]
colliding_list = canvas.find_overlapping(x1, y1, x2, y2)
brick_hit = False
for collided_object in colliding_list:
if collided_object in bricks_list:
canvas.delete(collided_object)
brick_hit = True
return brick_hit
def get_left_x(canvas, obj):
return canvas.coords(obj)[0]
def get_top_y(canvas, obj):
return canvas.coords(obj)[1]
def make_canvas(width, height, title):
top = tkinter.Tk()
top.minsize(width=width, height=height)
top.title(title)
canvas = tkinter.Canvas(top, width=width + 1, height=height + 1)
canvas.pack()
return canvas
4
if __name__ == '__main__':
main()