.
This commit is contained in:
parent
ae3a4ceae8
commit
fec2b715c9
|
@ -1,173 +1,62 @@
|
|||
<p>
|
||||
Battleship is played in two stages :
|
||||
</p>
|
||||
<h1>Fonctionnement de la bataille navale</h1>
|
||||
<p>Elle se joue en deux phases</p>
|
||||
<ul>
|
||||
<li>Boats placement on maps</li>
|
||||
<li>Shootout</li>
|
||||
<li>Placement des bateaux sur les maps</li>
|
||||
<li>Echange de tirs</li>
|
||||
</ul>
|
||||
<p>
|
||||
At each turn, the arena made HTTP(s) queries containing POST parameters, to your bots.<br/>
|
||||
They must respond to the specifications below.
|
||||
</p>
|
||||
<h2>Descriptif des paramètres envoyés par l'arène</h2>
|
||||
<table class="tabledoc">
|
||||
<tr>
|
||||
<th>Parameter</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>game</td>
|
||||
<td>
|
||||
String, will always "Battleship".<br/>
|
||||
Can be used if your url is used for several games.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>match_id</td>
|
||||
<td>
|
||||
String. Match the following regular expression : ^[0-9]+-(1|2)$<br/>
|
||||
The first number (digits before the hyphen) identified the game.<br/>
|
||||
The number after the hyphen indicates whether you are the first or second bot in the order to play.<br/>
|
||||
It will serve you if your AI makes statistics on games.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>act</td>
|
||||
<td>
|
||||
Can take two values :<br/>
|
||||
<h2>Communications entre l'arène et votre bot</h2>
|
||||
<p>Pour communiquer, l'arène (le serveur hébergeant botsarena) fait des requetes http(s) de type POST vers les bots. Le message est dans le corps de la requête au format JSON.</p>
|
||||
<p>Votre bot répond par un array au format JSON.</p>
|
||||
<h3>Message d'initialisation de votre partie</h3>
|
||||
l'arène envoie le message suivant:
|
||||
<pre>{"game-id":1609,"game":"battleship","action":"init","players":2,"player-index":0,"board":{"opponent":"stupidIA","width":"10","height":"10","ship1":"0","ship2":"1","ship3":"2","ship4":"1","ship5":"1","ship6":"0"}}</pre>
|
||||
<p>Si on décompose le tableau pour l'expliquer:</p>
|
||||
<ul>
|
||||
<li>"init" : We start the game, you must place your ships</li>
|
||||
<li>"fight" : You send a shot</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>opponent</td>
|
||||
<td>
|
||||
String identifying your opponent.<br/>
|
||||
So you can grow up delirium by developping an algorithm that adapts depending on the opponent and the history of fighting with it.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>width</td>
|
||||
<td>Integer, between 1 and 100, inclusive, indicates the width of the map.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>height</td>
|
||||
<td>Integer, between 1 and 100, inclusive, indicates the height of the map.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>ship1</td>
|
||||
<td>Integer, between 0 and 10, inclusive, indicates the number of boats with length of 1 box to set.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>ship2</td>
|
||||
<td>Integer, between 0 and 10, inclusive, indicates the number of boats with length of 2 box to set.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>...</td>
|
||||
<td>...</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>ship6</td>
|
||||
<td>Integer, between 0 and 10, inclusive, indicates the number of boats with length of 6 box to set.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>your_strikes</td>
|
||||
<td>
|
||||
<p>
|
||||
String, representing an array in JSON format.<br/>
|
||||
This parameter is only sent when the game is in shooting phase (act=fight).<br/>
|
||||
It tells you the shots you've already made and their results.<br/>
|
||||
In the first round of play, it is an empty array.
|
||||
</p>
|
||||
<p>
|
||||
<i>[ ]</i>
|
||||
</p>
|
||||
<p>
|
||||
In the second round of game, it contains the previous shot and the result :
|
||||
</p>
|
||||
<p>
|
||||
<i>[{"target":"2,0","result":""}]</i>
|
||||
</p>
|
||||
<p>
|
||||
In the third round of play, the two previous shots :
|
||||
</p>
|
||||
<p>
|
||||
<i>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</i>
|
||||
</p>
|
||||
<p>
|
||||
Each shot is a sub array for which :
|
||||
</p>
|
||||
<li><em>game-id</em> string identifiant la partie.</li>
|
||||
<li><em>action</em> string identifiant la phase, <em>init</em> tout de suite, sera <em>play-turn</em> dans le châpitre suivant.</li>
|
||||
<li><em>game</em> string identifiant le jeu. Ici, ce sera forcément battleship. ça peut servir si vous donnez une seule URL pour plusieurs bots.</li>
|
||||
<li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
|
||||
<li><em>player-index</em> int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.</li>
|
||||
<li><em>board</em> un tableau vous donnant les parametres:
|
||||
<ul>
|
||||
<li>The index target indicates the coordinates of the target shooting x,y</li>
|
||||
<li>
|
||||
result may be :
|
||||
<ul>
|
||||
<li>Empty "" means that the shot did not hit anything</li>
|
||||
<li>"hit" An enemy ship has been hit</li>
|
||||
<li>"hit and sunk" An enemy ship was hit and sunk</li>
|
||||
<li><em>opponent</em> 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. </li>
|
||||
<li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
|
||||
<li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
|
||||
<li><em>ship1</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</li>
|
||||
<li><em>ship2</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</li>
|
||||
<li>...</li>
|
||||
<li><em>ship6</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>his_strikes</td>
|
||||
<td>Same except that this is the shot of the opponent.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h2>What must return your bot</h2>
|
||||
<h3>During initialization of the game</h3>
|
||||
<p>
|
||||
Lors de l'initialisation d'une partie StupidIA VS StupidsIA, l'arène a envoyé au bot les parametres POST suivants :
|
||||
During initialization of part StupidIA VS StupidIA, the arena send to your bot the following parameters in POST :
|
||||
</p>
|
||||
<pre>
|
||||
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
|
||||
</pre>
|
||||
<p>
|
||||
Or, more readable :
|
||||
</p>
|
||||
<pre>
|
||||
[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
|
||||
</pre>
|
||||
<p>
|
||||
The HTTP page that must generate your bot contains the position of ships.
|
||||
</p>
|
||||
<p>
|
||||
You return a character string that is a JSON array with as many records as ships.<br/>
|
||||
Each ship is defined by the coordinates of its ends.
|
||||
</p>
|
||||
<p>Votre bot doit retourner le nom de votre bot et le placement de vos bateaux au format JSON:</p>
|
||||
<pre>
|
||||
{"name":"gnieark","boats":["4,2-4,6","3,3-3,0","2,3-2,1","7,9-5,9","6,8-6,7"]}
|
||||
</pre>
|
||||
<ul>
|
||||
<li><em>name</em> Le nom de votre bot (actuellment non pris en compte par cette arène).</li>
|
||||
<li><em>boats</em> Tableau indiquant le placement de vos bateaux</li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li>The grid starts at the point 0,0.</li>
|
||||
<li>Integers, ordinate and abscissa, defining a point, are separated by a comma ",".</li>
|
||||
<li>The two points defining the ends a ship shall be separated by a hyphen "-".</li>
|
||||
<h3>boats</h3>
|
||||
<li>La grille commence au point 0,0.</li>
|
||||
<li>Les entiers, ordonnée et abscisses, définissant un point, sont séparés d'une virgule ",".</li>
|
||||
<li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret "-".</li>
|
||||
</ul>
|
||||
<h4>Placement example of 5 boats with respective sizes 5, 4, 3, 3, 2 boxes :</h4>
|
||||
<h4>Exemple de placement de 5 bateaux tailles respectives 5, 4, 3, 3, 2 cases :</h4>
|
||||
<pre>
|
||||
["3,3-3,7","2,1-2,4","0,1-0,3","7,3-7,1","8,8-7,8"]
|
||||
</pre>
|
||||
<p>
|
||||
Of course if your boat overlap, or if their number and length does not match the demand of the arena, you lose the game.
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
The order of the boats does not matter.<br/>
|
||||
Similarly, for a boat, the order of its points does not matter either.
|
||||
L'ordre des bateaux n'a pas d'importance.<br/>
|
||||
De la même manière, pour un bateau, l'ordre de ses points n'importe pas non plus.
|
||||
</p>
|
||||
<p>
|
||||
Seen on the grid, the example above would be :
|
||||
Vu sur la grille, l'exemple précédent donnerait :
|
||||
</p>
|
||||
<table class="battleshipGrid nofloat" id="tbl1">
|
||||
<tr>
|
||||
|
@ -314,65 +203,70 @@
|
|||
<td class="empty" id="bot1-9-9"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3>During the fight</h3>
|
||||
<p>
|
||||
Examples of parameters sent by the arena.
|
||||
</p>
|
||||
<h4>First round (your_strikes and his_strikes are empty)</h4>
|
||||
<pre>
|
||||
[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] => []
|
||||
</pre>
|
||||
<h4>Second round</h4>
|
||||
<pre>
|
||||
[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":""}]
|
||||
</pre>
|
||||
<h4>Third round</h4>
|
||||
<pre>
|
||||
[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":""}]
|
||||
</pre>
|
||||
<h4>You simply need to return the address of the box where you want to shoot in the form of x,y</h4>
|
||||
<pre>
|
||||
6,9
|
||||
</pre>
|
||||
<p>
|
||||
To shoot on the coordinates x=6 y=9
|
||||
</p>
|
||||
|
||||
<h3>Message vous demandant de jouer (seulement un tour)</h3>
|
||||
<p>L'arène vous envoie par exemple le message suivant:</p>
|
||||
<pre>{"game":"Battleship","game-id":1615,"action":"play-turn","player-index":1,"board":{"opponent":"stupidIA","width":"10","height":"10","ship1":"0","ship2":"1","ship3":"2","ship4":"1","ship5":"1","ship6":"0","your_strikes":[{"target":"4,3","result":""},{"target":"9,8","result":""}],"his_strikes":[{"target":"2,2","result":""},{"target":"0,6","result":""},{"target":"7,0","result":""}]}}</pre>
|
||||
<ul>
|
||||
<li><em>game-id</em> String identifiant la partie.</li>
|
||||
<li><em>action</em> String identifiant la phase, <em>play-turn</em> tout de suite, qui vous indique que vous devez jouer.</li>
|
||||
<li><em>game</em> String identifiant le jeu. Ici, ce sera forcément battleship. ça peut servir si vous donnez une seulle URL pour plusieurs bots.</li>
|
||||
<li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
|
||||
<li><em>board</em> La carte je donne le détail ci dessous</li>
|
||||
<li><em>you</em> String, Votre caractère dans la grille</li>
|
||||
<li><em>player-index</em> Int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.</li>
|
||||
</ul>
|
||||
<h4>la map</h4>
|
||||
<p>Elle est représentée par les éléments d'écrits à l'étape précédente et par deux sous tableaux your_strikes et his strikes</p>
|
||||
<ul>
|
||||
<li><em>opponent</em> 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. </li>
|
||||
<li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
|
||||
<li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
|
||||
<li><em>ship1</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</li>
|
||||
<li><em>ship2</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</li>
|
||||
<li>...</li>
|
||||
<li><em>ship6</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</li>
|
||||
<li><em>your_strikes</em> tableau vous indiquant vos tirs précédents et eur résultat</li>
|
||||
<li><em>his_strikes</em> Idem, mais pour l'adversaire. Si ce dernier tire selon un modèle prédisible, vous saurez comment comment placer vos bateaux lors de la prochaine partie</li>
|
||||
</ul>
|
||||
<h4> your_strikes et his_strikes</h4>
|
||||
|
||||
<p>Chaîne de caractères représentant un array au format JSON.<br/>
|
||||
Ce parametre n'est envoyé que lors de la phase de tirs du jeu (act=fight).<br/>
|
||||
Il vous indique les tirs que vous avez déjà effectués et leur résultats.<br/>
|
||||
Lors du premier tour de jeu, il représente un array vide:
|
||||
</p>
|
||||
<pre>[ ]</pre>
|
||||
<p>
|
||||
Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :
|
||||
</p>
|
||||
<pre>[{"target":"2,0","result":""}]</pre>
|
||||
<p>
|
||||
Lors du troisième tour de jeu, les deux tirs précédents :
|
||||
</p>
|
||||
<pre>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</pre>
|
||||
<p>
|
||||
Chaque tir est un sous array pour lesquels:
|
||||
</p>
|
||||
<ul>
|
||||
<li>L'index target indique les coordonnées du tir x,y</li>
|
||||
<li>
|
||||
result peut être :
|
||||
<ul>
|
||||
<li>Vide "" signifie que le tir n'a rien touché</li>
|
||||
<li>"hit" Un navire ennemi a été touché</li>
|
||||
<li>"hit and sunk" Un navire ennemi a été touché et coulé</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Réponse de votre bot</h3>
|
||||
<p>Il doit répondre par les coordonnées de la case dans laquelle il souhaite effectuer un tir.</p>
|
||||
<pre>{"play":"1,8"}</pre>
|
||||
<p>x,y</p>
|
||||
<h2>Outils pour développer et tester votre bot</h2>
|
||||
|
||||
<h3>Script Botsarena en cours de développement</h3>
|
||||
<h2>Faire entrer votre bot dans cette arène</h2>
|
||||
<p>Le formulaire d'inscription de votre bot est sur la page d'accueil du site.</p>
|
Loading…
Reference in New Issue
Block a user