This commit is contained in:
Glenn Y. Rolland 2016-07-27 01:48:11 +02:00
parent 0fef89d4ef
commit 79945ad572
3 changed files with 143 additions and 0 deletions

1
code-busters/Makefile Symbolic link
View file

@ -0,0 +1 @@
../Makefile

90
code-busters/RULES.md Normal file
View file

@ -0,0 +1,90 @@
Capturer plus de fantômes que l'équipe adverse.
Règles
Le jeu se déroule sur une carte de largeur 16001 et de hauteur 9001 . Les coordonnées X=0, Y=0 représentent le coin supérieur gauche.
Chaque joueur contrôle une équipe de plusieurs busters. Chaque équipe commence à un coin opposé de la carte, près de sa base. Les Fantômes sont répartis sur la carte, et doivent être capturés et ramenés à la base. Chaque fantôme capturé par un buster ou ramené à la base vaut un point. Cependant, vous pouvez perdre un point si un de vos busters relâche son fantôme ailleurs que dans votre base.
La carte fonctionne comme suit :
Il y a toujours 2 équipes en jeu.
Au début du jeu, chaque joueur reçoit un identifiant d'équipe. Il indique à quelle base son équipe démarre. Le coin supérieur gauche ( X=0, Y=0) est pour l'équipe 0. Le coin inférieur droit ( X=16000, Y=9000) est pour l'équipe 1.
Le brouillard empêche de connaître les positions des fantômes ou des busters adverses, sauf si ils sont dans un rayon de 2200 unités d'un de vos propres busters.
Chaque buster a un identifiant unique. Chaque fantôme a un identifiant unique. Un fantôme et un Buster ayant le même identifiant ne sont pas reliés.
Les Busters fonctionnent comme suit :
A chaque tour, un buster peut effectuer l'une des actions suivantes : MOVE, BUST ou RELEASE
MOVE suivi par des coordonnées fera avancer le buster de 800 unités vers le point choisi. La position sera arrondie au plus proche entier.
BUST suivi d'un identifiant de fantôme permettra au buster de capturer un fantôme si celui-ci se trouve dans un rayon inférieur à 1760 unités mais supérieur à 900 unités du buster. Les fantômes capturés ne sont plus visibles sur la carte.
Un buster peut transporter au plus 1 fantôme simultanément.
RELEASE va ordonner au buster de relâcher le fantôme qu'il est en train de porter. Si un fantôme est relâché à moins de 1600 unités d'un coin de map étant une base, le fantôme est retiré du jeu et le possesseur de la base sécurise un point.
Les Fantômes fonctionnent comme suit :
Les fantômes sont immobiles sauf si des Busters se trouvent dans un rayon de 2200 unités. Dans ce cas, le fantôme se déplace de 400 à l'opposé du Buster le plus proche. En cas d'égalité, il va fuir le point au barycentre des Busters proches.
Si plusieurs busters tentent de capturer un fantôme, l'équipe ayant le plus de busters aura la priorité. Dans cette équipe, le buster le plus près de la cible récupérera le fantôme. Si les deux équipes ont le même nombre de busters en train de tenter la capture, le fantôme ne sera pas capturé lors de ce tour.
Un fantôme transporté par un buster s'échappe si ce buster tente de capturer un autre fantôme.
Le jeu s'arrête quand tous les fantômes ont été capturés ou après une limite de 250 tours.
L'état du jeu lors d'un tour vous est donné en une liste d'entités, chacune possédant : id , position , type , state et value .
La valeur de type sera :
0 pour un buster de l'équipe 0.
1 pour un buster de l'équipe 1.
-1 pour un fantôme.
La valeur de state sera :
Pour les busters :
0: Buster ne transportant pas de fantôme.
1: Buster transportant un fantôme.
Pour les fantômes, il sera toujours égal à 0.
value pourra être :
Pour un buster, si ce buster transporte un fantôme, l'id de ce fantôme. Sinon, -1.
Pour un fantôme, 0 , sauf si plusieurs busters ont tenté de le capturé, dans ce cas value vaudra le nombre de busters ayant tenté de le capturer à ce tour.
Conditions de Victoire
Avoir capturé plus de fantômes que l'équipe adverse à la fin du jeu.
Conditions de Défaite
Votre programme produit une sortie invalide.
Votre programme dépasse la limite de temps.
Vous avez moins de fantôme que votre adversaire à la fin du jeu.
Règles pour les experts
Les positions de départ des busters et des fantômes sont symétriques.
Les déplacements des fantômes se font 1 tour après vous avoir repéré.
Si un fantôme sort de la carte après un déplacement, ses nouvelles coordonnées sont bornées avec celles de la carte.
Note
Votre programme doit d'abord lire les données d'initialisation depuis l'entrée standard, puis, dans une boucle infinie, lire les données contextuelles de la partie et écrire sur la sortie standard les actions pour vos busters.
Entrées du jeu
Entrées d'initialisation
Ligne 1: un entier bustersPerPlayer pour le nombre de busters contrôlés par l'équipe.
Ligne 2: un entier ghostCount pour le nombre de fantômes sur la carte.
Ligne 3: un entier myTeamId l'identifiant de votre équipe.
Entrées pour un tour de jeu
Ligne 1: un entier entities le nombre d'entités visibles par vous pour ce tour.
Les entities lignes suivantes : 6 entiers séparés par des espaces, entityId , x , y , entityType , state & value . Représentent un buster ou un fantôme.
Sortie pour un tour de jeu
Une ligne pour chacun de vos busters: une des actions suivantes :
MOVE suivi de deux entiers x et y
BUST suivi d'un entier ghostId
RELEASE
Vous pouvez ajouter du texte après vos instructions, il sera montré dans le player (un message par buster).
Contraintes
2 ≤ bustersPerPlayer ≤ 5
8 ≤ ghostCount ≤ 28
Temps de réponse par tour ≤ 100 ms

52
code-busters/code.ml Normal file
View file

@ -0,0 +1,52 @@
module BusterCtx :
sig
type t
end =
struct
type ctx = {
name : string ;
mutable x : int ;
mutable y : int
}
type t = ctx
end
;;
(* Send your busters out into the fog to trap ghosts and bring them home! *)
let bustersperplayer = int_of_string (input_line stdin) in (* the amount of busters you control *)
let ghostcount = int_of_string (input_line stdin) in (* the amount of ghosts on the map *)
let myteamid = int_of_string (input_line stdin) in (* if this is 0, your base is on the top left of the map, if it is one, on the bottom right *)
(* initialize buster ctx array *)
(* game loop *)
while true do
let entities = int_of_string (input_line stdin) in (* the number of busters and ghosts visible to you *)
for i = 0 to entities - 1 do
(* entityid: buster id or ghost id *)
(* y: position of this buster / ghost *)
(* entitytype: the team id if it is a buster, -1 if it is a ghost. *)
(* state: For busters: 0=idle, 1=carrying a ghost. *)
(* value: For busters: Ghost id being carried. For ghosts: number of busters attempting to trap this ghost. *)
let line = input_line stdin in
let entityid, x, y, entitytype, state, value = Scanf.sscanf line "%d %d %d %d %d %d" (fun entityid x y entitytype state value -> (entityid, x, y, entitytype, state, value)) in
();
done;
for i = 0 to bustersperplayer - 1 do
(* Write an action using print_endline *)
(* To debug: prerr_endline "Debug message"; *)
Printf.printf "MOVE 8000 4500" ; (* MOVE x y | BUST id | RELEASE *)
print_endline "";
();
done;
();
done;