Wow, it's been a very long time since my last case study! Well now, I'm here to give you a great one: Breakout!
Let's start with the mechanics, as usual:
You control a single paddle that can move left and right.
There is a 2D array of blocks.
The Paddle is at the bottom of the screen, the blocks are at the top.
How do you write your classes? Are they neatly divided into different member functions, each one handling a small responsibility that plays into the larger responsibility of the class? If they are, good for you! You're following one of the main Principles of clean code, the single responsibility principle. However you're taking it a step...