Un certain nombre de questions nous arrivent par e-mail concernant l'avancement des drones qui ne serait pas limité à 100 (certains joueurs voient du 100.1 ou 100.6 par exemple).
La raison en est simple et mérite d'être expliquée ici...
Bien sûr, si vous arrivez sur la destination x,y demandée (c-à-d il a fallu moins de 100 unités pour l'atteindre), les coordonnées redeviennent entière pour le système jusqu'au prochain déplacement.
int SPEED = 100;
int droneRequestedX = ...; // Read from player STDOUT
int droneRequestedY = ...; // Read from player STDOUT
int droneCurrentIntX = ...; // Kept by system, sent to player STDIN
int droneCurrentIntY = ...; // Kept by system, sent to player STDIN
double droneCurrentRealX = ...; // Kept by system
double droneCurrentRealY = ...; // Kept by system
// Compute next position using doubles (rounded to int afterwards)
if (droneRequestedX == droneCurrentIntX && droneRequestedY == droneCurrentIntY) {
// Drone is already at destination
droneCurrentRealX = droneRequestedX;
droneCurrentRealY = droneRequestedY;
} else {
// Drone has not reached destination and must move
double diffX = (droneRequestedX - droneCurrentRealX);
double diffY = (droneRequestedY - droneCurrentRealY);
double square = (diffX * diffX) + (diffY * diffY);
if (square <= (SPEED * SPEED)) {
// Drone, can reach destination, clamping to requested integer coordinates
droneCurrentRealX = droneRequestedX;
droneCurrentRealY = droneRequestedY;
} else {
// Drone only move SPEED units
double norm = Math.sqrt(square);
droneCurrentRealX = droneCurrentRealX + ((SPEED * diffX) / norm);
droneCurrentRealY = droneCurrentRealY + ((SPEED * diffY) / norm);
}
}
// Round
droneCurrentIntX = (int) (droneCurrentRealX + 0.5);
droneCurrentIntY = (int) (droneCurrentRealY + 0.5);
// Send back droneCurrentIntX and droneCurrentIntY to player STDIN