diff --git a/html/StupidIAconnectFour.php b/html/StupidIAconnectFour.php
index fda1d04..c36cb12 100644
--- a/html/StupidIAconnectFour.php
+++ b/html/StupidIAconnectFour.php
@@ -3,9 +3,9 @@
* stupid IA for battle ship
* choose by random a free column
*/
-
-$grid=json_decode($_POST['grid']);
-
+$in=file_get_contents('php://input');
+$params=json_decode($in, TRUE);
+$grid=$params['grid'];
$colAvailable=array();
for($i=0;$i<7;$i++){
diff --git a/html/testBot.html b/html/testBot.html
new file mode 100644
index 0000000..1931a6d
--- /dev/null
+++ b/html/testBot.html
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+ Test ton bot
+
+
+
+
+
+
+Debug and test your connectFour AI
+
+
+
+
+
\ No newline at end of file
diff --git a/src/arenas/Battleship/testBot.html b/src/arenas/Battleship/testBot.html
new file mode 100644
index 0000000..e69de29
diff --git a/src/arenas/connectFour/act.php b/src/arenas/connectFour/act.php
index d4b5f6c..9fdb909 100644
--- a/src/arenas/connectFour/act.php
+++ b/src/arenas/connectFour/act.php
@@ -84,12 +84,13 @@ switch ($_POST['act']){
'match_id' => $_SESSION['matchId']."-".$_SESSION['currentPlayer'],
'opponent' => $opponentName,
'you' => $you,
- 'grid' => json_encode( $_SESSION['map'])
+ 'grid' => $_SESSION['map']
);
//send query
$anwserPlayer=get_IA_Response($botUrl,$postDatas);
-
+ //for test ***************************
+ //echo $anwserPlayer; die;
//vérifier la validité de la réponse
if((isset($_SESSION['map'][5][$anwserPlayer])) && ($_SESSION['map'][5][$anwserPlayer] == "")){
//reponse conforme
diff --git a/src/arenas/connectFour/functions.php b/src/arenas/connectFour/functions.php
index e2633b4..b6208ce 100644
--- a/src/arenas/connectFour/functions.php
+++ b/src/arenas/connectFour/functions.php
@@ -1,5 +1,9 @@
'','2-1' => '','2-2' => '');
$end=false;
+
+ //send init message to bots
+ $game_id = "".get_unique_id();
+ for($player = 0; $player < 2; $player++){
+ $params[$player]=array(
+ 'game-id' => $game_id,
+ 'action' => 'init',
+ 'game' => 'tictactoe',
+ 'players' => 2,
+ 'board' => '',
+ 'player-index' => $player
+ );
+ }
+ get_IA_Response($bots[$bot1]['url'],$params[0]); //don't care about result
+ get_IA_Response($bots[$bot2]['url'],$params[1]); //don't care about result
+
+ //"game-id":"gameid","action":"init","game":"tictactoe","players":2,"board":null,"you":null,"player-index":0}
+ //[0000] body> {"name":"moul-tictactoe","play":null,"error":null}
+
$playerPlayingNow=1;
+
while($end==false){
switch($playerPlayingNow){
case 1:
$playerURL=$bots[$bot1]['url'];
$playerCHAR='X';
$playerName=$bots[$bot1]['name'];
+ $playerIndex=0;
break;
case 2:
$playerURL=$bots[$bot2]['url'];
$playerCHAR='O';
$playerName=$bots[$bot2]['name'];
+ $playerIndex=1;
break;
default:
error(500,"oups");
die;
}
- $playerResponse=get_IA_Response($playerCHAR,$playerURL,$map);
+
+ $paramsToSend=array(
+ 'game-id' => $game_id,
+ 'action' => 'play-turn',
+ 'game' => 'tictactoe',
+ 'players' => 2,
+ 'board' => $map,
+ 'you' => $playerCHAR,
+ 'player-index' =>$playerIndex
+ );
+
+ $playerResponse=get_IA_Response($playerURL,$paramsToSend)['play'];
+
//tester la validité de la réponse
if((isset($map[$playerResponse])) && ($map[$playerResponse]=="")){
//reponse conforme
diff --git a/src/arenas/tictactoe/doc-fr.html b/src/arenas/tictactoe/doc-fr.html
index 82bc45f..633a6dc 100644
--- a/src/arenas/tictactoe/doc-fr.html
+++ b/src/arenas/tictactoe/doc-fr.html
@@ -1,42 +1,181 @@
Fonctionnement des duels de morpion
Ne vous fiez pas au GIF animé de la page d'accueil du site.
- Il est là pour illustrer le fonctionnement global de l'arène, mais il est faux : le tictactoe n'a besoin d'envoyer que 10 variables, de longueur maîtrisée, aux bots.
- Le choix a donc été fait de les passer en paramètres GET et non POST comme indiqué sur l'animation.
+ Il est là pour illustrer le fonctionnement global de l'arène, mais il est faux.
-Spécifications : variables GET et retour HTML
-
- Votre programme n'a pas à gérer une partie entière de morpion, juste un tour.
-
-
- Le programme arbitre (cette arène) fait une requête construite de la manière suivante :
-
-
- https://votreUrl/?you=O&0-0=&0-1=O&0-2=X&1-0=X&1-1=X&1-2=O&2-0=O&2-1=&2-2=X
+Communications entre l'arène et votre bot
+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.
+Votre bot répond par un array au format JSON.
+Message d'initialisation de votre partie
+ l'arène envoie le message suivant:
+ {"game-id":"1126","action":"init","game":"tictactoe","players":2,"board":"","player-index":0}
+ Si on décompose le tableau pour l'expliquer:
+
+ - game-id string identifiant la partie.
+ - action string identifiant la phase, init tout de suite, sera play-turn dans le châpitre suivant.
+ - game string identifiant le jeu. Ici, ce sera forcément tictactoe. ça peut servir si vous donnez une seule URL pour plusieurs bots.
+ - players Int indiquant le nombre de joueurs dans la partie, toujours 2 au morpion.
+ - board Vide à cette étape, voir chapitre suivant.
+ - player-index int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.
+
+ Votre bot doit retourner le nom de votre bot format JSON:
+
+ {"name":"botName"}
+
+
+ - name le nom de votre bot (actuellment non pris en compte par cette arène).
+
+ L'arène ne vérifie pas actuellement cette réponse, l'étape d'init a été insérée pour assurer la compatibilité avec Bolosseum.
+ Si votre bot repond une page blanche à cette étape (action=init), ça marchera dans le cadre de botsarena.
+ Message vous demandant de jouer (seulement un tour)
+ L'arène vous envoie par exemple le message suivant:
+ {"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"","0-1":"","0-2":"","1-0":"","1-1":"","1-2":"","2-0":"","2-1":"","2-2":""},"you":"X","player-index":0}
+
+ - game-id String identifiant la partie.
+ - action String identifiant la phase, play-turn tout de suite, qui vous indique que vous devez jouer.
+ - game String identifiant le jeu. Ici, ce sera forcément tictactoe. ça peut servir si vous donnez une seulle URL pour plusieurs bots.
+ - players Int indiquant le nombre de joueurs dans la partie, toujours 2 au morpion
+ - board La carte je donne le détail ci dessous
+ - you String, Votre caractère dans la grille
+ - player-index Int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.
+
+ la map
+ Elle est représentée par un sous-tableau. Les index correspondent aux coordonnées x-y de la case. x et y sont compris entre 0 et 2. Les valeurs peuvent être:
+
+ - Vide, personne n'a joué à cette case
+ - "X" ou "O", le joueur ayant ce symbole a déjà joué cette case.
+
+
+Exemple de partie
+
+{"game-id":"1126","action":"init","game":"tictactoe","players":2,"board":"","player-index":0}
-
- Le paramètre GET "you" vous indique quel est votre symbole dans la grille de morpion.
- Classiquement : "X" ou "O"
-
-
- Pour chaque case de la grille de morpion, un paramètre GET correspondant à ses coordonnées ("0-0", "0-1", etc ...) vous est indiqué.
- Il peut être :
-
-
- - Votre symbole (ce qui signifie que vous avez déjà joué là)
- - Le symbole de votre adversaire. Il a déjà joué dans cette case
- - Rien, la case est disponible
-
-
- Votre programme choisit la case sur laquelle il souhaite jouer compte tenu de la grille et retourne ses coordonnées.
-
-
- Le résultat de la requête HTTP(s) ne peut qu'être : "0-0" ou "0-1" ou "0-2" ou "1-0" etc.
-
-
- Un joueur (une IA) qui répond autre chose (au caractère près), ou qui répond avec les coordonnées d'une case déjà jouée, perd la partie.
-
-Publier votre programme pour le tester puis le lâcher dans l'arène
-
- Le formulaire est sur la page d'accueil du site !
-
\ No newline at end of file
+
+{"name":"moul-tictactoe"}
+
+
+{"game-id":"1126","action":"init","game":"tictactoe","players":2,"board":"","player-index":1}
+
+
+{"name":"moul-tictactoe"}
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"","0-1":"","0-2":"","1-0":"","1-1":"","1-2":"","2-0":"","2-1":"","2-2":""},"you":"X","player-index":0}
+
+
+{"play":"0-1"}
+
+
+Player 1 joue en 0-1 la nouvelle grille est
+X
+
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"","0-1":"X","0-2":"","1-0":"","1-1":"","1-2":"","2-0":"","2-1":"","2-2":""},"you":"O","player-index":1}
+
+
+{"play":"1-1"}
+
+
+Player 2 joue en 1-1 la nouvelle grille est
+X
+O
+
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"","0-1":"X","0-2":"","1-0":"","1-1":"O","1-2":"","2-0":"","2-1":"","2-2":""},"you":"X","player-index":0}
+
+
+{"play":"0-0"}
+
+
+Player 1 joue en 0-0 la nouvelle grille est
+X X
+O
+
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"X","0-1":"X","0-2":"","1-0":"","1-1":"O","1-2":"","2-0":"","2-1":"","2-2":""},"you":"O","player-index":1}
+
+
+{"play":"0-2"}
+
+
+Player 2 joue en 0-2 la nouvelle grille est
+X X O
+O
+
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"X","0-1":"X","0-2":"O","1-0":"","1-1":"O","1-2":"","2-0":"","2-1":"","2-2":""},"you":"X","player-index":0}
+
+
+{"play":"2-0"}
+
+
+Player 1 joue en 2-0 la nouvelle grille est
+X X O
+O
+X
+
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"X","0-1":"X","0-2":"O","1-0":"","1-1":"O","1-2":"","2-0":"X","2-1":"","2-2":""},"you":"O","player-index":1}
+
+
+{"play":"1-0"}
+
+
+Player 2 joue en 1-0 la nouvelle grille est
+X X O
+O O
+X
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"X","0-1":"X","0-2":"O","1-0":"O","1-1":"O","1-2":"","2-0":"X","2-1":"","2-2":""},"you":"X","player-index":0}
+
+
+{"play":"1-2"}
+
+
+Player 1 joue en 1-2 la nouvelle grille est
+X X O
+O O X
+X
+
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"X","0-1":"X","0-2":"O","1-0":"O","1-1":"O","1-2":"X","2-0":"X","2-1":"","2-2":""},"you":"O","player-index":1}
+
+
+{"play":"2-1"}
+
+
+Player 2 joue en 2-1 la nouvelle grille est
+X X O
+O O X
+X O
+
+
+{"game-id":"1126","action":"play-turn","game":"tictactoe","players":2,"board":{"0-0":"X","0-1":"X","0-2":"O","1-0":"O","1-1":"O","1-2":"X","2-0":"X","2-1":"O","2-2":""},"you":"X","player-index":0}
+
+
+{"play":"2-2"}
+
+
+Player 1 joue en 2-2 la nouvelle grille est
+X X O
+O O X
+X O X
+
+Match nul
+
+
+Outils pour développer et tester votre bot
+Script à télécharger
+En cours de développement
+Bolosseum
+
+Vous trouverez des outils en ligne de commande pour tester et déboguer votre bot sur le projet github Bolosseum de @moul
+
+Faire entrer votre bot dans cette arène
\ No newline at end of file
diff --git a/src/arenas/tictactoe/functions.php b/src/arenas/tictactoe/functions.php
index db1936f..8b713c9 100644
--- a/src/arenas/tictactoe/functions.php
+++ b/src/arenas/tictactoe/functions.php
@@ -16,6 +16,9 @@ function get_Post_Params($botsCount){
return array('bot1' => $_POST['bot1'],'bot2' => $_POST['bot2']);
}
+
+
+
/*
function get_Bots_Array(){
//Recupérer la liste des Bots
@@ -31,20 +34,20 @@ function get_Bots_Array(){
return $bots;
}
*/
-function get_IA_Response($youChar,$iaBaseUrl,$grille){
- /*transforme la grille en parametres http GET
- * et fait la requete vers $iaBaseUrl
- * Retourne la réponse de l'IA
- */
- $paramsGrille="";
- foreach($grille as $key => $case){
- $paramsGrille.="&".$key."=".$case;
- }
- $url=$iaBaseUrl."?you=".$youChar.$paramsGrille;
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $output = curl_exec($ch);
- curl_close($ch);
- return htmlentities($output);
+function get_IA_Response($iaUrl,$postParams){
+ //send params JSON as body
+
+ $data_string = json_encode($postParams);
+
+ $ch = curl_init($iaUrl);
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+ 'Content-Type: application/json',
+ 'Content-Length: ' . strlen($data_string))
+ );
+ $output= curl_exec($ch);
+ curl_close($ch);
+ return json_decode($output,TRUE);
}
\ No newline at end of file
diff --git a/src/arenas/tictactoe/style.css b/src/arenas/tictactoe/style.css
index fd03b53..178c714 100644
--- a/src/arenas/tictactoe/style.css
+++ b/src/arenas/tictactoe/style.css
@@ -2,4 +2,8 @@ td {min-width: 10px; height: 10px;}
.cellj0{border-bottom: 1px dotted black;}
.cellj2{border-top:1px dotted black;}
.celli0{border-right:1px dotted black;}
-.celli2{border-left:1px dotted black;}
\ No newline at end of file
+.celli2{border-left:1px dotted black;}
+.arrenaMessage{color: green;}
+.arrenaMessage::before{content: "arena message:"; color: grey; font-size: 70%; test-transform:italic;}
+.botResponse{color: red;}
+.botResponse::before{content: "bot response:";color: grey; font-size: 70%; test-transform:italic;}
\ No newline at end of file
diff --git a/src/arenas/tictactoe/testBot.html b/src/arenas/tictactoe/testBot.html
new file mode 100644
index 0000000..e69de29