99.8 ? 100.1 ? 100.6 ?

171 views
Skip to first unread message

Frédéric Trégon

unread,
Mar 23, 2014, 10:53:48 AM3/23/14
to
Bonjour,

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...

En fait en interne, le système calcule toutes les coordonnées en précision "double". Donc les drones avancent de exactement 100 unités, mais les coordonnées qui vous sont fournies sont arrondies à l'entier le plus proche. Pour la détection de l'appartenance à une zone, ce sont les coordonnées entières qui sont utilisées.

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.

Pour plus de transparence, le pseudo-code de déplacement des drones :
---
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
---

Voilà !
Keep Coding !
 

LouJo

unread,
Mar 23, 2014, 8:29:49 AM3/23/14
to codingame-gam...@googlegroups.com
Merci pour ces précisions ; je pensais que les coordonnées étaient arrondies de telle sorte que la distance parcourue reste en dessous de 100
(floor vers la droite, ceil vers la gauche pour x)

Je vais être obligé de renvoyer une version dans l'arène alors ;)


Le dimanche 23 mars 2014 12:33:06 UTC+1, Frédéric Trégon a écrit :
Bonjour,

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 est mérite d'être expliquée ici...

En fait en interne, le système calcule toutes les coordonnées en précision "double". Donc les drones avancent de exactement 100 unités, mais les coordonnées qui vous sont fournies sont arrondis à l'entier le plus proche. Pour la détection de l'appartenance à une zone, ce sont les coordonnées entières qui sont utilisées.
Reply all
Reply to author
Forward
0 new messages