La bataille navale se joue en deux phases :

A chaque tour de jeu l'arène fait des requetes http(s) contenant des paramètres de type POST, vers vos bots.
Ces derniers doivent répondre selon les spécifications ci dessous.

Descriptif des paramètres envoyés par l'arène

Paramètre Description
game Chaîne de caractères, sera toujours "Battleship".
Peut servir si votre url sert à plusieurs jeux.
match_id Chaîne de caractères. Répond à l'expression régulière suivante: ^[0-9]+-(1|2)$
Le premier nombre (digits avant le tiret) identifie le match.
Le numéro après le tiret vous indique si vous êtes le bot 1 ou le bot 2 dans l'ordre de jeu.
Ça vous servira si votre IA fait des statistiques sur les matchs.
act Peut prendre deux valeurs :
  • "init" : On démarre la partie, vous devez placer vos bateaux
  • "fight" : Vous envoyez un tir
opponent Chaîne de caractères identifiant votre adversaire.
Ainsi, vous pouvez pousser le délire jusqu'à faire un algorythme qui s'adapte en fonction de l'adversaire et de l'historique des combats avec ce dernier.
width Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.
height Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.
ship1 Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.
ship2 Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.
... ...
ship6 Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.
your_strikes

Chaîne de caractères représentant un array au format JSON.
Ce parametre n'est envoyé que lors de la phase de tirs du jeu (act=fight).
Il vous indique les tirs que vous avez déjà effectués et leur résultats.
Lors du premier tour de jeu, il représente un array vide.

[ ]

Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :

[{"target":"2,0","result":""}]

Lors du troisième tour de jeu, les deux tirs précédents :

[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]

Chaque tir est un sous array pour lesquels:

  • L'index target indique les coordonnées du tir x,y
  • result peut être :
    • Vide "" signifie que le tir n'a rien touché
    • "hit" Un navire ennemi a été touché
    • "hit and sunk" Un navire ennemi a été touché et coulé
his_strikes Idem sauf qu'il s'agit du tir de l'adversaire.

Ce que doit retourner votre bot

Lors de l'initialisation de la partie

Lors de l'initialisation d'une partie StupidIA VS StupidsIA, l'arène a envoyé au bot les parametres POST suivants :

    game=Battleship&match_id=828-1&act=init&opponent=stupidIA&width=10&height=10&ship1=0&ship2=1&ship3=2&ship4=1&ship5=1&ship6=0

Soit, sous forme plus lisible :

    [game] => Battleship
    [match_id] => 828-1
    [act] => init
    [opponent] => stupidIA
    [width] => 10
    [height] => 10
    [ship1] => 0
    [ship2] => 1
    [ship3] => 2
    [ship4] => 1
    [ship5] => 1
    [ship6] => 0

La page http que doit générer votre bot contient la position des navires.

Vous retournez une chaine de caractères qui est un tableau JSON ayant autant d'enregistrements que de navires.
Chaque navire est défini par les coordonnées de ses extrémités.

Exemple de placement de 5 bateaux tailles respectives 5, 4, 3, 3, 2 cases :

    ["3,3-3,7","2,1-2,4","0,1-0,3","7,3-7,1","8,8-7,8"]

Bien évidemment si vos bateaux se chevauchent, ou si leur nombre et leur longueur ne correspond pas à la demande de l'arène, vous perdez la partie.

L'ordre des bateaux n'a pas d'importance.
De la même manière, pour un bateau, l'ordre de ses points n'importe pas non plus.

Vu sur la grille, l'exemple précédent donnerait :

0 1 2 3 4 5 6 7 8 9
0
1
2
3
4
5
6
7
8
9

Lors du combat

Voici quelques exemples des parametres envoyés par l'arène.

Premier tour de jeu (your_strikes et his_strikes sont vides)

    [game] => Battleship
    [match_id] => 834-1
    [act] => fight
    [opponent] => stupidIA
    [width] => 10
    [height] => 10
    [ship1] => 0
    [ship2] => 1
    [ship3] => 2
    [ship4] => 1
    [ship5] => 1
    [ship6] => 0
    [your_strikes] => []
    [his_strikes] => []

Deuxième tour de jeu

    [game] => Battleship
    [match_id] => 834-1
    [act] => fight
    [opponent] => stupidIA
    [width] => 10
    [height] => 10
    [ship1] => 0
    [ship2] => 1
    [ship3] => 2
    [ship4] => 1
    [ship5] => 1
    [ship6] => 0
    [your_strikes] => [{"target":"4,6","result":""}]
    [his_strikes] => [{"target":"7,8","result":""}]

Troisième tour de jeu

    [game] => Battleship
    [match_id] => 834-1
    [act] => fight
    [opponent] => stupidIA
    [width] => 10
    [height] => 10
    [ship1] => 0
    [ship2] => 1
    [ship3] => 2
    [ship4] => 1
    [ship5] => 1
    [ship6] => 0
    [your_strikes] => [{"target":"4,6","result":""},{"target":"3,9","result":"hit"}]
    [his_strikes] => [{"target":"7,8","result":""},{"target":"7,8","result":""}]

Vous devez tout simplement retourner l'adresse de la case sur laquelle vous souhaitez tirer sous forme de x,y

    6,9

Pour tirer aux coordonnées x=6 y=9