Задать вопрос
@webmaxer
Веб разработчик

Как правильно разработать возможность разнообразия характеристик у персонажей?

Пример:
Имеется класс-персонаж "Колобок", которым мы не управляем (бот). У него есть метод (некая внутренняя логика), который должен принимать решение при появлении на горизонте субъекта(ов): лиса, волк, заяц, медведь, а также их комбинаций, количество которых конечно. Задача состоит в том, чтобы у каждого колобка был уникальный характер, но в то же время у каждого из них зашиты одинаковые методы (идти, смотреть, говорить, обходить, убегать). При создании объекта Колобок, нужно как-то определить его характер, от которого будут зависеть дальнейшиие действия с другими субъектами игры и их комбинаций. Примеры разнообразия колобков:
- Первый при появлении на горизонте лисы должен убегать, при появлении зайца - поговорить с ним. У его брата (другой бот) похожий характер, но при встрече любого героя, отличного от зайца или лисы, запускается рандомный метод.
- У второго колобка, наоборот, при появлении на горизонте лисы - поговорить с ней (но в случае атаки - убегать), при появлении зайца - обходить стороной, если заяц движется в его сторону - перейти на бег.
- У третьего колобка другой характер - говорить только в том случае, когда все остальные герои находятся рядом, в остальных случаях - убегать.
И вот эта внутренняя логика у каждого колобка должна быть уникальна и зависеть от некоторых параметров (характера), переданных при создании объекта "Колобок".

Пока у меня есть мысль создать некоторую json структуру (характер колобка) и покрыть её switch/case, if/else, чтобы реализовать вариативность действий.

[{
  "visionArea": 0, // поле зрения
  "heroesActions": [
    "hero1": "action", // при появлении в поле зрения hero1, поговорить с ним, убежать и т.д.
    "hero2": "action",
  ],
  "multipleHeroesActions": [ // действия, в случае если несколько героев находятся рядом
    {
      "heroes": ["hero1, hero2, hero3"],
      "action": "action"
    },
    {
      "heroes": ["hero4, hero5, hero6"],
      "action": "action"
    },
  ]
}]


Думаю, таким вот образом, реализовать уникальное поведение у каждого бота-колобка. Правильно ли это? Я не совсем уверен, так как, на мой взгляд, это всё лютейший хардкодинг. Ищу как можно сделать лучше. Может есть готовые методики разработки характеристик для новичков-игроделов?
И вообще интересует, как в разработке игр называется такая задача и что почитать полезного, чтобы освоить такую тему?
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
{
  "parameters": {
    "speed": ...,
    "visionArea": ...,
    ...
  },
  "events": {
    "getSight": [
      {
        "objects": ["fox", "wolf"],
        "actions": [
          {
            "probability": 0.5,
            "action": "run"
          }, {
            "probability": 0.5,
            "action": "wait"
          }
        ]
      }, {
        "objects": ["carrot"],
        "actions": [
          {
            "probability": 1,
            "action": "eat"
          }
        ]
      }
    },
    "hungry": [ ... ],
    "thirsty": [ ... ].
    ...
  }
}
Ответ написан
@stictt
просто рак
Очень простая задача для проектирования. Наследуете общие черты колобков от базового класса, потом включением класса, композиция, через апкасты, включаете уникальную логику для нужного живого существа. Апкаст это приведение от частного к общему. Вы можете сделать 100500 классов, но реализуют они 1 интерфейс, у которого 1 интерфейс взаимодействия, и через приведение типов приводите любой из 100500 классов к интерфейсу, теперь без изменения кода, вы можете легко менять логику существа, где какой то из 100500 классов описывает эту логику для колобка. Этот подход очень гибкий, например, для другого колобка вы захотите чтобы он жрал зайцев, и держался на растоянии от лис, а афльфа колобки, или колобок главный герой, реализовывал уникальное поведение. Все это возможно без изменения логики самого колобка.
Ответ написан
Комментировать
Matmode
@Matmode
PHP/Symfony Developer
Максим не пробовали смотреть в сторону шаблона проектирования стратегия? Каждое поведение - определённая стратегия, описанная классом. За создание колобков будет отвечать фабрика, которая на вход принимает характер и использует маппер для получения необходимых стратегий поведения по характеру.
Сами стратегии можно комбинировать между собой используя паттерн проектирования декоратор.
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Я бы сделал так. Рандомизировал все характеристики для 100000 колобков, дальше запустил бы каждого в 100 случайных ситуаций с волками и лисами, и посмотрел бы, выживут они или нет. Потом оставил бы только тех, у кого 90% выживаемость. Характеры этих живчиков занёс бы в базу, и во время игры спавнил бы из базы случайного колобка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы