Как создать игру, в которой люди сражаются с роботами, собирая их в dll? - PullRequest
2 голосов
/ 29 февраля 2012

Чтобы перестать быть субъективным, у меня есть пара конкретных вопросов о том, как это сделать.Прежде всего, я высказал предположение, как лучше всего это сделать.Мой основной язык - C #.

Мне нужна более краткая информация для начала (например, проверить X, использовать метод Y), а не какое-то полное решение.


У меня будет какое-то серверное приложение, которое загружается в 2 скомпилированные библиотеки, robot1.dll и robot2.dll, которые создаются извне.

Я настрою сервер, создав два экземпляра робота, поместив их вАрена и их битва.Сначала я вызову метод Setup (), передавая интерфейс, такой как IRobot (без каламбура), например:

interface IRobot
{
   ScanResult Scan();
   void MoveForwards();
   void MoveBackwards();
   void ShootGun();
}

А затем просто вызову DoStuff () для обоих dll по таймеру.Тогда внутренняя логика каждого из них будет вызывать методы, в основном посредством отражения, для работы роботов.

В dll робота в основном будет входить RobotLibrary.dll, который будет содержать интерфейс IRobot, а также, возможно, базовый класс Robot.,Затем, чтобы создать робота, они просто делают

public class MyRobot : Robot

и автоматически запускают:

public class MyRobot : Robot
{
  private IRobot _robot;
  public void Setup(IRobot Robot)
  {
    this._robot = Robot;
  }

  public void DoStuff()
  {
    this._robot.MoveForwards();
  }
}

Мои вопросы:

  • Лучше ли использовать интерфейс для вызова серверных методов, или я должен делать это в обратном порядке, когда у робота просто есть метод Command DoStuff(), который возвращает команду, которая анализируется в инструкции?Есть ли еще лучший способ?

  • Я хочу, чтобы людям было очень легко написать робота.Достаточно ли просто импортировать библиотеку и создать класс, реализующий абстрактный класс IRobot или Robot, или есть лучший способ?

  • Можно ли будет сделать его совместимым между различными языками?Если кто-то создаст .dll, написанный на другом языке программирования (например, C ++), он все еще будет работать?

  • Смогут ли люди обмануть или взломать систему, используя этот метод, и еслитак как я могу их остановить?Не просто взлом игры, но даже компрометация сервера / системы тоже.Я не хочу, чтобы люди писали вещи, которые сканируют ОС или устанавливают вирус и т. Д.

  • Дополнительный вопрос, можно ли рассчитывать вызовы методов так, чтобы более сложные вещи выполнял ваш робот?Чем медленнее сервер обрабатывает команды?

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Ответы в том же порядке, что и вопросы:

  1. Я бы предпочел, чтобы DoStuff возвращал команду (или серию команд), а не работал с IRobot интерфейсом. ИМО, его легко понять, в отличие от другого интерфейса, в котором перечислены возможные команды!
  2. Да, предоставление абстрактной реализации сделает так, что авторам придется писать только логику, которую они должны писать, не беспокоясь о каком-либо слесарном / инфраструктурном коде. Однако написание роботов на языке, отличном от .NET, будет по-прежнему затруднено, если вы не сможете предоставить реализации роботов-оболочек (подробнее см. Следующий пункт).
  3. Это будет совместимо на любом .NET-совместимом языке (а их немало). Для отдыха вы можете подумать о создании роботов-обёрток, которые могут осуществлять дуплексную связь, скажем, по именованным каналам, сокетам TCP / IP, входу / выходу std и т. Д. Протокол связи может быть очень простым, обертка вызывает PING с реальным роботом, отвечающим командой. Например, робот-обертка, вызывающий фактический исполняемый файл робота и проверяющий соединение через стандартный ввод и получающий команды из стандартного вывода. Или отправив HTTP-запрос на URL-адрес и получив команду в качестве ответа - это позволит вам даже создавать удаленных роботов.
  4. Вам нужно выполнить песочницу, то есть загрузить роботов в другой домен приложений и применить свою политику безопасности к домену приложений. Если вы выбираете удаленных роботов, тогда этот вопрос становится немым.
  5. В идеале, вы должны разрешить роботу делать только определенный промежуток времени (и API-интерфейс для песочницы). Вы можете иметь общее разрешенное время для X ходов вроде всего!
1 голос
/ 29 февраля 2012

Возможно, вы захотите взглянуть на каркасы плагинов для .NET и на то, как они работают. Обычно кто-то пишет роботу для предоставления библиотеки DLL, которая экспортирует (в некоторой степени в зависимости от инфраструктуры плагинов) объект, реализующий интерфейс, предоставленный вашим кодом. Затем ваш код обращается к этому интерфейсу, чтобы сообщить роботу об окружающей среде и выяснить, что делает робот.

Многоязычная поддержка хороша, если расширена совместимость с .NET, то есть, если ваше ядро ​​находится на C #, будет легко извлечь что-либо написанное на любом языке .NET, способном реализовать интерфейс плагина в правильный путь. Так что да, они могут использовать C ++, если они используют C ++ / CLI. Они также могут использовать Clojure / CLR, Niecza, Nemerle и т. Д.

Если вы хотите сделать его максимально совместимым с как можно большим количеством вещей, вам необходимо поддерживать библиотеки C в виде плагинов - C подобен базовому уровню межязыковой совместимости, и существует множество языков, которые могут представлять C-подобный интерфейс к миру. Хотя иногда приходится прыгать через какие-то ужасные обручи, чтобы это сработало.

Что касается безопасности, то в базовой форме вы смотрите на свободный код в DLL, поэтому он может делать абсолютно все, что угодно в рамках разрешений, предоставляемых операционной системой (при условии наличия ошибок безопасности в ОС, это означает что угодно совсем). Песочница для DLL-библиотек - хорошая идея, но ее нетривиально достичь. Если вам повезет, вы можете подключиться к системе песочницы .NET / Silverlight.

Совершенно другая идея состоит в том, чтобы определить протокол механизма робота <-> как сетевой протокол, чтобы роботы подключались к главному серверу и обменивались данными с помощью некоторого простого проводного протокола. Это позволило бы устранить проблемы с совместимостью языков - вы могли бы написать это во всем, что может обрабатывать сетевые подключения, - и вы могли бы запустить его на другом компьютере или, возможно, в виртуальной машине на том же компьютере, что дает вам форму «песочницы», если безопасность беспокойство, поскольку тогда это могло только уничтожить ВМ.

Вариант того, что я видел в системе боевых роботов много лет назад, - это написать каждого робота как исполняемый файл, который связывается через stdin и stdout с родительским процессом, который отвечает за его запуск и присоединение каналов к дочернему процессу, что они могут общаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...