Движок робокода: как спроектировать (написать) движок исполнения - мир роботов

У IBM есть (была) бесплатная программа изучения Java под названием RoboCode, в которой можно было бы написать пользовательских роботов, которые затем будут сражаться в 2D-пространстве. Я хотел бы написать среду, которая поддерживает такие роботы, но не знаю, какой шаблон или дизайн использовать. Каждый робот - это нить. Каждый поток получает определенное (неопределенное) количество времени выполнения JRE. Двигатель мира роботов должен был начать с составления списка игроков / роботов, а затем войти в цикл, который позволяет каждому игроку по очереди делать все, что ему нравится: двигаться вперед, поворачивать налево, стрелять в направлении северо-западного угла, что угодно. Каждый робот также информируется о событиях, представляющих интерес: враг или несколько врагов находятся в пределах досягаемости, он был поражен пулей и т. Д.

Комбинация обработки потоков, которые также являются слушателями событий (они также являются производителями?), Сбивает меня с толку; кажется, что это еще не все в игровой движок. Даже некоторые общие идеи помогут.

1 ответ

Я разработчик двигателя Robocode. Я присоединился 2 года назад и большую часть времени проводил рефакторинг движка Robocode. Я написал пару статей в то время, как мое понимание выросло. Не все из них являются современными, подумал.

Есть несколько сложных частей об этом:

1) синхронизация: мы решили это путем "отправки" сообщений между роботом и битвой. Обновление пользовательского интерфейса и других компонентов производится производителем / потребителем с помощью неизменяемых сообщений о каждом новом состоянии (тик игры)

2) песочница вредоносного кода (изучите наш код)

3) разработка API и правил, которые должны быть постоянными в течение долгих лет, потому что двигатель развивается, старые роботы остаются такими же, но они должны работать и забивать так же, как и раньше. Здесь мы столкнулись с несколькими проблемами, например, люди используют классы из API в своей собственной логике. Это не было намерением. Мы должны были сделать классы окончательными и с защищенными конструкторами. Но теперь мы не можем изменить его, чтобы не сломать существующих роботов.

На ваш вопрос о событиях в Robocode. Все они приходят каждый тик, мы заполняем EventManager (приоритетная очередь), а затем робот тянет один за другим. Вызов отправляется обратно в реализацию робота для каждого события. Подписка автоматическая, реализация всегда присутствует в базовом классе, и вы можете переопределить ее в классе роботов. Есть одна нить для робота.

Кстати: следующая большая вещь, кажется, это расширение Robocode, чтобы учесть настраиваемые / подключаемые правила. Это проблема дизайна. Мы ищем умных, трудолюбивых людей, которые присоединятся к проекту Robocode, чтобы помочь нам. Заинтересованы?

Другие вопросы по тегам