Напротив: MVC на самом деле очень хорошая вещь для использования в этом типе проблемы, и среда Swing действительно хорошо справляется с ее поддержкой.
Возможно, вам следует сначала прочитать MVC . В качестве обзора вы будете пытаться отделить, как игра представлена внутренне (модель), от того, как она нарисована (вид) и как это состояние должно измениться (контроллер).
Сначала подумайте обо всем, что вам нужно для моделирования текущего состояния игры. Наличие сущности, определяющей базовое поведение и делящей его на подклассы для PacMan и Ghost, как у вас, вероятно, является хорошим способом для начала, но вы, вероятно, захотите назвать свою карту GameBoard или тому подобное (присвоив вещам то же имя, что и библиотеке классы, как правило, плохая идея: вы не хотите путать это с java.util.Map). Чтобы завершить раздел модели, вы, вероятно, хотите объединить их в одном классе, который «знает» все состояние вашей игры. Поскольку это ваш класс GameState, вы, вероятно, хотите перерисовать стрелки.
Поскольку определение вида, скорее всего, будет довольно простым, вы можете пойти туда. Вы можете дать своему GameState метод draw (Graphics) и вызывать его из любого вашего вида (который вы решите позже). Это, в свою очередь, может делегировать каждый из ваших сущностей, которые, в свою очередь, могут делегировать его объекту Sprite или Image, который у них есть. Теперь ваша точка зрения, которая может быть JPanel или тому подобное, может просто вызвать draw (), используя свой собственный объект Graphics из своего метода paintComponent ().
Теперь вам все еще нужен контроллер, чтобы реально все происходило. Вероятно, это будет какой-то объект с KeyListener, подключенным к представлению, а также InputStream и OutputStream для обработки связи с другим игроком (вероятно, он также должен беспокоиться о синхронизации состояния игры). У него также должен быть таймер, чтобы он мог периодически указывать единицам обновления. Вам нужно решить, кто принимает решения о том, являются ли ходы законными: контролер может это сделать, GameState может или он может просто предоставить сущностям необходимую им информацию и позволить им сделать это самостоятельно.
Когда у вас есть все эти части, вы можете заключить их в один заключительный класс, который знает все, все настраивает и тому подобное. Есть еще кое-что, о чем я говорю, и еще несколько решений, которые вы должны принять, но это должно помочь вам.