Робокод: точность onScannedRobot - PullRequest
0 голосов
/ 04 апреля 2020

Я написал относительно простой AdvancedRobot, который поворачивает свой радар и записывает всех врагов с их скоростями. В конце концов, я заметил, что робот не попадает в тех случаях, когда он не должен пропустить. Я скопировал код из вики Robocode / Graphical Debugging и проверил это. Вот код (Wiki в данный момент недоступен):

// The coordinates of the last scanned robot
int scannedX = Integer.MIN_VALUE;
int scannedY = Integer.MIN_VALUE;

// Called when we have scanned a robot
public void onScannedRobot(ScannedRobotEvent e) {
    // Calculate the angle to the scanned robot
    double angle = Math.toRadians((getHeading() + e.getBearing()) % 360);

    // Calculate the coordinates of the robot
    scannedX = (int)(getX() + Math.sin(angle) * e.getDistance());
    scannedY = (int)(getY() + Math.cos(angle) * e.getDistance());
}

И обработчик события:

// Paint a transparent square on top of the last scanned robot
public void onPaint(Graphics2D g) {
    // Set the paint color to a red half transparent color
    g.setColor(new Color(0xff, 0x00, 0x00, 0x80));

    // Draw a line from our robot to the scanned robot
    g.drawLine(scannedX, scannedY, (int)getX(), (int)getY());

    // Draw a filled square on top of the scanned robot that covers it
    g.fillRect(scannedX - 20, scannedY - 20, 40, 40);
}

«Заполненный квадрат» определенно НЕ находится над роботом. Несколько скриншотов показаны ниже. Похоже, точность зависит от расстояния, но я не уверен. Это ожидается, или я делаю что-то не так?

Shot 1 Shot 2

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Одной из причин этого может быть то, что доставка события onScannedRobot задерживается до тех пор, пока события с более высоким приоритетом не завершат обработку. В частности, если обработчик событий с более высоким приоритетом выполняет команду для поворота тела, эта команда будет выполняться до вызова onScannedRobot, что приведет к увеличению времени вперед, перемещению роботов и изменению курса вашего робота.

отложенная доставка событий вызывает множество проблем, я рекомендую никогда не выполнять команды в обработчиках событий. Вместо этого обработчики событий должны просто проверять, думать и хранить информацию в полях, чтобы основной l oop реагировал на это. Это позволяет основному лицу oop просматривать всю имеющуюся информацию, прежде чем совершать курс на действия, и разумно выбирать, какое действие является наиболее подходящим с учетом всей полученной информации. Например, он может посмотреть на случай попадания робота спереди в сочетании с радарным обнаружением противника, приближающегося сзади, и решить, что боковое уклонение является более перспективным, чем обычное уклонение в тыл ...

0 голосов
/ 05 апреля 2020

Я думаю, что знаю, в чем проблема. Это, кажется, не задокументировано; если я не прав, напишите пожалуйста ссылку. ScannedRobotEvent сообщает о направлении относительно предыдущего курса робота, т. Е. Его курса при последнем ударе StatusEvent. Принятие этого во внимание значительно улучшило точность моего бота.

...