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:

+ +

Votre bot doit retourner le nom de votre bot format JSON:

+
+  {"name":"botName"}
+  
+ +

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}
+ +

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:

+ + +

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 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