Merge pull request #27 from gnieark/dev

Dev
This commit is contained in:
Gnieark 2015-12-24 16:05:47 +01:00
commit 0715852675
14 changed files with 8240 additions and 90 deletions

1
countBattles.txt Normal file
View File

@ -0,0 +1 @@
846

View File

@ -21,8 +21,6 @@ function is_it_possible_to_place_ships_on_grid($gridWidth,$gridHeight,$nbShipsSi
} }
return true; return true;
} }
function place_ship_on_map($x1,$y1,$x2,$y2,$map){ function place_ship_on_map($x1,$y1,$x2,$y2,$map){
if ((($x1 <> $x2) && ($y1 <> $y2)) if ((($x1 <> $x2) && ($y1 <> $y2))
OR (!isset($map[$y1][$x1])) OR (!isset($map[$y1][$x1]))
@ -68,8 +66,10 @@ function place_ship_on_map($x1,$y1,$x2,$y2,$map){
return $map; return $map;
} }
} }
switch($_POST['act']){ switch($_POST['act']){
case "init": case "init":
file_put_contents(__DIR__."/log.txt",print_r($_POST,true));
$wantedVars=array( $wantedVars=array(
'match_id' => false, //false-> string ; true -> integer 'match_id' => false, //false-> string ; true -> integer
'opponent' => false, 'opponent' => false,
@ -205,10 +205,11 @@ switch($_POST['act']){
//print_r($map); //print_r($map);
echo json_encode($shipsCoords); echo json_encode($shipsCoords);
file_put_contents(__DIR__."/log.txt",json_encode($shipsCoords),FILE_APPEND);
break; break;
case "fight": case "fight":
//for debog arena //for debog arena
file_put_contents(__DIR__."/log.txt",print_r($_POST,true)); file_put_contents(__DIR__."/log.txt",print_r($_POST,true),FILE_APPEND);
// if((is_int(settype($_POST['width'],"integer"))) && (is_int(settype($_POST['height'],"integer")))){ // if((is_int(settype($_POST['width'],"integer"))) && (is_int(settype($_POST['height'],"integer")))){

View File

@ -134,7 +134,7 @@ if(isset($_GET['arena'])){
$siteTitle="Bots Arena"; $siteTitle="Bots Arena";
$siteDescription="bots arena main page. Program your own artificiel intelligence and let it play here"; $siteDescription="bots arena main page. Program your own artificiel intelligence and let it play here";
$mainSectionScript="../src/home.php"; $mainSectionScript="../src/home.php";
$asideSectionContent=''; $asideSectionContent='<h2>Principe:</h2><p><img src="/principe.gif" alt=""/></p>';
$cssAdditionalScript=""; $cssAdditionalScript="";
$jsAdditionalScript=""; $jsAdditionalScript="";
} }
@ -161,7 +161,7 @@ if (isset($_POST['xd_check'])){
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="<?php echo $lang['lang']; ?>">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -178,7 +178,6 @@ if (isset($_POST['xd_check'])){
<body> <body>
<header> <header>
<h1><?php echo $siteTitle; ?></h1> <h1><?php echo $siteTitle; ?></h1>
<nav id="languages"><a href="<?php echo $currentArena; ?>-fr">fr</a>&nbsp;<a href="<?php echo $currentArena; ?>-en">en</a></nav> <nav id="languages"><a href="<?php echo $currentArena; ?>-fr">fr</a>&nbsp;<a href="<?php echo $currentArena; ?>-en">en</a></nav>
<nav id="menus"><a href="/"<?php if(($currentArena == "") && (!isset($_GET['doc']))) echo ' class="selected"'; ?>><?php echo $lang['HOME']; ?></a> <nav id="menus"><a href="/"<?php if(($currentArena == "") && (!isset($_GET['doc']))) echo ' class="selected"'; ?>><?php echo $lang['HOME']; ?></a>
<?php <?php
@ -202,7 +201,7 @@ if (isset($_POST['xd_check'])){
?> ?>
</section> </section>
<footer> <footer>
<a href="/p/About">A propos</a><a href="/p/legals">Mentions légales</a> <a href="/p/About"><?php echo $lang['ABOUT']; ?></a><a href="/p/legals"><?php echo $lang['LEGALS']; ?></a>
</footer> </footer>
</body> </body>
</html> </html>

7886
html/log.txt Normal file

File diff suppressed because one or more lines are too long

BIN
html/principe.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -95,3 +95,11 @@ form label {
padding-top:0.2em; padding-top:0.2em;
text-align:right; text-align:right;
} }
pre{
font-style: normal;
font-size: 16px;
margin-left: 32px;
font-family: Consolas, "Times New Roman", Verdana;
border-left: 4px solid #CCC;
padding-left: 8px;
}

View File

@ -11,5 +11,8 @@ $lang=array(
'MAKE_DUEL' => 'Organise a duel', 'MAKE_DUEL' => 'Organise a duel',
'FIGHT' => 'Fight!', 'FIGHT' => 'Fight!',
'DEV-YOUR-OWN-BOT' => 'Program your own bot, and send it on this arena..', 'DEV-YOUR-OWN-BOT' => 'Program your own bot, and send it on this arena..',
'DOC_SPECS_LINKS' =>'Read the technicals specifications' 'DOC_SPECS_LINKS' =>'Read the technicals specifications',
'ABOUT' => 'About',
'LEGALS' => 'legal terms',
'ADD_YOUR_BOT' => 'Add your bot'
); );

View File

@ -3,9 +3,9 @@ $lang=array(
'lang' => 'fr', 'lang' => 'fr',
'SITE_NAME' => 'Arène à bots', 'SITE_NAME' => 'Arène à bots',
'SITE_DESCRIPTION' => 'SITE_DESCRIPTION' =>
'<p>Bienvenue sur cette arène à bots.<br/><b>Ce site est en cours de développement.Il ne fonctionne pas encore</b><br/> je fais le choix de le laisser ouvert pendant le dev parce que OSEF. Ce vhost est une image de la branche dev du <a href="https://github.com/gnieark/botsArena/tree/dev">dépot github </a></p> '<p>Bienvenue sur cette arène à bots.<br/><b>Ce site est en cours de développement. Il fonctionne, mais beaucoup de détails restent à régler, dont la traduction anglais</b><br/>Ce vhost est une image de la branche dev du <a href="https://github.com/gnieark/botsArena/tree/dev">dépot github </a></p>
<p>Plusieurs jeux seront proposés ici. Vous ne devrez pas y jouer, mais dévolopper le "bot" qui jouera en votre nom. <p>Plusieurs jeux sont proposés ici. Vous ne devez pas y jouer, mais dévolopper le "bot" qui jouera en votre nom.
Ce site permettra de faire s\'affronter les bots des différents développeurs.</p>', Ce site permet de faire s\'affronter les bots des différents développeurs.</p>',
'HOME' => 'accueil', 'HOME' => 'accueil',
'VICTORIES' => 'victoires', 'VICTORIES' => 'victoires',
'DRAW' => 'matchs nuls', 'DRAW' => 'matchs nuls',
@ -17,4 +17,14 @@ $lang=array(
'E_MAIL_ADD_BOT_INTRO_HTML' => '<p>Un grand merci pour la participation.</p><p>Juste un click sur le lien suivant pour valider l\ajout du bot</p>', 'E_MAIL_ADD_BOT_INTRO_HTML' => '<p>Un grand merci pour la participation.</p><p>Juste un click sur le lien suivant pour valider l\ajout du bot</p>',
'E_MAIL_ADD_BOT_SIGNATURE' => 'Gnieark', 'E_MAIL_ADD_BOT_SIGNATURE' => 'Gnieark',
'E_MAIL_ADD_BOT_SIGNATURE_HTML'=> '<p><i>Gnieark.</i></p>', 'E_MAIL_ADD_BOT_SIGNATURE_HTML'=> '<p><i>Gnieark.</i></p>',
'ABOUT' => 'A propos',
'LEGALS' => 'Mentions légales',
'ADD_YOUR_BOT' => 'Ajoutez votre bot',
'BOT_NAME' => 'Nom de votre bot:',
'YOUR_ALIAS_FOR_EXEMPLE' => 'Votre pseudonyme par exemple',
'BOT_GAME' => 'Le jeu de votre bot',
'BOT_URL' => 'L\'adresse URL de votre bot',
'BOT_DESCRIPTION' => 'Description:',
'YOUR_EMAIL_FOR_BOT_VALIDATION' =>'Votre adresse e-mail (servira pour la validation de votre BOT)',
'SAVE_BOT' => 'Enregistrer'
); );

View File

@ -0,0 +1,159 @@
<p>Battleship is played in two steps:</p>Ces derniers doivent répondre selon les spécifications ci dessous
<ul><li>Place ships on the map</li>
<li>strikes</li>
</ul>
<p>At each turn of the game, Arena makes http(s) queries to your bots. This queries contains POST parameters. Your bots have to answer as it is specified here.</p>
<h2>Parameters' description sent by arena.</h2>
<table class="tabledoc"><tr><th>POST parameter</th><th>Description</th></tr>
<tr><td>game</td><td> string, always "Battleship". Is needed if your bot URL is used for several games.</td></tr>
<tr><td>match_id</td><td>string, matches this regex: ^[0-9]+-(1|2)$<br/>
First number (digits before hyphen) logs the match. Number after hyphen logs the bot.If you are the first player it's "1", otherwhise "2".<br/>
It could be usefull if you want to make statistics</td></tr>
<tr><td>act</td><td> Can have two values:<br/>
<ul>
<li>"init" We start the game, you have to place your ships.</li>
<li>"fight" Shoot.</li>
</ul></td></tr>
<tr><td>opponent</td><td>
Your opponent's authentification string
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.</td></tr>
<tr><td>width</td><td>Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</td>
<tr><td>height</td><td>Entier, compris entre 1 et 100, bornes incluses, Vous indique la hauteur de la map.</td></tr>
<tr><td>ship1</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 1 case à placer.</td></tr>
<tr><td>ship2</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 2 cases à placer.</td></tr>
<tr><td>ship3</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 3 cases à placer.</td></tr>
<tr><td>...</td><td>...</td></tr>
<tr><td>ship6</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 6 cases à placer.</td></tr>
<tr><td>your_strikes</td>
<td>
<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). 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>
<p><i>[ ]</i></p>
<p>Lors du deuxième tour de jeu, il contient le tir précédent et son résultat:</p>
<p><i>[{"target":"2,0","result":""}]</i></p>
<p>Lors du troisième tour de jeu, les deux tirs précédents</p>
<p><i>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</i></p>
<p>Chaque tir est un sous array pour lesquels:</p>
<ul><li>L'index target indique les coordoné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>
</td></tr>
<tr><td>his_strikes</td><td>idem sauf qu'il s'agit du tir de l'adversaire.</td></tr>
</table>
<h2>Ce que doit retourner votre bot</h2>
<h3>Lors de l'initialisation de la partie</h3>
<p>Lors de l'initialisation d'une partie StupidIA VS StupidsIA, l'arène a envoyé au bot les parametres POST suivants:</p>
<pre>game=Battleship&amp;match_id=828-1&amp;act=init&amp;opponent=stupidIA&amp;width=10&amp;height=10&amp;ship1=0&amp;ship2=1&amp;ship3=2&amp;ship4=1&amp;ship5=1&amp;ship6=0</pre>
<p>Soit, sous forme plus lisible:</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>La page http que doit générer votre bot contient la position des navires.</p>
<p>Vous retournez une chaine de caractères codant tableau JSON ayant autant d'enregistrements que de navires.
Chaque navire est défini par les coordonnées de ses extrémités.</p>
<ul>
<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 &quot;,&quot;.</li>
<li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret &quot;-&quot;.</li>
</ul>
<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>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>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.</p>
<p>Vu sur la grille, l'exemple précédent donnerait:</p>
<table class="battleshipGrid nofloat" id="tbl1">
<tr><td></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td></tr>
<tr><td>0</td><td class="empty" id="bot1-0-0"></td><td class="shipOn" id="bot1-0-1"></td><td class="shipOn" id="bot1-0-2"></td><td class="shipOn" id="bot1-0-3"></td><td class="empty" id="bot1-0-4"></td><td class="empty" id="bot1-0-5"></td><td class="empty" id="bot1-0-6"></td><td class="empty" id="bot1-0-7"></td><td class="empty" id="bot1-0-8"></td><td class="empty" id="bot1-0-9"></td></tr>
<tr><td>1</td><td class="empty" id="bot1-1-0"></td><td class="empty" id="bot1-1-1"></td><td class="empty" id="bot1-1-2"></td><td class="empty" id="bot1-1-3"></td><td class="empty" id="bot1-1-4"></td><td class="empty" id="bot1-1-5"></td><td class="empty" id="bot1-1-6"></td><td class="empty" id="bot1-1-7"></td><td class="empty" id="bot1-1-8"></td><td class="empty" id="bot1-1-9"></td></tr>
<tr><td>2</td><td class="empty" id="bot1-2-0"></td><td class="shipOn" id="bot1-2-1"></td><td class="shipOn" id="bot1-2-2"></td><td class="shipOn" id="bot1-2-3"></td><td class="shipOn" id="bot1-2-4"></td><td class="empty" id="bot1-2-5"></td><td class="empty" id="bot1-2-6"></td><td class="empty" id="bot1-2-7"></td><td class="empty" id="bot1-2-8"></td><td class="empty" id="bot1-2-9"></td></tr>
<tr><td>3</td><td class="empty" id="bot1-3-0"></td><td class="empty" id="bot1-3-1"></td><td class="empty" id="bot1-3-2"></td><td class="shipOn" id="bot1-3-3"></td><td class="shipOn" id="bot1-3-4"></td><td class="shipOn" id="bot1-3-5"></td><td class="shipOn" id="bot1-3-6"></td><td class="shipOn" id="bot1-3-7"></td><td class="empty" id="bot1-3-8"></td><td class="empty" id="bot1-3-9"></td></tr>
<tr><td>4</td><td class="empty" id="bot1-4-0"></td><td class="empty" id="bot1-4-1"></td><td class="empty" id="bot1-4-2"></td><td class="empty" id="bot1-4-3"></td><td class="empty" id="bot1-4-4"></td><td class="empty" id="bot1-4-5"></td><td class="empty" id="bot1-4-6"></td><td class="empty" id="bot1-4-7"></td><td class="empty" id="bot1-4-8"></td><td class="empty" id="bot1-4-9"></td></tr>
<tr><td>5</td><td class="empty" id="bot1-5-0"></td><td class="empty" id="bot1-5-1"></td><td class="empty" id="bot1-5-2"></td><td class="empty" id="bot1-5-3"></td><td class="empty" id="bot1-5-4"></td><td class="empty" id="bot1-5-5"></td><td class="empty" id="bot1-5-6"></td><td class="empty" id="bot1-5-7"></td><td class="empty" id="bot1-5-8"></td><td class="empty" id="bot1-5-9"></td></tr>
<tr><td>6</td><td class="empty" id="bot1-6-0"></td><td class="empty" id="bot1-6-1"></td><td class="empty" id="bot1-6-2"></td><td class="empty" id="bot1-6-3"></td><td class="empty" id="bot1-6-4"></td><td class="empty" id="bot1-6-5"></td><td class="empty" id="bot1-6-6"></td><td class="empty" id="bot1-6-7"></td><td class="empty" id="bot1-6-8"></td><td class="empty" id="bot1-6-9"></td></tr>
<tr><td>7</td><td class="empty" id="bot1-7-0"></td><td class="shipOn" id="bot1-7-1"></td><td class="shipOn" id="bot1-7-2"></td><td class="shipOn" id="bot1-7-3"></td><td class="empty" id="bot1-7-4"></td><td class="empty" id="bot1-7-5"></td><td class="empty" id="bot1-7-6"></td><td class="empty" id="bot1-7-7"></td><td class="shipOn" id="bot1-7-8"></td><td class="empty" id="bot1-7-9"></td></tr>
<tr><td>8</td><td class="empty" id="bot1-8-0"></td><td class="empty" id="bot1-8-1"></td><td class="empty" id="bot1-8-2"></td><td class="empty" id="bot1-8-3"></td><td class="empty" id="bot1-8-4"></td><td class="empty" id="bot1-8-5"></td><td class="empty" id="bot1-8-6"></td><td class="empty" id="bot1-8-7"></td><td class="shipOn" id="bot1-8-8"></td><td class="empty" id="bot1-8-9"></td></tr>
<tr><td>9</td><td class="empty" id="bot1-9-0"></td><td class="empty" id="bot1-9-1"></td><td class="empty" id="bot1-9-2"></td><td class="empty" id="bot1-9-3"></td><td class="empty" id="bot1-9-4"></td><td class="empty" id="bot1-9-5"></td><td class="empty" id="bot1-9-6"></td><td class="empty" id="bot1-9-7"></td><td class="empty" id="bot1-9-8"></td><td class="empty" id="bot1-9-9"></td></tr>
</table>
<h3>Lors du combat</h3>
<p> Voici quelques exemples des parametres envoyés par l'arène.</p>
<h4>Premier tour de jeu (your_strikes et his_strikes sont vides)</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>Deuxième tour de jeu</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>Troisième tour de jeu</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>Vous devez tout simplement retourner l'adresse de la case sur laquelle vous souhaitez x,y</h4>
<pre>
6,9
</pre>
<p>Pour tirer aux coordonnées x=6 y=9</p>

View File

@ -1,74 +1,157 @@
<p>La bataille navale se joue en trois phases:</p> <p>La bataille navale se joue en deux phases:</p>
<ul><li>Placement des bateaux sur les maps</li> <ul><li>Placement des bateaux sur les maps</li>
<li>Echange de tirs</li> <li>Echange de tirs</li>
<li>Fin de partie</li>
</ul> </ul>
<p>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.</p> <p>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.</p>
<h2>Paramètres communs à toutes les phases de jeu</h2> <h2>Descriptif des paramètres envoyés par l'arène</h2>
<h3>"game"</h3> <table class="tabledoc"><tr><th>Paramètre</th><th>Description</th></tr>
<p>string, sera toujours "Battleship" Peut servir si votre url sert à plusieurs jeux</p> <tr><td>game</td><td>chaîne de caractères, sera toujours "Battleship" Peut servir si votre url sert à plusieurs jeux</td></tr>
<h3>"match_id"</h3> <tr><td>match_id</td><td>chaîne de caractères. répond à l'expression régulière suivante: ^[0-9]+-(1|2)$<br/>
<p>String. répond à l'expression réguilière suivante: ^[0-9]+-(1|2)$</p> 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.<br/>
<p>Le premier nombre (digits avant le tiret) identifie le match. L'arène ne vous rappelera pas à chaque tour les cases que vous avez déjà ciblé. A vous de les sauvegarder en attendant le tour suivant. D'autant que votre bot peut être amené à disputer plusieurs matchs simultanément (avec des match_id différents). Le numéro après le tiret vous indique si vous êtes le bot 1 ou le bot 2 dans l'ordre de jeu. Ca vous servira notemment à gérer les cas où votre bot joue les deux joueurs.</p> Ça vous servira si votre IA fait des statistiques sur les matchs.</td></tr>
<h3>"act"</h3> <tr><td>act</td><td> Peut prendre deux valeurs:<br/>
<p> Peut prendre trois valeurs:</p>
<ul> <ul>
<li>"init" On démarre la partie, vous devez placer vos bateaux</li> <li>"init" On démarre la partie, vous devez placer vos bateaux</li>
<li>"play" Vous prenez subissez un tir, et envoyez aussi un tir</li> <li>"fight" Vous envoyez un tir</li>
<li>"end" La partie est finie</li> </ul></td></tr>
<tr><td>opponent</td><td>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.</td></tr>
<tr><td>width</td><td>Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</td>
<tr><td>height</td><td>Entier, compris entre 1 et 100, bornes incluses, Vous indique la hauteur de la map.</td></tr>
<tr><td>ship1</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 1 case à placer.</td></tr>
<tr><td>ship2</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 2 cases à placer.</td></tr>
<tr><td>ship3</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 3 cases à placer.</td></tr>
<tr><td>...</td><td>...</td></tr>
<tr><td>ship6</td><td>Entier, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 6 cases à placer.</td></tr>
<tr><td>your_strikes</td>
<td>
<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). 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>
<p><i>[ ]</i></p>
<p>Lors du deuxième tour de jeu, il contient le tir précédent et son résultat:</p>
<p><i>[{"target":"2,0","result":""}]</i></p>
<p>Lors du troisième tour de jeu, les deux tirs précédents</p>
<p><i>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</i></p>
<p>Chaque tir est un sous array pour lesquels:</p>
<ul><li>L'index target indique les coordoné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> </ul>
</li>
</ul>
</td></tr>
<tr><td>his_strikes</td><td>idem sauf qu'il s'agit du tir de l'adversaire.</td></tr>
</table>
<h2>Ce que doit retourner votre bot</h2>
<h3>Lors de l'initialisation de la partie</h3>
<p>Lors de l'initialisation d'une partie StupidIA VS StupidsIA, l'arène a envoyé au bot les parametres POST suivants:</p>
<pre>game=Battleship&amp;match_id=828-1&amp;act=init&amp;opponent=stupidIA&amp;width=10&amp;height=10&amp;ship1=0&amp;ship2=1&amp;ship3=2&amp;ship4=1&amp;ship5=1&amp;ship6=0</pre>
<p>Soit, sous forme plus lisible:</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>
<h2>Initialisation de la partie</h2> <p>La page http que doit générer votre bot contient la position des navires.</p>
<h3>Infos reçues par votre bot</h3> <p>Vous retournez une chaine de caractères codant tableau JSON ayant autant d'enregistrements que de navires.
<p>Votre bot recevra les paramètres communs à toutes les phases de jeu (avec act => init) et les suivants:</p>
<h4>"opponent"</h4>
<p>String 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.</p>
<h4>"width"</h4>
<p>integer, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</p>
<h4>"height"</h4>
<p>integer, compris entre 1 et 100, bornes incluses, Vous indique la hauteur de la map.</p>
<h4>"ship1"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 1 case à placer.</p>
<h4>"ship2"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 2 cases à placer.</p>
<h4>"ship3"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 3 cases à placer.</p>
<h4>...</h4>
<p>...</p>
<h4>"ship6"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 6 cases à placer.</p>
<h3>Ce que doit retourner votre bot</h3>
<p>Il doit retourner la position des navires.</p>
<p>Vous retournez un tableau JSON ayant autant d'enregistrement que de navires.
Chaque navire est défini par les coordonnées de ses extrémités.</p> Chaque navire est défini par les coordonnées de ses extrémités.</p>
<ul> <ul>
<li>La grille commence au point 0,0.</li> <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 &quot;,&quot;.</li> <li>Les entiers; ordonnée et abscisses définissant un point sont séparés d'une virgule &quot;,&quot;.</li>
<li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret &quot;-&quot;.</li> <li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret &quot;-&quot;.</li>
</ul> </ul>
<h4>Exemple:</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>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>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.</p>
<p>Vu sur la grille, l'exemple précédent donnerait:</p>
<table class="battleshipGrid nofloat" id="tbl1"> <table class="battleshipGrid nofloat" id="tbl1">
<tr><td></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td></tr> <tr><td></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td></tr>
<tr><td>0</td><td class="empty" id="bot1-0-0"></td><td class="shipOn" id="bot1-0-1"></td><td class="empty" id="bot1-0-2"></td><td class="empty" id="bot1-0-3"></td><td class="empty" id="bot1-0-4"></td><td class="empty" id="bot1-0-5"></td><td class="empty" id="bot1-0-6"></td><td class="empty" id="bot1-0-7"></td><td class="empty" id="bot1-0-8"></td><td class="empty" id="bot1-0-9"></td></tr> <tr><td>0</td><td class="empty" id="bot1-0-0"></td><td class="shipOn" id="bot1-0-1"></td><td class="shipOn" id="bot1-0-2"></td><td class="shipOn" id="bot1-0-3"></td><td class="empty" id="bot1-0-4"></td><td class="empty" id="bot1-0-5"></td><td class="empty" id="bot1-0-6"></td><td class="empty" id="bot1-0-7"></td><td class="empty" id="bot1-0-8"></td><td class="empty" id="bot1-0-9"></td></tr>
<tr><td>1</td><td class="empty" id="bot1-1-0"></td><td class="shipOn" id="bot1-1-1"></td><td class="empty" id="bot1-1-2"></td><td class="empty" id="bot1-1-3"></td><td class="empty" id="bot1-1-4"></td><td class="empty" id="bot1-1-5"></td><td class="empty" id="bot1-1-6"></td><td class="empty" id="bot1-1-7"></td><td class="empty" id="bot1-1-8"></td><td class="empty" id="bot1-1-9"></td></tr> <tr><td>1</td><td class="empty" id="bot1-1-0"></td><td class="empty" id="bot1-1-1"></td><td class="empty" id="bot1-1-2"></td><td class="empty" id="bot1-1-3"></td><td class="empty" id="bot1-1-4"></td><td class="empty" id="bot1-1-5"></td><td class="empty" id="bot1-1-6"></td><td class="empty" id="bot1-1-7"></td><td class="empty" id="bot1-1-8"></td><td class="empty" id="bot1-1-9"></td></tr>
<tr><td>2</td><td class="empty" id="bot1-2-0"></td><td class="shipOn" id="bot1-2-1"></td><td class="empty" id="bot1-2-2"></td><td class="empty" id="bot1-2-3"></td><td class="empty" id="bot1-2-4"></td><td class="empty" id="bot1-2-5"></td><td class="empty" id="bot1-2-6"></td><td class="empty" id="bot1-2-7"></td><td class="empty" id="bot1-2-8"></td><td class="empty" id="bot1-2-9"></td></tr> <tr><td>2</td><td class="empty" id="bot1-2-0"></td><td class="shipOn" id="bot1-2-1"></td><td class="shipOn" id="bot1-2-2"></td><td class="shipOn" id="bot1-2-3"></td><td class="shipOn" id="bot1-2-4"></td><td class="empty" id="bot1-2-5"></td><td class="empty" id="bot1-2-6"></td><td class="empty" id="bot1-2-7"></td><td class="empty" id="bot1-2-8"></td><td class="empty" id="bot1-2-9"></td></tr>
<tr><td>3</td><td class="empty" id="bot1-3-0"></td><td class="shipOn" id="bot1-3-1"></td><td class="empty" id="bot1-3-2"></td><td class="empty" id="bot1-3-3"></td><td class="empty" id="bot1-3-4"></td><td class="empty" id="bot1-3-5"></td><td class="empty" id="bot1-3-6"></td><td class="empty" id="bot1-3-7"></td><td class="empty" id="bot1-3-8"></td><td class="empty" id="bot1-3-9"></td></tr> <tr><td>3</td><td class="empty" id="bot1-3-0"></td><td class="empty" id="bot1-3-1"></td><td class="empty" id="bot1-3-2"></td><td class="shipOn" id="bot1-3-3"></td><td class="shipOn" id="bot1-3-4"></td><td class="shipOn" id="bot1-3-5"></td><td class="shipOn" id="bot1-3-6"></td><td class="shipOn" id="bot1-3-7"></td><td class="empty" id="bot1-3-8"></td><td class="empty" id="bot1-3-9"></td></tr>
<tr><td>4</td><td class="empty" id="bot1-4-0"></td><td class="empty" id="bot1-4-1"></td><td class="shipOn" id="bot1-4-2"></td><td class="shipOn" id="bot1-4-3"></td><td class="empty" id="bot1-4-4"></td><td class="empty" id="bot1-4-5"></td><td class="empty" id="bot1-4-6"></td><td class="empty" id="bot1-4-7"></td><td class="empty" id="bot1-4-8"></td><td class="empty" id="bot1-4-9"></td></tr> <tr><td>4</td><td class="empty" id="bot1-4-0"></td><td class="empty" id="bot1-4-1"></td><td class="empty" id="bot1-4-2"></td><td class="empty" id="bot1-4-3"></td><td class="empty" id="bot1-4-4"></td><td class="empty" id="bot1-4-5"></td><td class="empty" id="bot1-4-6"></td><td class="empty" id="bot1-4-7"></td><td class="empty" id="bot1-4-8"></td><td class="empty" id="bot1-4-9"></td></tr>
<tr><td>5</td><td class="empty" id="bot1-5-0"></td><td class="empty" id="bot1-5-1"></td><td class="empty" id="bot1-5-2"></td><td class="empty" id="bot1-5-3"></td><td class="empty" id="bot1-5-4"></td><td class="empty" id="bot1-5-5"></td><td class="empty" id="bot1-5-6"></td><td class="empty" id="bot1-5-7"></td><td class="empty" id="bot1-5-8"></td><td class="empty" id="bot1-5-9"></td></tr> <tr><td>5</td><td class="empty" id="bot1-5-0"></td><td class="empty" id="bot1-5-1"></td><td class="empty" id="bot1-5-2"></td><td class="empty" id="bot1-5-3"></td><td class="empty" id="bot1-5-4"></td><td class="empty" id="bot1-5-5"></td><td class="empty" id="bot1-5-6"></td><td class="empty" id="bot1-5-7"></td><td class="empty" id="bot1-5-8"></td><td class="empty" id="bot1-5-9"></td></tr>
<tr><td>6</td><td class="empty" id="bot1-6-0"></td><td class="empty" id="bot1-6-1"></td><td class="empty" id="bot1-6-2"></td><td class="shipOn" id="bot1-6-3"></td><td class="shipOn" id="bot1-6-4"></td><td class="shipOn" id="bot1-6-5"></td><td class="empty" id="bot1-6-6"></td><td class="empty" id="bot1-6-7"></td><td class="empty" id="bot1-6-8"></td><td class="empty" id="bot1-6-9"></td></tr> <tr><td>6</td><td class="empty" id="bot1-6-0"></td><td class="empty" id="bot1-6-1"></td><td class="empty" id="bot1-6-2"></td><td class="empty" id="bot1-6-3"></td><td class="empty" id="bot1-6-4"></td><td class="empty" id="bot1-6-5"></td><td class="empty" id="bot1-6-6"></td><td class="empty" id="bot1-6-7"></td><td class="empty" id="bot1-6-8"></td><td class="empty" id="bot1-6-9"></td></tr>
<tr><td>7</td><td class="empty" id="bot1-7-0"></td><td class="empty" id="bot1-7-1"></td><td class="empty" id="bot1-7-2"></td><td class="empty" id="bot1-7-3"></td><td class="empty" id="bot1-7-4"></td><td class="empty" id="bot1-7-5"></td><td class="empty" id="bot1-7-6"></td><td class="empty" id="bot1-7-7"></td><td class="empty" id="bot1-7-8"></td><td class="empty" id="bot1-7-9"></td></tr> <tr><td>7</td><td class="empty" id="bot1-7-0"></td><td class="shipOn" id="bot1-7-1"></td><td class="shipOn" id="bot1-7-2"></td><td class="shipOn" id="bot1-7-3"></td><td class="empty" id="bot1-7-4"></td><td class="empty" id="bot1-7-5"></td><td class="empty" id="bot1-7-6"></td><td class="empty" id="bot1-7-7"></td><td class="shipOn" id="bot1-7-8"></td><td class="empty" id="bot1-7-9"></td></tr>
<tr><td>8</td><td class="empty" id="bot1-8-0"></td><td class="empty" id="bot1-8-1"></td><td class="empty" id="bot1-8-2"></td><td class="empty" id="bot1-8-3"></td><td class="empty" id="bot1-8-4"></td><td class="empty" id="bot1-8-5"></td><td class="empty" id="bot1-8-6"></td><td class="empty" id="bot1-8-7"></td><td class="empty" id="bot1-8-8"></td><td class="empty" id="bot1-8-9"></td></tr> <tr><td>8</td><td class="empty" id="bot1-8-0"></td><td class="empty" id="bot1-8-1"></td><td class="empty" id="bot1-8-2"></td><td class="empty" id="bot1-8-3"></td><td class="empty" id="bot1-8-4"></td><td class="empty" id="bot1-8-5"></td><td class="empty" id="bot1-8-6"></td><td class="empty" id="bot1-8-7"></td><td class="shipOn" id="bot1-8-8"></td><td class="empty" id="bot1-8-9"></td></tr>
<tr><td>9</td><td class="empty" id="bot1-9-0"></td><td class="empty" id="bot1-9-1"></td><td class="empty" id="bot1-9-2"></td><td class="empty" id="bot1-9-3"></td><td class="empty" id="bot1-9-4"></td><td class="empty" id="bot1-9-5"></td><td class="empty" id="bot1-9-6"></td><td class="empty" id="bot1-9-7"></td><td class="empty" id="bot1-9-8"></td><td class="empty" id="bot1-9-9"></td></tr> <tr><td>9</td><td class="empty" id="bot1-9-0"></td><td class="empty" id="bot1-9-1"></td><td class="empty" id="bot1-9-2"></td><td class="empty" id="bot1-9-3"></td><td class="empty" id="bot1-9-4"></td><td class="empty" id="bot1-9-5"></td><td class="empty" id="bot1-9-6"></td><td class="empty" id="bot1-9-7"></td><td class="empty" id="bot1-9-8"></td><td class="empty" id="bot1-9-9"></td></tr>
</table> </table>
<p>largeur; 10, hauteur 10; 3 bateaux:</p>
<ul>
<li>Bateau de 4 cases ayant pour extrémités 1,0 et 1,3. sera noté &quot;1,0-1,3&quot; ou &quot;1,3-1,0&quot;</li>
<li>Bateau de 2 cases ayant pour extrémités 2,4 et 3,4. sera noté &quot;2,4-3,4&quot; ou &quot;3,4-2,4&quot;</li>
<li>Bateau de 3 cases ayant pour extrémités 3,6 et 5,6. sera noté &quot;3,6-5,6&quot; ou &quot;5,6-3,6&quot;</li>
</ul>
<p>Pour placer ces 3 bateaux, vous devez retourner au format JSON le tableau suivant:</p> <h3>Lors du combat</h3>
<p> Voici quelques exemples des parametres envoyés par l'arène.</p>
<h4>Premier tour de jeu (your_strikes et his_strikes sont vides)</h4>
<pre> <pre>
&#91;&quot;1,0-1,3&quot;,&quot;2,4-3,4&quot;,&quot;3,6-5,6&quot;&#93; [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> </pre>
<h4>Deuxième tour de jeu</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>Troisième tour de jeu</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>Vous devez tout simplement retourner l'adresse de la case sur laquelle vous souhaitez x,y</h4>
<pre>
6,9
</pre>
<p>Pour tirer aux coordonnées x=6 y=9</p>

View File

@ -83,8 +83,6 @@ function place_ship_on_map($x1,$y1,$x2,$y2,$map){
OR (!isset($map[$y2][$x2]))){ OR (!isset($map[$y2][$x2]))){
return false; return false;
} }
if($x1 == $x2){ if($x1 == $x2){
//horizontal ship //horizontal ship
if($y1 <= $y2 ){ if($y1 <= $y2 ){

View File

@ -36,7 +36,7 @@ function fight(xd_check){
var p=createElem("p"); var p=createElem("p");
p.innerHTML=strike['log']; p.innerHTML=strike['log'];
document.getElementById('logs').appendChild(p); document.getElementById('logs').appendChild(p);
document.getElementById("logs").scrollTop=document.getElementById("logs").scrollHeight;
if( strike['continue'] == 1){ if( strike['continue'] == 1){
fight(xd_check); fight(xd_check);
} }

View File

@ -2,9 +2,13 @@ article p {width: 100%;}
article p label {float:left; text-align:right; width:60%} article p label {float:left; text-align:right; width:60%}
article p select {} article p select {}
td{min-width: 15px; height: 15px;} td{min-width: 15px; height: 15px;}
.battleshipGrid{float: left; border-collapse:collapse; margin: 20px 20px 20px 20px;} #fightResult{display:table;}
#logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;}
.battleshipGrid{display:table-cell; padding-left:10px; border-collapse:collapse; margin: 20px 20px 20px 20px;}
.nofloat{float: none;} .nofloat{float: none;}
.battleshipGrid tr{} .battleshipGrid tr{}
.battleshipGrid tr td{border: 1px dashed green; text-align: center; font-weight: bold;} .battleshipGrid tr td{border: 1px dashed green; text-align: center; font-weight: bold;}
.battleshipGrid tr th{text-align: center;} .battleshipGrid tr th{text-align: center;}
.tabledoc{border-collapse:collapse;}
.tabledoc tr td,.tabledoc tr th{border: 1px solid green; padding-left: 5px;}
.shipOn{background-color: black; color: #fff;} .shipOn{background-color: black; color: #fff;}

View File

@ -1,12 +1,10 @@
<article> <article>
<?php echo $lang['SITE_DESCRIPTION'];?> <?php echo $lang['SITE_DESCRIPTION'];?>
</article> <h2><?php echo $lang['ADD_YOUR_BOT'];?></h2>
<article>
<h2>Ajouter votre bot</h2>
<form method="POST" action="/p/addBot"> <form method="POST" action="/p/addBot">
<?php echo xd_check_input(0); ?><input type="hidden" name="act" value="addBot"/> <?php echo xd_check_input(0); ?><input type="hidden" name="act" value="addBot"/>
<p><label for="botName">Nom de votre Bot: </label><input id="botName" type="text" name="botName" placeholder="votre pseudo par exemple"/></p> <p><label for="botName"><?php echo $lang['BOT_NAME']; ?></label><input id="botName" type="text" name="botName" placeholder="<?php echo $lang['YOUR_ALIAS_FOR_EXEMPLE']; ?>"/></p>
<p><label for="botGame">Jeu du bot: </label> <p><label for="botGame"><?php echo $lang['BOT_GAME']; ?></label>
<select id="botGame" name="botGame"> <select id="botGame" name="botGame">
<?php <?php
foreach($arenas as $arena){ foreach($arenas as $arena){
@ -14,10 +12,10 @@
} }
?> ?>
</select></p> </select></p>
<p><label for="botURL">URL du bot:</label><input type="text" name="botURL" id="botURL" placeholder="http://"/></p> <p><label for="botURL"><?php echo $lang['BOT_URL']; ?></label><input type="text" name="botURL" id="botURL" placeholder="http://"/></p>
<p><label>Description:</label><textarea name="botDescription"></textarea></p> <p><label><?php echo $lang['BOT_DESCRIPTION']; ?></label><textarea name="botDescription"></textarea></p>
<p><label for="email">Votre e-mail (sera utilisé pour valider l'inscription du bot)</label><input type="text" name="email" id="email"/></p> <p><label for="email"><?php echo $lang['YOUR_EMAIL_FOR_BOT_VALIDATION']; ?></label><input type="text" name="email" id="email"/></p>
<p><label for="sub"></label><input id="sub" type="submit" value="Enregistrer mon bot"/></p> <p><label for="sub"></label><input id="sub" type="submit" value="<?php echo $lang['SAVE_BOT']; ?>"/></p>
</form> </form>
</article> </article>