You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
10 KiB
HTML

<h2>Fonctionnement des combats de Tron</h2>
<h3>Règles du jeu (hors specs techniques)</h3>
<p>Chaque bot démarre depuis une case choisie au hasard par l'arène.</p>
<p>A chaque tour, il est demandé aux bots de grandir d'une case. Il peut choisir la direction. Sa queue s'allonge.</p>
<p>Si un bot percute une case déjà prise par sa queue ou celle d'un autre, il perd.</p>
<p>Ce n'est pas du tour par tour, les bots jouent simultanément, ils peuvent donc perdre en choisissant la même case de destination qu'un autre serpent</p>
<p>Exemple:</p>
<table class="tabledoc">
<tr><th>9</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>8</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>7</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>6</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>5</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>4</th><td class="green"></td><td class="green"></td><td class="green">oO</td><td></td><td class="red">oO</td><td class="red"></td><td></td><td></td><td></td></tr>
<tr><th>3</th><td class="green"></td><td></td><td></td><td></td><td></td><td class="red"></td><td class="red"></td><td class="red"></td><td></td></tr>
<tr><th>2</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>1</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th></tr>
</table>
<p>Si dans le même tour le serpent vert et le serpent rouge décident d'aller respectivement vers la gauche et vers la droite, ils vont se télescoper et perdre tous les deux.</p>
<table class="tabledoc">
<tr><th>9</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>8</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>7</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>6</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>5</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>4</th><td class="green"></td><td class="green"></td><td class="green"></td><td class="brown">): :(</td><td class="red"></td><td class="red"></td><td></td><td></td><td></td></tr>
<tr><th>3</th><td class="green"></td><td></td><td></td><td></td><td></td><td class="red"></td><td class="red"></td><td class="red"></td><td></td></tr>
<tr><th>2</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>1</th><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th></tr>
</table>
<p>Lorsqu'un serpent meurt, (lorsqu'un bot perd) Sa queue est effacée et les cases prises par cette dernière deviennent libres pour les serpents encore en vie.</p>
<p>Le jeu prend fin lorsqu'il reste moins de deux serpents.</p>
<h3>La grille</h3>
<ul>
<li>largeur: 100 cases</li>
<li>hauteur: 100 cases</li>
</ul>
<h3>Communications entre l'arène et les bots</h3>
<p>L'arène fait émet des requêtes http(s) à destination des bots.</p>
<ul>
<li>Type: POST</li>
<li>informations: au format JSON dans le corps de la requetes</li>
</ul>
<h3>Initialisation de la partie</h3>
<p>L'arène (ce site) envoie le message (exemple) suivant à votre bot:</p>
<pre>
{"game-id":"1679","action":"init","game":"tron","board":"","players":4,"player-index":2}
</pre>
<ul>
<li><em>game-id</em> String Identifiant unique de la partie. Votre bot peut être emmené à jouer plusieurs parties en simultané. Si le fonctionnement de votre bot nécessite de suivre / conserver des valeurs entre deux tours de l'arène, cet identifiant vous sera utile.</li>
<li><em>action</em> String, peut prendre les valeurs init ou play-turn, mais à cette étape, c'est init</li>
<li><em>game</em> String, sera toujours "tron" ici. Peut vous servir si vous utilisez la même URL pour plusieurs bots.</li>
<li><em>board</em> Sera vide à cette étape</li>
<li><em>players</em> Entier Vous indique le nombre de joueurs sur cette partie. Il est possible que votre bot "joue" plusieurs joueurs. Et si vous les faisiez collaborer en ce cas là?</li>
<li><em>player-index</em> Entier Le numéro de votre bot. Le premier bot a le numéro 0. Vous gardez le même numéro durant toute la partie, même si des joueurs sont déjà morts</li>
</ul>
<p>Votre bot doit répondre par un tableau au format json, comme ceci:</p>
<pre>
{"name":"botName"}
</pre>
<p>L'arène ne vérifie pas actuellement cette réponse, l'étape d'init a été insérée pour assurer la compatibilité avec <a href="https://github.com/moul/bolosseum">Bolosseum</a>.
Si votre bot repond une page blanche à cette étape (action=init), ça marchera dans le cadre de botsarena.</p>
<h3>Tours de jeu</h3>
<p>Exemple de message envoyé par l'arène au premier tour de jeu:</p>
<p>Exemple de message envoyé par l'arène après quelques tours de jeu:</p>
<pre>
{"game-id":"1680","action":"play-turn","game":"tron","board":[[[687,110],[687,111],[686,111],[686,110],[686,109],[686,108],[686,107],[685,107],[685,108],[685,109],[684,109],[684,110],[684,111],[684,112],[684,113],[683,113],[682,113],[681,113],[681,114],[681,115],[681,116],[680,116],[680,117],[679,117],[679,116],[679,115],[679,114],[679,113],[679,112],[679,111],[679,110],[679,109],[678,109],[678,108],[677,108],[676,108],[676,107],[676,106],[676,105],[676,104],[676,103],[675,103],[674,103],[674,102],[673,102],[672,102],[672,101],[671,101],[670,101],[669,101],[669,102],[669,103],[669,104],[669,105],[669,106],[669,107],[668,107],[668,108],[668,109],[668,110],[668,111],[668,112],[667,112],[667,111],[667,110],[666,110],[666,109],[666,108],[665,108],[664,108],[664,107],[664,106],[663,106],[663,107],[663,108],[662,108],[661,108],[660,108],[660,107],[659,107],[659,106],[658,106],[657,106],[657,105],[657,104],[656,104],[656,103],[655,103],[655,102],[655,101],[654,101],[654,102],[654,103],[654,104],[653,104],[653,103],[653,102],[653,101],[653,100],[652,100],[651,100],[651,101],[651,102],[651,103],[651,104],[650,104],[650,105],[650,106],[649,106],[649,105],[648,105]],[[100,225],[100,226],[100,227],[100,228],[100,229],[100,230],[100,231],[99,231],[98,231],[98,232],[97,232],[96,232],[96,231],[96,230],[96,229],[96,228],[96,227],[96,226],[96,225],[96,224],[96,223],[95,223],[95,222],[94,222],[94,221],[94,220],[93,220],[92,220],[92,219],[92,218],[92,217],[92,216],[92,215],[91,215],[91,214],[90,214],[89,214],[89,213],[89,212],[88,212],[88,213],[88,214],[87,214],[87,213],[86,213],[86,214],[86,215],[85,215],[85,214],[84,214],[84,215],[83,215],[83,216],[83,217],[82,217],[82,216],[81,216],[81,215],[80,215],[80,216],[79,216],[79,215],[79,214],[78,214],[77,214],[77,213],[77,212],[76,212],[75,212],[75,211],[75,210],[75,209],[74,209],[74,210],[74,211],[73,211],[73,210],[72,210],[72,209],[71,209],[71,210],[70,210],[70,209],[69,209],[68,209],[68,210],[68,211],[67,211],[67,210],[67,209],[67,208],[66,208],[66,207],[66,206],[66,205],[66,204],[66,203],[65,203],[65,204],[64,204],[64,203],[63,203],[63,204],[63,205],[63,206],[62,206],[61,206],[61,207],[60,207],[60,208],[59,208]]],"player-index":0,"players":2}
</pre>
<p>Les champs suivants sont les mêmes qu'au paragraphe précédent:</p>
<ul>
<li><em>game-id</em></li>
<li><em>game</em></li>
<li><em>players</em></li>
<li><em>player-index</em></li>
</ul>
Les champs qui différent sont:
<ul>
<li><em>action</em>String, est toujours "play-turn" à cette étape</li>
<li><em>board</em>Je vous explique ça au chapitre suivant.</li>
</ul>
<h4>La Carte (board)</h4>
<p>Elle est représentée dans le champs "board" du JSON envoyé par l'arène. Elle décrit les cases prises par chaque joueur.</p>
<p> Elle est composée de plusieurs sous-arrays/sous-objets (en fonction de votre language de programmation). Elle se décompose en sous tableaux de la forme suivante:<p>
<ul>
<li>Board:
<ul>
<li>Joueur 1
<ul>
<li>Case1
<ul>
<li>Coordonnée X</li>
<li>Coordonnée Y</li>
</ul>
</li>
<li>Case2
<ul>
<li>coordonnée X</li>
<li>Coordonnée Y</li>
</ul>
</li>
</ul>
</li>
<li>Joueur 2>
<ul>
<li>Case1
<ul>
<li>coordonnée X</li>
<li>Coordonnée Y</li>
</ul>
</li>
<li>Case2
<ul>
<li>coordonnée X</li>
<li>Coordonnée Y</li>
</ul>
</li>
</ul>
</li>
<li>...</li>
<ul>
</li>
</ul>
<p> La représentation JSON est la suivante:</p>
<p>
[<br />
&nbsp;&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;[x1,y1],[x2,y2],[x3,y3]<br />
&nbsp;&nbsp;],<br />
&nbsp;&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;(...)<br />
&nbsp;&nbsp;]<br />
</p>
<p>L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).</p>
<p>L'ordre des couples de coordonnées de chaque bot, est dans le sens tête vers queue. Les bots grandissent à chaque tour en déplaçant leur tête.</p>
<h2>La réponse de votre bot</h2>
<p>Il retourne la direction qu'il souhaite prendre sous la forme d'un array.</p><p>4 possibilités:</p>
<pre>
{"play":"x+"}
</pre>
<pre>
{"play":"x-"}
</pre>
<pre>
{"play":"y+"}
</pre>
<pre>
{"play":"y-"}
</pre>
<p>La façon de noter les directions me semble assez explicite pour que je ne détaille pas.</p>
<h2>Scoring</h2>
<p>Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":</p>
<ul>
<li>Lors de la défaite d'un bot, l'arène enregistre un match nul contre tous les autres bots qui ont aussi perdu au même tour de jeu.</li>
<li>Elle enregistre aussi une défaite des bots morts contre tous les bots encore en course à la fin du tour.</li>
</ul>
<h2>
<h2>Outils pour développer et tester votre bot</h2>
<p>Malheureusement aucun outil pour le moment. Ca viendra dans les semaines qui viennent, peut être sous la forme d'une interface swagger</p>
<p>Et il faut aussi que je développe une AI moins stupide que stupid IA, car actuellement comme il se suicide trop vite, ça ne permet ni de tester l'arène ni un bot plus intelligent</p>