Шаблон проектирования "Стратегия" на практике
В последнее время очень заинтересовался шаблонами проектирования. Даже шпаргалку для себя составил (извините, что ссылаюсь на свой же сайт). Просто для наглядности. По мере изучения - вроде бы всё прозрачно и понятно. Но практика просто "убивает".
Очень заинтересовал паттерн "Стратегия". И вот я решил его как-то попытаться применить. Нашел, как я думаю, прикладное применение. Хочется этим инструментом порешать задачу.
Суть в следующем. Есть онлайн-игра "Forge of Empires". Одной из "проблем" которой - есть оптимальное размещение сущностей. Далее чуть подробно.
1.В игре есть игровое поле, сформированное областями-квадратами с количеством ячеек 4x4
Пример:
Игровое поле, как правило, "не имеет пустот".
2.В игре есть "сущности" разной геометрии, например, 1x1, 2x2, 3x4, 7x5 & etc.
Которые нужно оптимально разместить на поле игры так, чтобы оставшаяся область была максимальной по площади. Это цель
3.В игре некоторые сущности обязательно должны соседствовать с другими типами сущностей
Как пример, некоторые сущности "объекты" должны соседствовать с сущностями "путь". Это условие
4.Сущности "путь" должны быть непрерывны от точки назначения
На рисунке выше - это зелёная область. Это условие
5.Сущности "путь" могут иметь геометрию 1x1, 2x2.
Это условие
6.Сущности "объекты" могут иметь условие (а могут и не иметь)
Должны граничить с сущностями "путями" размером не менее 2x2, или не менее 1x1, или вовсе не обязательно граничить.
Но вот вроде бы и все рамки условий ограничений. Честно говоря, мне на ум приходит просто полный перебор. Но это самое очевидное и самое тупое решение. И самое затратное.
НО ТУТ "стратегией" даже и не пахнет!
Прошу тех, кто хорошо "качает" стратегии - просто расписать, как мне решить данную проблему в рамках сабжа. Ну или хотя бы просто набор "направлений" куда смотреть и чего копать.
Ответы (1 шт):
Как написано у вас на сайте, шаблон "Стратегия" подразумевает гибкое/динамическое переключение между алгоритмами решения задачи.
В случае игр это может означать, что у вас есть несколько семейств алгоритмов для бота. Например, один бот играет полным перебором, второй реализует минимакс (и у него могут быть разные стратегии оценки позиции и разная глубина поиска), третий использует ИИ для выбора следующего хода. Ваше приложение переключается между стратегиями в зависимости от некоторых условий - например, выбранного уровня сложности или уровня нагрузки на ЦПУ. Скажем, на лёгком уровне используется бот-минимакс с небольшой глубиной просмотра и простым алгоритмом оценка, а на максимальном уровне - бот с полным перебором.
Для того, чтобы эту сову натянуть на глобус вашей задачи, нужно
Выбрать разные семейства алгоритмов заполнения карты. Например, сначала случайным образом накидать объекты, затем случайным образом провести между ними дороги; или сначала проложить дороги, а затем раскидать по ним объекты; или ... Ваша игра - вам решать, что можно сделать.
Определить критерии переключения между стратегиями. Какие есть внешние параметры (например, размер карты), какая стратегия подходит для разных классов параметров.
Как-то так.
