" Мой вопрос заключается в том, что, думая об объектно-ориентированном дизайне, я на правильном пути, чтобы сделать это как можно более простым кодом? "
Нет, и ваше описание использует основные глаголы, которые описывают, как ваш дизайн построен на слишком большом количестве наследования.
Физические объекты имеют размеры x и y (положение).
[Объект роуминга - это физический объект, который имеет изменяемое положение]
Гуманоидные объекты - это перемещающиеся объекты, которые имеют запасы.
Игрок является синглтоном гуманоидным объектом, который может иметь группу
[Партия имеет игрока и] имеет до 4 NPC-гуманоидов
Композиция, хотя слишком редко подчеркивается в объектно-ориентированном дизайне, играет роль в коде. Вот почему различие имеет-1030 * / является-1032 * так часто используется в анализе.
Объявляя игрока одиночным игроком, вы добавили сложность шрифта и, возможно, ограничили свой дизайн. Что если вы хотите иметь двух игроков в будущем? Как насчет большего? Это не является необоснованным расширением, но потребует, чтобы вы нарушили используемый одноэлементный анти-шаблон. Если вам нужен только один игрок, создайте только один экземпляр; кодирование предположения о единственности в классе неоправданно ограничивает. Помните, что кодер должен утвердительно вызывать конструктор и не должен беспокоиться о появлении игроков спонтанно.
У объекта есть отличная позиция: дайте ему одну композицию. Позицию можно изменить, поэтому определите position :: move (). У игрока может быть человек-контролер, который отличает его от NPC, но - по определению - персонаж, не являющийся игроком - это персонаж, у которого есть контроль, который не приходит от игрока. Можете ли вы дать игроку NPC контроль? Многие игры делают, но если вы уже закодировали зависимость персонажа от игрока внутри класса, NPC всегда будет NPC.
Кроме того, насколько вы уверены, что 4 (или 5) - хорошее число для вечеринки? Принцип Zero, One, Infinity гласит, что если вы разрешите более одного, разрешите произвольное число. Если вы не жестко закодируете «пятерку» в своем дизайне, вы ограничите гибкость.
Я обычно рекомендую, чтобы дизайнеры рассматривали наследование как метод последней инстанции из-за истории чрезмерного использования. Дизайн может быть ООП без наследования вообще. Полиморфизм - это круто, но инкапсуляция и абстракция - это, может быть, даже больше.