If you have just finished learning Python and are looking for some cool Python projects to try, then you are on the right page. Here we will be coding an amazing game which I am pretty sure all of you must have played, it is the Brick Breaker game.
We will use the Python turtle module for building the game. If you haven't completed learning Python, I suggest you first learn Python using our beginner-friendly free course and then try this.
If this is the first time that you are using the turtle module, then you first need to install it. I prefer creating a virtual environment when I start learning any new module, if you like doing the same, then you are smart.
If you are a macOS User or Linux user, run the following command to create a new virtual environment:
python3 -m venv turtle_env
Once the environment is created, let's activate it:
If you are a Windows user then, you need to install virtualenv module to set up a virtual environment. It is pretty simple using pip in Python.
To install virtualenv module, run: (Python 3 and pip should be already installed)
pip install virtualenv
Then create a new environment,
Then start the virtual environment,
# go inside the environment directory cd turtle/env/Scripts # activate the environment ACTIVATE
Once the virtual environment setup is done. We need to install the turtle module to start using it for game development.
Run the following command to install the turtle module:
pip install turtle
Now that we have everything setup, it's time to see the code for the game.
Tutorial for Beginners: Learn Python
In this game, we have the following main components:
Player (The horizontal bar at the bottom on which the ball bounces to g back and hit the bricks)
Showing the score
Boundary of the Game
And on top of these components, we have to handle the following:
Collision between the ball and the player
Movement of the Player
Collision of the Ball and the Bricks
Ball bouncing off the boundaries of the game window
End of the game
Increment the score
So let's see the code now. Here is the complete code the game.
# The Brick Breaker Game # import liabries import turtle import random screen = turtle.Screen() screen.tracer(0) screen.bgcolor("black") # Set up the boundry turtle so there will be a boundry for the game boundaryT = turtle.Turtle() boundaryT.color("blue") boundaryT.speed(0) boundaryT.penup() boundaryT.goto(-250,250) boundaryT.pendown() boundaryT.begin_fill() for x in range(4): boundaryT.forward(500) boundaryT.right(90) boundaryT.begin_fill() boundaryT.end_fill() boundaryT.ht() screen.update() # Set up the score turtle to keep track of how many points the player has won scoreT = turtle.Turtle() scoreT.color("light steel blue") scoreT.speed(0) scoreT.penup() scoreT.goto(-250,260) score = 0 scoreT.write("Score: " + str(score), font=("Fixedsys",12,"normal")) scoreT.ht() # set up the player turtle(paddle) player = turtle.Turtle() player.penup() player.goto(-100,-240) player.color("deep pink") screen.register_shape("paddle",((0,0),(20,0),(20,100),(0,100))) player.shape("paddle") ball = turtle.Turtle() ball.shape("circle") ball.color("white") ball.penup() ball.goto(-50,-210) ball.setheading(random.randint(1,179)) screen.update() # Create an empty list # add the bricks turtle to the list and set them up # when setting up create 3 rows of the brick turtles screen.register_shape("brick",((0,0),(10,0),(10,50),(0,50))) colors = ["sky blue", "tomato", "lime green","yellow"] def makeRow(x,y,colors): index = random.randint(0,len(colors)-1) row =  for i in range(8): targetT = turtle.Turtle() targetT.speed(0) targetT.shape("brick") targetT.color(colors[index]) targetT.penup() targetT.goto(x + 60*i,y) targetT.pendown() row.append(targetT) index = random.randint(0,len(colors)- 1) return row screen.update() # Write the event Listeners (left and right) def right(): player.forward(10) screen.onkey(right, "Right") def left(): player.backward(10) screen.onkey(left, "Left") screen.listen() # def checkcollison between the ball and obj # return true or false def checkCollisonBrick(obj): if abs(ball.xcor() - obj.xcor()) < 50 and obj.ycor() <= ball.ycor() <= obj.ycor() + 10 : print("colided with the brick:", obj) return True return False def checkCollisonPaddle(obj): if abs(ball.xcor() - obj.xcor()) < 100 and (obj.ycor() <= ball.ycor() <= obj.ycor() + 20) : return True return False #ball.left(90) # def the bounce so the ball will bounce of things not just turn 180 def bounce(context): #top if context == "top" or context == "paddle": ball.setheading(360 - ball.heading()) #top half of screen elif 180 > ball.heading() >= 0: ball.setheading(180 - ball.heading()) #bottom half elif 180 <= ball.heading() < 360: ball.setheading(540 - ball.heading()) screen.update() def countList(): count =  for i in range(8): count.append(0) return count def hitBrick(row, count, goal): global score for x in range(len(row)): #checks to see if this specific brick collided with ball if checkCollisonBrick(row[x]): #checks if brick should disappear if count[x] > goal: row[x].ht() row[x].penup() row[x].goto(-1000,1000) else: #brick can still be hit more count[x] += 1 bounce("paddle") score = updateScore(score) return count def updateScore(score): score += 5 scoreT.clear() scoreT.write("Score: " + str(score), font=("Fixedsys",12,"normal")) return score row1 = makeRow(-230,200,colors) count1 = countList() row2 = makeRow(-230,170,colors) count2 = countList() row3 = makeRow(-230,140,colors) count3 = countList() row4 = makeRow(-230,110,colors) count4 = countList() gameContinue=True #while loop while gameContinue: ball.forward(5) screen.update() # if checkcollison with ball and paddle then the ball sould bounce off count1 = hitBrick(row1, count1, 4) count2 = hitBrick(row2, count2, 3) count3 = hitBrick(row3, count3, 2) count4 = hitBrick(row4, count4, 1) #if score = 100 then boundry turtle will write you win on the screen #5 points each time ball hits one brick if ball.ycor() < -240: boundaryT.penup() boundaryT.goto(-200,0) boundaryT.color("midnight blue") boundaryT.write("YOU LOSE! :( ", font=("Fixedsys",48,"normal")) gameContinue=False if score == 720: boundaryT.penup() boundaryT.goto(-200,0) boundaryT.color("orange") boundaryT.write("You Win!!! :)", font=("Fixedsys",48,"normal")) gameContinue=False # if the ball hits the top, left, and right side it should bounce back #right side if ball.xcor() > 240: bounce("right") #left side if ball.xcor() < -240: bounce("left") #top side if ball.ycor() > 240: bounce("top") #hits paddle if checkCollisonPaddle(player): bounce("paddle") #if paddle hits the right edge if player.xcor() + 100 > 240: player.backward(10) #if paddle hits the left edge if player.xcor() < -240: player.forward(10) # if the ball hits the botttom of the screen then while loop should stop screen.update()
In the above code, you will find the following functions:
To create the rows of the bricks in the game which are then hit by the ball to break them.
These functions are used to move the player, left and right.
This function will check if the ball collides with the bricks in the 4 brick rows in the game.
This function will check if the ball hits the player paddle to bounce back.
This function makes sure that the ball bounces off back just like a real ball will be based on the angle with which it hits the player paddle, or the game wall boundaries, or the bricks.
hitBrick(row, count, goal)
This function captures the ball hitting the brick event and then increments the score which is displayed at the top of the game window.
This function updates the total score of the game based on the ball hitting the bricks.
We have a while loop that runs infinitely until the ball hits the bottom wall after missing the player paddle, only then the game ends otherwise the game keeps on running.
You can find this while loop at the end of the code.
Here is how the game will look.
To run the code, save it in a python file, follow the initial setup steps, and then use the python command to run the code. If you name the code file as brick-break.py, then to run the code, run the following command:
And enjoy the game. If you face any issues, then please share in the comment section below.