Coding Breakout’s brick-breaking action | Wireframe #11
Atari’s Breakout was one of the earliest video game blockbusters. Here’s how to recreate it in Python.
The games industry owes a lot to the humble bat and ball. Designed by Allan Alcorn in 1972, Pong was a simplified version of table tennis, where the player moved a bat and scored points by ricocheting a ball past their opponent. About four years later, Atari’s Nolan Bushnell and Steve Bristow figured out a way of making Pong into a single-player game. The result was 1976’s Breakout, which rotated Pong’s action 90 degrees and replaced the second player with a wall of bricks.
Points were scored by deflecting the ball off the bat and destroying the bricks; as in Pong, the player would lose the game if the ball left the play area. Breakout was a hit for Atari, and remains one of those game ideas that has never quite faded from view; in the 1980s, Taito’s Arkanoid updated the action with collectible power-ups, multiple stages with different layouts of bricks, and enemies that disrupted the trajectory of the player’s ball.
Breakout had an impact on other genres too: game designer Tomohiro Nishikado came up with the idea for Space Invaders by switching Breakout’s bat with a base that shot bullets, while Breakout’s bricks became aliens that moved and fired back at the player.
Bricks and balls in Python
The code above, written by Daniel Pope, shows you just how easy it is to get a basic version of Breakout up and running in Python, using the Pygame Zero library. Like Atari’s original, this version draws a wall of blocks on the screen, sets a ball bouncing around, and gives the player a paddle, which can be controlled by moving the mouse left and right. The ball physics are simple to grasp too. The ball has a velocity,
vel – which is a vector, or a pair of numbers:
vx for the x direction and
vy for the y direction.
The program loop checks the position of the ball and whether it’s collided with a brick or the edge of the play area. If the ball hits the left side of the play area, the ball’s x velocity
vx is set to positive, thus sending it bouncing to the right. If the ball hits the right side,
vx is set to a negative number, so the ball moves left. Likewise, when the ball hits the top or bottom of a brick, we set the sign of the y velocity
vy, and so on for the collisions with the bat and the top of the play area and the sides of bricks. Collisions set the sign of
vy but never change the magnitude. This is called a perfectly elastic collision.
To this basic framework, you could add all kinds of additional features: a 2012 talk by developers Martin Jonasson and Petri Purho, which you can watch on YouTube here, shows how the Breakout concept can be given new life with the addition of a few modern design ideas.
You can read this feature and more besides in Wireframe issue 11, available now in Tesco, WHSmith, and all good independent UK newsagents.
Or you can buy Wireframe directly from us – worldwide delivery is available. And if you’d like to own a handy digital version of the magazine, you can also download a free PDF.
Make sure to follow Wireframe on Twitter and Facebook for updates and exclusives, and for subscriptions, visit the Wireframe website to save 49% compared to newsstand pricing!
How does it use pygame zero without importing pygame zero?
Ryan L — post author
I put this question to Mr Daniel Pope, and he had this to say:
“Pygame Zero has its own runner, pgzrun, which injects what you need for simple games as extra builtins, and then runs the game loop.
pgzrun has two modes: command line tool and magic import.”
Hope that helps!
Turns out Python is super fussy with indentation :) Anyhow, for about 10 minutes worth of typing, and 10 minutes of debugging, got it working. The lack of imported library for pygame zero had me thrown too initially. Now looking to add some features like sound, high scores, and levels. Cheers.