Хороший или плохой дизайн проявляется в том, насколько хорошо он соответствует неожиданным требованиям, поэтому я бы посоветовал держать запас потенциальных «игровых функций» под рукой, чтобы сообщить о своих дизайнерских решениях. Поскольку вы делаете это как учебный проект, вы можете позволить себе сойти с ума.
Арканоид - очень хороший выбор для этого, он предлагает так много вариантов. Заставьте разные кирпичи набирать разное количество очков. Сделайте несколько кирпичей изменить счет других кирпичей при попадании. Сделать несколько кирпичей, требующих нескольких попаданий. Дайте суперспособности мячу, веслу или кирпичу. Изменяйте эти способности: одна из них делает шарик управляемым с клавиатуры, другая делает его прозрачным, другой меняет направление на гравитацию и так далее. Заставьте кирпичи бросать предметы.
Цель состоит в том, чтобы при внесении такого изменения оно влияло на минимально возможное количество классов и методов. Узнайте, как ваш дизайн должен измениться, чтобы соответствовать этому критерию.
Используйте интегрированную среду разработки, в которой есть меню «Рефакторинг», в частности, метод перемещения рефакторинг. (Если нет, прочитайте книгу Рефакторинг .) Поэкспериментируйте с размещением различных методов здесь и там. Обратите внимание, что становится трудно изменить, когда метод помещен «неправильно», и что становится легче, когда вы размещаете его в другом месте. Методы размещаются правильно, когда объекты заботятся о своем собственном состоянии; Вы можете «сказать» объекту, чтобы он что-то сделал, вместо того, чтобы «задавать» ему вопросы о его состоянии, а затем принимать решения на основе его ответов.
Давайте предположим, что в вашем дизайне каждый спрайт является экземпляром объекта. (Вы можете выбрать другие стратегии.) Как правило, движение изменяет состояние спрайта, поэтому метод, описывающий движение для определенного вида спрайта, вероятно, принадлежит классу этого спрайта.
Обнаружение столкновений является чувствительной частью кода, поскольку потенциально включает в себя проверку всех возможных пар спрайтов. Вы захотите различить проверку на наличие коллизий и информирование объектов о коллизиях. Например, ваш шаровой объект должен изменить свое движение при столкновении с веслом. Но алгоритм обнаружения столкновений вообще не будет принадлежать классу мяча, так как другие пары объектов могут сталкиваться с последствиями, которые имеют значение для игры.
И так далее ...