commit
4889e67f61
|
@ -108,6 +108,7 @@ pre{
|
||||||
font-family: Consolas, "Times New Roman", Verdana;
|
font-family: Consolas, "Times New Roman", Verdana;
|
||||||
border-left: 4px solid #CCC;
|
border-left: 4px solid #CCC;
|
||||||
padding-left: 8px;
|
padding-left: 8px;
|
||||||
|
white-space: normal;
|
||||||
}
|
}
|
||||||
.podium{list-style-type:none;padding: 5px 20px 5px 0;}
|
.podium{list-style-type:none;padding: 5px 20px 5px 0;}
|
||||||
.podium li{padding: 5px 20px 5px 0;}
|
.podium li{padding: 5px 20px 5px 0;}
|
||||||
|
|
11
lang/en.php
11
lang/en.php
|
@ -1,5 +1,14 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
$lang = array(
|
$lang = array(
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
|
|
||||||
|
|
11
lang/fr.php
11
lang/fr.php
|
@ -1,5 +1,14 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
$lang = array(
|
$lang = array(
|
||||||
'lang' => 'fr',
|
'lang' => 'fr',
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,16 @@
|
||||||
<article>
|
<article>
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
echo '<h2>A props de '.htmlentities($_GET['params']).'</h2><p>Inscrit le '.$theBot['date_inscription'].'</p><p>'.$theBot['description'].'</p>
|
echo '<h2>A props de '.htmlentities($_GET['params']).'</h2><p>Inscrit le '.$theBot['date_inscription'].'</p><p>'.$theBot['description'].'</p>
|
||||||
<p><i><a href="/p/editBot/'.$theBot['id'].'">Si vous êtes le propriétaire de ce bot, vous pouvez le modifier</a></i></p>';
|
<p><i><a href="/p/editBot/'.$theBot['id'].'">Si vous êtes le propriétaire de ce bot, vous pouvez le modifier</a></i></p>';
|
||||||
?>
|
?>
|
||||||
|
|
10
src/act.php
10
src/act.php
|
@ -1,4 +1,14 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
//Del unvalidated bots
|
//Del unvalidated bots
|
||||||
mysqli_query($lnMysql, "DELETE FROM bots WHERE active='0' AND TIMESTAMPDIFF(DAY, NOW(), date_inscription) > 2");
|
mysqli_query($lnMysql, "DELETE FROM bots WHERE active='0' AND TIMESTAMPDIFF(DAY, NOW(), date_inscription) > 2");
|
||||||
|
|
|
@ -1,6 +1,17 @@
|
||||||
<article>
|
<article>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
//<?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"/>
|
||||||
|
|
||||||
if((isset($_POST['xd_check'])) && ($_POST['act'] == "addBot")){
|
if((isset($_POST['xd_check'])) && ($_POST['act'] == "addBot")){
|
||||||
|
|
|
@ -50,8 +50,17 @@ switch ($_POST['act']){
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
$postValues[$p[0]]=$value;
|
$postValues[$p[0]]=$value;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if(($_POST['fullLogs'] <> 'true') && ($_POST['fullLogs'] <> 'false')){
|
||||||
|
error(500, 'wrong POST parameters');
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
if($_POST['fullLogs'] == 'true'){
|
||||||
|
$wantFullLogs = true;
|
||||||
|
}else{
|
||||||
|
$wantFullLogs = false;
|
||||||
|
}
|
||||||
|
|
||||||
//check if bots exists
|
//check if bots exists
|
||||||
$bot1Exists = false;
|
$bot1Exists = false;
|
||||||
$bot2Exists = false;
|
$bot2Exists = false;
|
||||||
|
@ -75,14 +84,18 @@ switch ($_POST['act']){
|
||||||
error (500,"missing parameter 2");
|
error (500,"missing parameter 2");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!is_it_possible_to_place_ships_on_grid($postValues['gridWidth'],$postValues['gridHeight'],$postValues['nbShip1'],$postValues['nbShip2'],$postValues['nbShip3'],$postValues['nbShip4'],$postValues['nbShip5'],$postValues['nbShip6'])){
|
|
||||||
|
if(!is_it_possible_to_place_ships_on_grid($postValues['gridWidth'],$postValues['gridHeight'],
|
||||||
|
$postValues['nbShip1'],$postValues['nbShip2'],$postValues['nbShip3'],
|
||||||
|
$postValues['nbShip4'],$postValues['nbShip5'],$postValues['nbShip6']))
|
||||||
|
{
|
||||||
error (404,"grid is too little for these ships");
|
error (404,"grid is too little for these ships");
|
||||||
}
|
}
|
||||||
|
|
||||||
//vars checked, lets init the initGame
|
//******vars checked, lets init the initGame *******
|
||||||
|
|
||||||
$_SESSION['matchId']=get_unique_id();
|
$_SESSION['matchId']=get_unique_id();
|
||||||
|
$grid['logs'] = array();
|
||||||
|
|
||||||
for($player = 1; $player <= 2; $player++){
|
for($player = 1; $player <= 2; $player++){
|
||||||
|
|
||||||
|
@ -95,9 +108,12 @@ switch ($_POST['act']){
|
||||||
}
|
}
|
||||||
|
|
||||||
$botParamsToSend=array(
|
$botParamsToSend=array(
|
||||||
'game' => 'Battleship',
|
'game-id' => $_SESSION['matchId'],
|
||||||
'match_id' => $_SESSION['matchId']."-1",
|
'game' => 'battleship',
|
||||||
'act' => 'init',
|
'action' => 'init',
|
||||||
|
'players' => 2,
|
||||||
|
'player-index' => $player -1,
|
||||||
|
'board' => array(
|
||||||
'opponent' => $opponentName,
|
'opponent' => $opponentName,
|
||||||
'width' => $postValues['gridWidth'],
|
'width' => $postValues['gridWidth'],
|
||||||
'height' => $postValues['gridHeight'],
|
'height' => $postValues['gridHeight'],
|
||||||
|
@ -107,12 +123,21 @@ switch ($_POST['act']){
|
||||||
'ship4' => $postValues['nbShip4'],
|
'ship4' => $postValues['nbShip4'],
|
||||||
'ship5' => $postValues['nbShip5'],
|
'ship5' => $postValues['nbShip5'],
|
||||||
'ship6' => $postValues['nbShip6']
|
'ship6' => $postValues['nbShip6']
|
||||||
|
)
|
||||||
);
|
);
|
||||||
$anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend);
|
|
||||||
$boatsPlayer = json_decode( html_entity_decode($anwserPlayer));
|
$anwserPlayerJson=get_IA_Response($currentBot['url'],$botParamsToSend);
|
||||||
if(!$boatsPlayer){
|
if($wantFullLogs){
|
||||||
echo $currentBot['name']." a fait une réponse non conforme, il perd.".$anwserPlayer;
|
$fullLogs='Arena send to '.$currentBot['name'].'<em>'.htmlentities($anwserPlayerJson['messageSend']).'</em><br/>
|
||||||
|
HTTP status: <em>'.htmlentities($anwserPlayerJson['httpStatus']).'</em><br/>
|
||||||
|
Bot anwser: <em>'.htmlentities($anwserPlayerJson['response']).'</em><br/>';
|
||||||
|
}else{
|
||||||
|
$fullLogs="";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!isset($anwserPlayerJson['responseArr']['boats'])){
|
||||||
|
|
||||||
|
echo $fullLogs.$currentBot['name']." a fait une réponse non conforme, il perd 1.";
|
||||||
if($player==1){
|
if($player==1){
|
||||||
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
|
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
|
||||||
}else{
|
}else{
|
||||||
|
@ -121,6 +146,8 @@ switch ($_POST['act']){
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$boatsPlayer = $anwserPlayerJson['responseArr']['boats'];
|
||||||
|
|
||||||
//init grid
|
//init grid
|
||||||
for($y = 0; $y < $postValues['gridHeight']; $y++){
|
for($y = 0; $y < $postValues['gridHeight']; $y++){
|
||||||
for($x = 0; $x < $postValues['gridWidth']; $x++){
|
for($x = 0; $x < $postValues['gridWidth']; $x++){
|
||||||
|
@ -182,7 +209,7 @@ switch ($_POST['act']){
|
||||||
}
|
}
|
||||||
foreach($nbBoatsIwant as $nb){
|
foreach($nbBoatsIwant as $nb){
|
||||||
if($nb <> 0){
|
if($nb <> 0){
|
||||||
echo $currentBot['name']." n'a pas placé le bon nombre de bateaux. Il perd.";
|
echo $fullLogs.$currentBot['name']." n'a pas placé le bon nombre de bateaux. Il perd.";
|
||||||
if($player==1){
|
if($player==1){
|
||||||
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
|
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
|
||||||
}else{
|
}else{
|
||||||
|
@ -191,6 +218,7 @@ switch ($_POST['act']){
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$grid['logs'][] = $fullLogs.$currentBot['name']." put his ships on the map.";
|
||||||
}
|
}
|
||||||
$_SESSION['ship1']=$postValues['nbShip1'];
|
$_SESSION['ship1']=$postValues['nbShip1'];
|
||||||
$_SESSION['ship2']=$postValues['nbShip2'];
|
$_SESSION['ship2']=$postValues['nbShip2'];
|
||||||
|
@ -208,6 +236,19 @@ switch ($_POST['act']){
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "fight":
|
case "fight":
|
||||||
|
if(($_POST['fullLogs'] <> 'true') && ($_POST['fullLogs'] <> 'false')){
|
||||||
|
error(500, 'wrong POST parameters');
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
if($_POST['fullLogs'] == 'true'){
|
||||||
|
$wantFullLogs = true;
|
||||||
|
}else{
|
||||||
|
$wantFullLogs = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!isset($fullLogs)){
|
||||||
|
$fullLogs = "";
|
||||||
|
}
|
||||||
|
|
||||||
if(count($_SESSION['strikes'][1]) == count($_SESSION['strikes'][2])){
|
if(count($_SESSION['strikes'][1]) == count($_SESSION['strikes'][2])){
|
||||||
//player 1 has to fight
|
//player 1 has to fight
|
||||||
|
@ -225,8 +266,10 @@ switch ($_POST['act']){
|
||||||
|
|
||||||
$botParamsToSend=array(
|
$botParamsToSend=array(
|
||||||
'game' => 'Battleship',
|
'game' => 'Battleship',
|
||||||
'match_id' => $_SESSION['matchId']."-".$currentPlayer,
|
'game-id' => $_SESSION['matchId'],
|
||||||
'act' => 'fight',
|
'action' => 'play-turn',
|
||||||
|
'player-index' => $currentPlayer - 1,
|
||||||
|
'board' => array(
|
||||||
'opponent' => $opponentName,
|
'opponent' => $opponentName,
|
||||||
'width' => $_SESSION['width'],
|
'width' => $_SESSION['width'],
|
||||||
'height' => $_SESSION['height'],
|
'height' => $_SESSION['height'],
|
||||||
|
@ -236,27 +279,36 @@ switch ($_POST['act']){
|
||||||
'ship4' => $_SESSION['ship4'],
|
'ship4' => $_SESSION['ship4'],
|
||||||
'ship5' => $_SESSION['ship5'],
|
'ship5' => $_SESSION['ship5'],
|
||||||
'ship6' => $_SESSION['ship6'],
|
'ship6' => $_SESSION['ship6'],
|
||||||
'your_strikes' => json_encode($_SESSION['strikes'][$currentPlayer]),
|
'your_strikes' => $_SESSION['strikes'][$currentPlayer],
|
||||||
'his_strikes' => json_encode($_SESSION['strikes'][$opponent])
|
'his_strikes' => $_SESSION['strikes'][$opponent]
|
||||||
|
)
|
||||||
);
|
);
|
||||||
$anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend);
|
$anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend);
|
||||||
|
$anwserPlayerJson=$anwserPlayer['responseArr'];
|
||||||
|
if($wantFullLogs){
|
||||||
|
$fullLogs.='Arena send to '.$currentBot['name'].'<em>'.htmlentities($anwserPlayer['messageSend']).'</em><br />
|
||||||
|
HTTP status: <em>'.htmlentities($anwserPlayer['httpStatus']).'</em><br />
|
||||||
|
Bot anwser: <em>'.htmlentities($anwserPlayer['response']).'</em><br />';
|
||||||
|
}else{
|
||||||
|
$fullLogs.="";
|
||||||
|
}
|
||||||
|
|
||||||
if(!preg_match('/^[0-9]+,[0-9]+$/',$anwserPlayer)){
|
|
||||||
|
if ((!isset($anwserPlayerJson['play']))
|
||||||
|
OR (!preg_match('/^[0-9]+,[0-9]+$/',$anwserPlayerJson['play']))){
|
||||||
echo json_encode(array(
|
echo json_encode(array(
|
||||||
'target' => '',
|
'target' => '',
|
||||||
'log' => $currentBot['name']." a fait une réponse non conforme, il perd.".$anwserPlayer
|
'logs' => $fullLogs.$currentBot['name']." a fait une réponse non conforme, il perd."));
|
||||||
));
|
|
||||||
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
|
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
list($x,$y)=explode(",",$anwserPlayer);
|
list($x,$y)=explode(",",$anwserPlayerJson['play']);
|
||||||
|
|
||||||
//check if shot is under map's limits
|
//check if shot is under map's limits
|
||||||
if(($x >= $_SESSION['width']) OR ($y >= $_SESSION['height'])){
|
if(($x >= $_SESSION['width']) OR ($y >= $_SESSION['height'])){
|
||||||
echo json_encode(array(
|
echo json_encode(array(
|
||||||
'target' => '',
|
'target' => '',
|
||||||
'log' => $currentBot['name']." a fait un tir en dehors des limites de la carte. ".$x.",".$y." C'est interdit par les conventions de Geneve. Il perd"
|
'logs' => $fullLogs.$currentBot['name']." a fait un tir en dehors des limites de la carte. ".$x.",".$y." C'est interdit par les conventions de Geneve. Il perd"
|
||||||
));
|
));
|
||||||
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
|
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
|
||||||
die;
|
die;
|
||||||
|
@ -313,7 +365,7 @@ switch ($_POST['act']){
|
||||||
echo json_encode(array(
|
echo json_encode(array(
|
||||||
'opponent'=> $opponent,
|
'opponent'=> $opponent,
|
||||||
'target' => $x.",".$y,
|
'target' => $x.",".$y,
|
||||||
'log' => $currentBot['name']." tire en ".$x.",".$y." ".$result,
|
'logs' => $fullLogs.$currentBot['name']." tire en ".$x.",".$y." ".$result,
|
||||||
'continue' => $continue
|
'continue' => $continue
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
@ -1,173 +1,62 @@
|
||||||
<p>
|
<h1>Fonctionnement de la bataille navale</h1>
|
||||||
Battleship is played in two stages :
|
<p>Elle se joue en deux phases</p>
|
||||||
</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Boats placement on maps</li>
|
<li>Placement des bateaux sur les maps</li>
|
||||||
<li>Shootout</li>
|
<li>Echange de tirs</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<h2>Communications entre l'arène et votre bot</h2>
|
||||||
At each turn, the arena made HTTP(s) queries containing POST parameters, to your bots.<br/>
|
<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>
|
||||||
They must respond to the specifications below.
|
<p>Votre bot répond par un array au format JSON.</p>
|
||||||
</p>
|
<h3>Message d'initialisation de votre partie</h3>
|
||||||
<h2>Descriptif des paramètres envoyés par l'arène</h2>
|
l'arène envoie le message suivant:
|
||||||
<table class="tabledoc">
|
<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>
|
||||||
<tr>
|
<p>Si on décompose le tableau pour l'expliquer:</p>
|
||||||
<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/>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>"init" : We start the game, you must place your ships</li>
|
<li><em>game-id</em> string identifiant la partie.</li>
|
||||||
<li>"fight" : You send a shot</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>
|
||||||
</ul>
|
<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>
|
||||||
</td>
|
<li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
|
||||||
</tr>
|
<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>
|
||||||
<tr>
|
<li><em>board</em> un tableau vous donnant les parametres:
|
||||||
<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>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>The index target indicates the coordinates of the target shooting x,y</li>
|
<li><em>opponent</em> Chaîne de caractères identifiant votre adversaire.
|
||||||
<li>
|
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>
|
||||||
result may be :
|
<li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
|
||||||
<ul>
|
<li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
|
||||||
<li>Empty "" means that the shot did not hit anything</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>"hit" An enemy ship has been hit</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>"hit and sunk" An enemy ship was hit and sunk</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>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</td>
|
<p>Votre bot doit retourner le nom de votre bot et le placement de vos bateaux au format JSON:</p>
|
||||||
</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>
|
<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
|
{"name":"gnieark","boats":["4,2-4,6","3,3-3,0","2,3-2,1","7,9-5,9","6,8-6,7"]}
|
||||||
</pre>
|
</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>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>The grid starts at the point 0,0.</li>
|
<li><em>name</em> Le nom de votre bot (actuellment non pris en compte par cette arène).</li>
|
||||||
<li>Integers, ordinate and abscissa, defining a point, are separated by a comma ",".</li>
|
<li><em>boats</em> Tableau indiquant le placement de vos bateaux</li>
|
||||||
<li>The two points defining the ends a ship shall be separated by a hyphen "-".</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<h4>Placement example of 5 boats with respective sizes 5, 4, 3, 3, 2 boxes :</h4>
|
<ul>
|
||||||
|
<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>Exemple de placement de 5 bateaux tailles respectives 5, 4, 3, 3, 2 cases :</h4>
|
||||||
<pre>
|
<pre>
|
||||||
["3,3-3,7","2,1-2,4","0,1-0,3","7,3-7,1","8,8-7,8"]
|
["3,3-3,7","2,1-2,4","0,1-0,3","7,3-7,1","8,8-7,8"]
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<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>
|
||||||
<p>
|
<p>
|
||||||
The order of the boats does not matter.<br/>
|
L'ordre des bateaux n'a pas d'importance.<br/>
|
||||||
Similarly, for a boat, the order of its points does not matter either.
|
De la même manière, pour un bateau, l'ordre de ses points n'importe pas non plus.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Seen on the grid, the example above would be :
|
Vu sur la grille, l'exemple précédent donnerait :
|
||||||
</p>
|
</p>
|
||||||
<table class="battleshipGrid nofloat" id="tbl1">
|
<table class="battleshipGrid nofloat" id="tbl1">
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -314,65 +203,70 @@
|
||||||
<td class="empty" id="bot1-9-9"></td>
|
<td class="empty" id="bot1-9-9"></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h3>During the fight</h3>
|
|
||||||
<p>
|
<h3>Message vous demandant de jouer (seulement un tour)</h3>
|
||||||
Examples of parameters sent by the arena.
|
<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>
|
</p>
|
||||||
<h4>First round (your_strikes and his_strikes are empty)</h4>
|
<pre>[ ]</pre>
|
||||||
<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>
|
<p>
|
||||||
To shoot on the coordinates x=6 y=9
|
Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :
|
||||||
</p>
|
</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>
|
|
@ -1,155 +1,45 @@
|
||||||
<p>
|
<h1>Fonctionnement de la bataille navale</h1>
|
||||||
La bataille navale se joue en deux phases :
|
<p>Elle se joue en deux phases</p>
|
||||||
</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Placement des bateaux sur les maps</li>
|
<li>Placement des bateaux sur les maps</li>
|
||||||
<li>Echange de tirs</li>
|
<li>Echange de tirs</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<h2>Communications entre l'arène et votre bot</h2>
|
||||||
A chaque tour de jeu l'arène fait des requetes http(s) contenant des paramètres de type POST, vers vos bots.<br/>
|
<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>
|
||||||
Ces derniers doivent répondre selon les spécifications ci dessous.
|
<p>Votre bot répond par un array au format JSON.</p>
|
||||||
</p>
|
<h3>Message d'initialisation de votre partie</h3>
|
||||||
<h2>Descriptif des paramètres envoyés par l'arène</h2>
|
l'arène envoie le message suivant:
|
||||||
<table class="tabledoc">
|
<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>
|
||||||
<tr>
|
<p>Si on décompose le tableau pour l'expliquer:</p>
|
||||||
<th>Paramètre</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>game</td>
|
|
||||||
<td>
|
|
||||||
Chaîne de caractères, sera toujours "Battleship".<br/>
|
|
||||||
Peut servir si votre url sert à plusieurs jeux.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>match_id</td>
|
|
||||||
<td>
|
|
||||||
Chaîne de caractères. Répond à l'expression régulière suivante: ^[0-9]+-(1|2)$<br/>
|
|
||||||
Le premier nombre (digits avant le tiret) identifie le match.<br/>
|
|
||||||
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/>
|
|
||||||
Ça vous servira si votre IA fait des statistiques sur les matchs.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>act</td>
|
|
||||||
<td>
|
|
||||||
Peut prendre deux valeurs :<br/>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>"init" : On démarre la partie, vous devez placer vos bateaux</li>
|
<li><em>game-id</em> string identifiant la partie.</li>
|
||||||
<li>"fight" : Vous envoyez un tir</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>
|
||||||
</ul>
|
<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>
|
||||||
</td>
|
<li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
|
||||||
</tr>
|
<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>
|
||||||
<tr>
|
<li><em>board</em> un tableau vous donnant les parametres:
|
||||||
<td>opponent</td>
|
|
||||||
<td>
|
|
||||||
Chaîne de caractères identifiant votre adversaire.<br/>
|
|
||||||
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>
|
|
||||||
<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>...</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).<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>
|
|
||||||
<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>
|
<ul>
|
||||||
<li>L'index target indique les coordonnées du tir x,y</li>
|
<li><em>opponent</em> Chaîne de caractères identifiant votre adversaire.
|
||||||
<li>
|
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>
|
||||||
result peut être :
|
<li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
|
||||||
<ul>
|
<li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
|
||||||
<li>Vide "" signifie que le tir n'a rien touché</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>"hit" Un navire ennemi a été touché</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>"hit and sunk" Un navire ennemi a été touché et coulé</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>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</td>
|
<p>Votre bot doit retourner le nom de votre bot et le placement de vos bateaux au format JSON:</p>
|
||||||
</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>
|
<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
|
{"name":"gnieark","boats":["4,2-4,6","3,3-3,0","2,3-2,1","7,9-5,9","6,8-6,7"]}
|
||||||
</pre>
|
</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 qui est un tableau JSON ayant autant d'enregistrements que de navires.<br/>
|
|
||||||
Chaque navire est défini par les coordonnées de ses extrémités.
|
|
||||||
</p>
|
|
||||||
<ul>
|
<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>
|
||||||
|
<h3>boats</h3>
|
||||||
<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 ",".</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>
|
<li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret "-".</li>
|
||||||
|
@ -313,65 +203,70 @@
|
||||||
<td class="empty" id="bot1-9-9"></td>
|
<td class="empty" id="bot1-9-9"></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h3>Lors du combat</h3>
|
|
||||||
<p>
|
<h3>Message vous demandant de jouer (seulement un tour)</h3>
|
||||||
Voici quelques exemples des parametres envoyés par l'arène.
|
<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>
|
</p>
|
||||||
<h4>Premier tour de jeu (your_strikes et his_strikes sont vides)</h4>
|
<pre>[ ]</pre>
|
||||||
<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 tirer sous forme de x,y</h4>
|
|
||||||
<pre>
|
|
||||||
6,9
|
|
||||||
</pre>
|
|
||||||
<p>
|
<p>
|
||||||
Pour tirer aux coordonnées x=6 y=9
|
Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :
|
||||||
</p>
|
</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>
|
|
@ -76,18 +76,6 @@ function generate_numeric_select($start,$end,$selected,$name,$id){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_IA_Response($iaUrl,$postParams){
|
|
||||||
$ch = curl_init();
|
|
||||||
curl_setopt($ch, CURLOPT_URL, $iaUrl);
|
|
||||||
curl_setopt($ch, CURLOPT_POST, true);
|
|
||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams);
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
||||||
$output = curl_exec($ch);
|
|
||||||
curl_close($ch);
|
|
||||||
return htmlentities($output);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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]))
|
||||||
|
|
|
@ -19,7 +19,7 @@ function createElem(type,attributes)
|
||||||
{elem.setAttribute(i,attributes[i]);}
|
{elem.setAttribute(i,attributes[i]);}
|
||||||
return elem;
|
return elem;
|
||||||
}
|
}
|
||||||
function fight(xd_check){
|
function fight(xd_check,fullLogs,gameId){
|
||||||
var xhr = Ajx();
|
var xhr = Ajx();
|
||||||
xhr.onreadystatechange = function(){if(xhr.readyState == 4){
|
xhr.onreadystatechange = function(){if(xhr.readyState == 4){
|
||||||
if(xhr.status == 200) {
|
if(xhr.status == 200) {
|
||||||
|
@ -34,11 +34,11 @@ function fight(xd_check){
|
||||||
document.getElementById( 'bot' + strike['opponent'] + '-' + coords[1] + '-' + coords[0]).innerHTML = "X";
|
document.getElementById( 'bot' + strike['opponent'] + '-' + coords[1] + '-' + coords[0]).innerHTML = "X";
|
||||||
}
|
}
|
||||||
var p=createElem("p");
|
var p=createElem("p");
|
||||||
p.innerHTML=strike['log'];
|
p.innerHTML=strike['logs'];
|
||||||
document.getElementById('logs').appendChild(p);
|
document.getElementById('logs').appendChild(p);
|
||||||
document.getElementById("logs").scrollTop=document.getElementById("logs").scrollHeight;
|
document.getElementById("logs").scrollTop=document.getElementById("logs").scrollHeight;
|
||||||
if( strike['continue'] == 1){
|
if( strike['continue'] == 1){
|
||||||
fight(xd_check);
|
fight(xd_check,fullLogs,gameId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -46,11 +46,11 @@ function fight(xd_check){
|
||||||
}};
|
}};
|
||||||
xhr.open("POST", '/Battleship', true);
|
xhr.open("POST", '/Battleship', true);
|
||||||
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||||
xhr.send('act=fight&xd_check=' + xd_check);
|
xhr.send('act=fight&xd_check=' + xd_check + '&fullLogs=' + fullLogs);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShip4,nbShip5,nbShip6,xd_check){
|
function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShip4,nbShip5,nbShip6,xd_check,fullLogs){
|
||||||
|
|
||||||
var shipsArea= parseInt(nbShip1) + 2 * parseInt(nbShip2) + 3 * parseInt(nbShip3) + 4 * parseInt(nbShip4) + 5 * parseInt(nbShip5) + 6 * parseInt(nbShip6);
|
var shipsArea= parseInt(nbShip1) + 2 * parseInt(nbShip2) + 3 * parseInt(nbShip3) + 4 * parseInt(nbShip4) + 5 * parseInt(nbShip5) + 6 * parseInt(nbShip6);
|
||||||
if(shipsArea > parseInt(gridWidth * gridHeight / 2) ){
|
if(shipsArea > parseInt(gridWidth * gridHeight / 2) ){
|
||||||
|
@ -131,10 +131,12 @@ function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (var i = 0; i < grids['logs'].length; i++) {
|
||||||
var p = createElem("p");
|
var p = createElem("p");
|
||||||
p.innerHTML='players placed theirs ships';
|
p.innerHTML = grids['logs'][i];
|
||||||
document.getElementById('logs').appendChild(p);
|
document.getElementById('logs').appendChild(p);
|
||||||
fight(xd_check);
|
}
|
||||||
|
fight(xd_check,fullLogs);
|
||||||
}
|
}
|
||||||
|
|
||||||
}};
|
}};
|
||||||
|
@ -152,6 +154,7 @@ function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShi
|
||||||
+ '&nbShip5=' + nbShip5
|
+ '&nbShip5=' + nbShip5
|
||||||
+ '&nbShip6=' + nbShip6
|
+ '&nbShip6=' + nbShip6
|
||||||
+ '&xd_check=' + xd_check
|
+ '&xd_check=' + xd_check
|
||||||
|
+ '&fullLogs=' + fullLogs
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,10 +1,21 @@
|
||||||
<article>
|
<!--<article>
|
||||||
<h2>Cette arène est en cours de maintenance, elle sera de nouveau prête dans les prochains jours</h2>
|
<h2>Cette arène est en cours de maintenance, elle sera de nouveau prête dans les prochains jours</h2>
|
||||||
<p><img style="width: 100%;" src="/imgs/Arenes-Nimes.jpg" alt="travaux sur les arènes de Nimes"/></p>
|
<p><img style="width: 100%;" src="/imgs/Arenes-Nimes.jpg" alt="travaux sur les arènes de Nimes"/></p>
|
||||||
|
|
||||||
</article>
|
</article>-->
|
||||||
<?php
|
<?php
|
||||||
/*
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
|
|
||||||
require_once(__DIR__."/functions.php");
|
require_once(__DIR__."/functions.php");
|
||||||
|
|
||||||
$bots=get_Bots_Array('Battleship');
|
$bots=get_Bots_Array('Battleship');
|
||||||
|
@ -55,9 +66,7 @@ if(!$postParams){
|
||||||
?>
|
?>
|
||||||
</select></em>
|
</select></em>
|
||||||
</p>
|
</p>
|
||||||
<!-- battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShip4,nbShip5,nbShip6,xd_check) -->
|
<p><input type="checkbox" id="fullLogs"/><label for="fullLogs">view the full logs</label></p>
|
||||||
<p><label> </label><input type="button" value="<?php echo $lang['FIGHT']; ?>" onclick="battleship(document.getElementById('bot1').value,document.getElementById('bot2').value,getElementById('width').value,getElementById('height').value,getElementById('ship1').value,getElementById('ship2').value,getElementById('ship3').value,getElementById('ship4').value,getElementById('ship5').value,getElementById('ship6').value,'<?php echo xd_check_input(2); ?>');"></p>
|
<p><label> </label><input type="button" value="<?php echo $lang['FIGHT']; ?>" onclick="battleship(document.getElementById('bot1').value,document.getElementById('bot2').value,getElementById('width').value,getElementById('height').value,getElementById('ship1').value,getElementById('ship2').value,getElementById('ship3').value,getElementById('ship4').value,getElementById('ship5').value,getElementById('ship6').value,'<?php echo xd_check_input(2); ?>',document.getElementById('fullLogs').checked);"></p>
|
||||||
<div id="fightResult"></div>
|
<div id="fightResult"></div>
|
||||||
</article
|
</article>
|
||||||
*/
|
|
||||||
?>
|
|
|
@ -4,6 +4,7 @@ article p select {}
|
||||||
td{min-width: 15px; height: 15px;}
|
td{min-width: 15px; height: 15px;}
|
||||||
#fightResult{display:table;}
|
#fightResult{display:table;}
|
||||||
#logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;}
|
#logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;}
|
||||||
|
#logs em {color: grey; font-size: 70%; test-transform:italic;}
|
||||||
.battleshipGrid{display:table-cell; padding-left:10px; border-collapse:collapse; margin: 20px 20px 20px 20px;}
|
.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{}
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
require_once(__DIR__."/functions.php");
|
require_once(__DIR__."/functions.php");
|
||||||
$bots=get_Bots_Array('connectFou');
|
$bots=get_Bots_Array('connectFou');
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<li><em>players</em> Int indicating the number of players in the game, still 2 on connect Four.</li>
|
<li><em>players</em> Int indicating the number of players in the game, still 2 on connect Four.</li>
|
||||||
<li><em>board</em> The map, i'll explain it at next chapter</li>
|
<li><em>board</em> The map, i'll explain it at next chapter</li>
|
||||||
<li><em>you</em> String, Your bot's character on the grid</li>
|
<li><em>you</em> String, Your bot's character on the grid</li>
|
||||||
<li><em>player-index</em> Int The order of your bot in turns. The first player is 0, second is 2.</li>
|
<li><em>player-index</em> Int The order of your bot in turns. The first player is 0, second is 1.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h4>The map</h4>
|
<h4>The map</h4>
|
||||||
<p> It is represented by a sub-array, on the "board" parameter.<br/>Exemple:</p>
|
<p> It is represented by a sub-array, on the "board" parameter.<br/>Exemple:</p>
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
function get_Post_Params($botsCount){
|
function get_Post_Params($botsCount){
|
||||||
$keysBots=array('bot1','bot2');
|
$keysBots=array('bot1','bot2');
|
||||||
foreach($keysBots as $botKey){
|
foreach($keysBots as $botKey){
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
require_once(__DIR__."/functions.php");
|
require_once(__DIR__."/functions.php");
|
||||||
$bots=get_Bots_Array('connectFou');
|
$bots=get_Bots_Array('connectFou');
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
require_once(__DIR__."/functions.php");
|
require_once(__DIR__."/functions.php");
|
||||||
switch ($_POST['act']){
|
switch ($_POST['act']){
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
function get_Post_Params($botsCount){
|
function get_Post_Params($botsCount){
|
||||||
$keysBots=array('bot1','bot2');
|
$keysBots=array('bot1','bot2');
|
||||||
foreach($keysBots as $botKey){
|
foreach($keysBots as $botKey){
|
||||||
|
@ -15,22 +26,3 @@ function get_Post_Params($botsCount){
|
||||||
}
|
}
|
||||||
return array('bot1' => $_POST['bot1'],'bot2' => $_POST['bot2']);
|
return array('bot1' => $_POST['bot1'],'bot2' => $_POST['bot2']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
function get_Bots_Array(){
|
|
||||||
//Recupérer la liste des Bots
|
|
||||||
$bots=array();
|
|
||||||
$botsList=explode("\n",file_get_contents(__DIR__."/listOfBots.txt"));
|
|
||||||
|
|
||||||
foreach($botsList as $botLigne){
|
|
||||||
if(preg_match("/\ (http|https):\/\//", $botLigne)){
|
|
||||||
list($name,$url)=explode(" ",$botLigne);
|
|
||||||
$bots[]=array("name" => $name, "url" =>$url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $bots;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
require_once(__DIR__."/functions.php");
|
require_once(__DIR__."/functions.php");
|
||||||
|
|
||||||
$bots=get_Bots_Array('tictactoe');
|
$bots=get_Bots_Array('tictactoe');
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
$arenas=array(
|
$arenas=array(
|
||||||
array(
|
array(
|
||||||
'id' => "tictactoe",
|
'id' => "tictactoe",
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
$siteParam=array("BASEURL" => "http://botsarena.tinad.fr/");
|
$siteParam=array("BASEURL" => "http://botsarena.tinad.fr/");
|
||||||
$mysqlParams=array(
|
$mysqlParams=array(
|
||||||
'host' => 'localhost',
|
'host' => 'localhost',
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
if(isset($_POST['xd_check'])){
|
if(isset($_POST['xd_check'])){
|
||||||
//un formulaire a été soumis
|
//un formulaire a été soumis
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
function get_arenas_list(){
|
function get_arenas_list(){
|
||||||
include (__DIR__."/arenas_lists.php");
|
include (__DIR__."/arenas_lists.php");
|
||||||
return $arenas;
|
return $arenas;
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
$hist=get_battles_history($currentArena);
|
$hist=get_battles_history($currentArena);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
#- BEGIN LICENSE BLOCK ---------------------------------------
|
||||||
|
#
|
||||||
|
# This file is part of botsArena.
|
||||||
|
#
|
||||||
|
# Copyright (C) Gnieark et contributeurs
|
||||||
|
# Licensed under the GPL version 3.0 license.
|
||||||
|
# See LICENSE file or
|
||||||
|
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
||||||
|
#
|
||||||
|
# -- END LICENSE BLOCK -----------------------------------------
|
||||||
|
|
||||||
$rs=mysqli_query($lnMysql,"SELECT 1 FROM bots_modifs WHERE validate_secret='".mysqli_real_escape_string($lnMysql,$_GET['params'])."';");
|
$rs=mysqli_query($lnMysql,"SELECT 1 FROM bots_modifs WHERE validate_secret='".mysqli_real_escape_string($lnMysql,$_GET['params'])."';");
|
||||||
if(!$r=mysqli_fetch_row($rs)){
|
if(!$r=mysqli_fetch_row($rs)){
|
||||||
error(404,"Page doesn't exist");
|
error(404,"Page doesn't exist");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user