На PPCG у нас часто бывают вызовы King of the Hill , в которых разные боты кода сталкиваются друг с другом. Нам не нравится ограничивать эти проблемы одним языком, поэтому мы осуществляем кросс-платформенную связь через стандартный ввод-вывод.
Моя цель - написать фреймворк, который авторы задач смогут использовать для облегчения написания этих задач. Я выдвинул следующие требования, которые хотел бы выполнить:
Автор запросов может создать класс, в котором методы представляют каждое отдельное сообщение . Например, на нашем задании «Добро против зла» писатель создает
Player
класс, в котором естьabstract boolean vote(List<List<Boolean>> history)
метод.Контроллер может предоставлять экземпляры вышеуказанного класса, которые обмениваются данными через стандартный ввод-вывод при вызове вышеупомянутых методов . Тем не менее, не все экземпляры вышеуказанного класса обязательно будут обмениваться данными через стандартный ввод-вывод. 3 из ботов могут быть нативными Java-ботами (которые просто переопределяют
Player
класс, где еще 2 находятся на другом языке)Методы не всегда будут иметь одинаковое количество аргументов (и при этом они не всегда будут иметь возвращаемое значение)
Мне бы хотелось, чтобы авторы задач выполняли как можно меньше работы, чтобы работать с моей структурой.
Я не против использования рефлексии для решения этих проблем. Я рассмотрел требование автора запроса сделать что-то вроде:
class PlayerComm extends Player {
private Communicator communicator;
public PlayerComm(Communicator communicator){
this.communicator = communicator;
}
@Override
boolean vote(List<List<Boolean>> history){
return (Boolean)communicator.sendMessage(history);
}
}
но если есть несколько методов, это может стать довольно повторяющимся, и постоянное приведение не весело. ( sendMessage
в этом примере будет принимать переменное количество Object
аргументов и возвращать Object
)
Есть лучший способ сделать это?
источник
PlayerComm extends Player
" -части. Все ли участники Java расширяютсяPlayer
, и этотPlayerComm
класс является адаптером для не-Java участников?Ответы:
ОК, все обострилось, и я закончил следующие десять уроков ...
Суть этого метода в том, что все общение происходит с использованием
Message
класса, то есть игра никогда не вызывает методы игроков напрямую, а всегда использует класс коммуникатора из вашей среды. Для родных классов Java есть коммуникатор, основанный на отражениях, а затем должен быть специальный коммуникатор для всех не-Java игроков.Message<Integer> message = new Message<>("say", Integer.class, "Hello");
инициализирует сообщение для метода с именем, возвращающимsay
параметр . Затем он передается на коммуникатор (сгенерированный с использованием фабрики на основе типа проигрывателя), который затем выполняет команду."Hello"
Integer
(PS Другие ключевые слова в моей голове , что я не могу достаточно результаты во что - нибудь полезное прямо сейчас:. Команда , посетитель шаблон , java.lang.reflect.ParameterizedType )
источник
Player
от письмаPlayerComm
вообще. В то время как интерфейсы коммуникатора выполняют для меня автоматическое приведение, я все равно столкнулся с той же проблемой, связанной с необходимостью писать одну и ту жеsendRequest()
функцию для каждого метода.