diff --git a/html/StupidIABattleship.php b/html/StupidIABattleship.php index 25e4a71..7701e49 100644 --- a/html/StupidIABattleship.php +++ b/html/StupidIABattleship.php @@ -1,2 +1,181 @@ $x2) && ($y1 <> $y2)){ + return false; + } + + if($x1 == $x2){ + //horizontal ship + if($y1 <= $y2 ){ + $start=$y1; + $end=$y2; + }else{ + $start=$y2; + $end=$y1; + } + for($i = $start; $i <= $end; $i++){ + $map[$i][$x1]=1; + } + return $map; + } + if($y1 == $y2){ + //vertical ship + if( $x1 <= $x2){ + $start=$x1; + $end=$x2; + }else{ + $start=$x2; + $end=$x1; + } + for( $i = $start; $i <= $end; $i++){ + $map[$y1][$i]=1; + } + return $map; + } + +} +switch($_POST['act']){ + case "init": + $wantedVars=array( + 'match_id' => false, //false-> string ; true -> integer + 'opponent' => false, + 'width' => true, + 'height' => true, + 'ship1' => true, + 'ship2' => true, + 'ship3' => true, + 'ship4' => true, + 'ship5' => true, + 'ship6' => true + ); + foreach($wantedVars as $key => $shouldBeInteger){ + if(($shouldBeInteger) && (!is_numeric($_POST[$key]))){ + echo "var is not numeric"; die; + } + $$key=$_POST[$key]; + } + if(!preg_match('/^[0-9]+-(1|2)$/',$match_id)){ + echo "parametre incorrect"; die; + } + + //construire une grille + for($i=0; $i < $width; $i++){ + for($j=0; $j < $height; $j++){ + $map[$i][$j]=0; + } + } + + $shipsCoords=array(); + + //pour toutes les tailles de bateau + for($shipWidth = 6; $shipWidth > 0; $shipWidth--){ + //nombre de bateau à placer de cette taille + $dynVar='ship'.$shipWidth; + $shipCount=$$dynVar; // #trollface + for( $sh = 0; $sh < $shipCount; $sh++){ + $directions=array(); + while( count($directions) == 0){ + + do{ + $xtest=rand(0,$width -1); + $ytest=rand(0,$height -1); + }while($map[$ytest][$xtest] == 1); + + //Y a t'il la place pour le bateau vers le haut? + if($ytest < $shipWidth){ + $top=false; + }else{ + $top=true; + for($i = $ytest; $i > $ytest - $shipWidth; $i--){ + if($map[$i][$xtest] == 1){ + $top=false; + break; + } + } + } + + //vers le bas + if($ytest + $shipWidth > $height){ + $bottom=false; + }else{ + $bottom=true; + for($y=$ytest; $i < $ytest + $shipWidth; $i++){ + if($map[$i][$xtest] == 1){ + $bottom=false; + break; + } + } + } + + //droite + if($xtest + $shipWidth > $width){ + $right=false; + }else{ + $right=true; + for($i = $xtest; $i < $xtest + $shipWidth; $i++){ + if($map[$ytest][$i] == 1){ + $right= false; + break; + } + } + } + + //gauche + if($xtest < $shipWidth){ + $left=false; + }else{ + $left=true; + for($i = $xtest; $i > $xtest - $shipWidth; $i--){ + if($map[$ytest][$i] == 1){ + $left= false; + break; + } + } + } + + + $directions=array(); + if($top){ + $directions[]='top'; + } + if($bottom){ + $directions[]='bottom'; + } + if($left){ + $directions[]='left'; + } + if($right){ + $directions[]='right'; + } + } + + shuffle($directions); + switch($directions[0]){ + case 'top': + $shipsCoords[]=$xtest.",".$ytest."-".$xtest.",".($ytest - $shipWidth); + $map= place_ship_on_map($xtest,$ytest,$xtest,$ytest - $shipWidth,$map); + break; + case 'bottom': + $shipsCoords[]=$xtest.",".$ytest."-".$xtest.",".($ytest + $shipWidth); + $map= place_ship_on_map($xtest,$ytest,$xtest,$ytest + $shipWidth,$map); + break; + case 'left': + $shipsCoords[]=$xtest.",".$ytest."-".($xtest - $shipWidth).",".$ytest; + $map= place_ship_on_map($xtest,$ytest,$xtest - $shipWidth ,$ytest,$map); + break; + case 'right': + $shipsCoords[]=$xtest.",".$ytest."-".($xtest + $shipWidth).",".$ytest; + $map= place_ship_on_map($xtest,$ytest,$xtest + $shipWidth ,$ytest,$map); + break; + + } + + } + } + + echo json_encode($shipsCoords); + break; + default: + break; + +} diff --git a/src/arenas/Battleship/act.php b/src/arenas/Battleship/act.php index 23e91e7..2416726 100644 --- a/src/arenas/Battleship/act.php +++ b/src/arenas/Battleship/act.php @@ -62,28 +62,91 @@ switch ($_POST['act']){ $_SESSION['matchId']=get_unique_id(); + for($player = 1; $player <= 2; $player++){ - // get_IA_Response($iaUrl,$postParams) - //array à envoyer au bot 1 + if($player==1){ + $opponentName=$bot2['name']; + $currentBot=$bot1; + }else{ + $opponentName=$bot1['name']; + $currentBot=$bot2; + } + + $botParamsToSend=array( + 'game' => 'Battleship', + 'match_id' => $_SESSION['matchId']."-1", + 'act' => 'init', + 'opponent' => $opponentName, + 'width' => $postValues['gridWidth'], + 'height' => $postValues['gridHeight'], + 'ship1' => $postValues['nbShip1'], + 'ship2' => $postValues['nbShip2'], + 'ship3' => $postValues['nbShip3'], + 'ship4' => $postValues['nbShip4'], + 'ship5' => $postValues['nbShip5'], + 'ship6' => $postValues['nbShip6'] + + ); + $anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend); + $boatsPlayer = json_decode( html_entity_decode($anwserPlayer)); + if(!$boatsPlayer){ + echo $currentBot['name']." a fait une réponse non conforme, il perd."; + if($player==1){ + save_battle('Battleship',$bot1['name'],$bot2['name'],2); + }else{ + save_battle('Battleship',$bot1['name'],$bot2['name'],1); + } + die; + } + + //init grid + for($y = 0; $y < $postValues['gridHeight']; $y++){ + for($x = 0; $x < $postValues['gridWidth']; $x++){ + $grid[$player][$y][$x]=0; + } + } + + //vérifier si'il y a le bon nombre de bateaux et les placer + $nbBoatsIwant=array(0,$postValues['nbShip1'],$postValues['nbShip2'],$postValues['nbShip3'], + $postValues['nbShip4'],$postValues['nbShip5'],$postValues['nbShip6']); + foreach($boatsPlayer as $boat){ + list($startCoord,$endCoord) = explode("-",$boat); + list($xStart,$yStart)=explode(",",$startCoord); + list($xEnd,$yEnd)=explode(",",$endCoord); + if($xStart == $xEnd){ + $long=abs($yStart - $yEnd); + }else{ + $long=abs($xStart - $xEnd); + } + $nbBoatsIwant[$long]-=1; + $grid[$player]=place_ship_on_map($xStart,$yStart,$xEnd,$yEnd,$grid[$player]); + if(!$grid[$player]){ + echo $currentBot['name']." n'a pas placé correctement ses bateaux. Certains se chevauchent. Il perd"; + if($player==1){ + save_battle('Battleship',$bot1['name'],$bot2['name'],2); + }else{ + save_battle('Battleship',$bot1['name'],$bot2['name'],1); + } + die; + } + } + foreach($nbBoatsIwant as $nb){ + if($nb <> 0){ + echo $currentBot['name']." n'a pas placé correctement ses bateaux. Il perd"; + if($player==1){ + save_battle('Battleship',$bot1['name'],$bot2['name'],2); + }else{ + save_battle('Battleship',$bot1['name'],$bot2['name'],1); + } + die; + } + } + } - $bot1ParamsToSend=array( - 'game' => 'Battleship', - 'act' => 'init', - 'match_id' => $_SESSION['matchId']."-1", - 'opponent' => $bot2['name'], - 'width' => $postValues['gridWidth'], - 'height' => $postValues['gridHeight'], - 'ship1' => $postValues['nbShip1'], - 'ship2' => $postValues['nbShip2'], - 'ship3' => $postValues['nbShip3'], - 'ship4' => $postValues['nbShip4'], - 'ship5' => $postValues['nbShip5'], - 'ship6' => $postValues['nbShip6'] - - ); + $_SESSION['grids']=$grid; + echo json_encode($grid); die; - $anwserPlayer1 = get_IA_Response($bot1['url'],$bot1ParamsToSend); - echo $anwserPlayer1; die; + die; break; default: diff --git a/src/arenas/Battleship/doc-fr.html b/src/arenas/Battleship/doc-fr.html index cd2f505..5933375 100644 --- a/src/arenas/Battleship/doc-fr.html +++ b/src/arenas/Battleship/doc-fr.html @@ -1,7 +1,43 @@ -

Initialisation de la partie

-

Pour démarrer la partie, l'arène va envoyer une requette http(s) à votre programme contenant les paramètres POST suivants:

+

La bataille navale se joue en trois phases:

+ +

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.

+

Paramètres communs à toutes les phases de jeu

+

"game"

+

string, sera toujours "Battleship" Peut servir si votre url sert à plusieurs jeux

+

"match_id"

+

String. répond à l'expression réguilière suivante: ^[0-9]+-(1|2)$

+

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.

+

"act"

+

Peut prendre trois valeurs:

\ No newline at end of file +
  • "init" On démarre la partie, vous devez placer vos bateaux
  • +
  • "play" Vous prenez subissez un tir, et envoyez aussi un tir
  • +
  • "end" La partie est finie
  • + + +

    Initialisation de la partie

    +

    Infos reçues par votre bot

    +

    Votre bot recevra les paramètres communs à toutes les phases de jeu (avec act => init) et les suivants:

    +

    "opponent"

    +

    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.

    + +

    "width"

    +

    integer, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.

    +

    "height"

    +

    integer, compris entre 1 et 100, bornes incluses, Vous indique la hauteur de la map.

    +

    "ship1"

    +

    integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 1 case à placer.

    +

    "ship2"

    +

    integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 2 cases à placer.

    +

    "ship3"

    +

    integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 3 cases à placer.

    +

    ...

    +

    ...

    +

    "ship6"

    +

    integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 6 cases à placer.

    +

    Ce que doit retourner votre bot

    +Il doit retourner la position des navires. + diff --git a/src/arenas/Battleship/functions.php b/src/arenas/Battleship/functions.php index e570ee1..deca0ce 100644 --- a/src/arenas/Battleship/functions.php +++ b/src/arenas/Battleship/functions.php @@ -52,4 +52,49 @@ function get_IA_Response($iaUrl,$postParams){ $output = curl_exec($ch); curl_close($ch); return htmlentities($output); +} +function place_ship_on_map($x1,$y1,$x2,$y2,$map){ + if ((($x1 <> $x2) && ($y1 <> $y2)) + OR (!isset($map[$y1][$x1])) + OR (!isset($map[$y2][$x2]))){ + return false; + } + + + if($x1 == $x2){ + //horizontal ship + if($y1 <= $y2 ){ + $start=$y1; + $end=$y2; + }else{ + $start=$y2; + $end=$y1; + } + for($i = $start; $i <= $end; $i++){ + if($map[$i][$x1]==0){ + $map[$i][$x1]=1; + }else{ + return false; + } + } + return $map; + } + if($y1 == $y2){ + //vertical ship + if( $x1 <= $x2){ + $start=$x1; + $end=$x2; + }else{ + $start=$x2; + $end=$x1; + } + for( $i = $start; $i <= $end; $i++){ + if( $map[$y1][$i] == 0){ + $map[$y1][$i]=1; + }else{ + return false; + } + } + return $map; + } } \ No newline at end of file diff --git a/src/arenas/Battleship/js.js b/src/arenas/Battleship/js.js index 1d07041..fac22df 100644 --- a/src/arenas/Battleship/js.js +++ b/src/arenas/Battleship/js.js @@ -62,6 +62,7 @@ function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShi xhr.onreadystatechange = function(){if(xhr.readyState == 4){ if(xhr.status == 200) { //debug + //alert(xhr.responseText); document.getElementById('logs').innerHTML = xhr.responseText; } }}; diff --git a/src/legals.html b/src/legals.html index c387290..631391d 100644 --- a/src/legals.html +++ b/src/legals.html @@ -1,11 +1,9 @@ -

    Mentions légales

    Directeur de la publication: Gnieark.

    -

    Ce site personnel est hébergé par mes soins sur un serveur dédié mis à ma disposition par la société :Online SAS - BP 438 - 75366 Paris CEDEX 08 - RCS Paris B 433 115 904 Cette dernière connait mon identité.

    -

    Je vous invite, si vous estimiez que le contenu de ce site, vous causerait quelques préjudices que ce soient, à prendre directement attache avec moi via twitter @gnieark ou par e-mail gniearkAROBAZEfreePOINTfr plutot qu’auprès de mon prestataire. D’autant que ce dernier, hormis le fait de connaitre mon identité et de pouvoir débrancher électriquement le serveur hébergeant ce site, n’a aucun accès sur le contenu de ce dernier.

    +

    Ce site personnel est hébergé par mes soins sur un serveur dédié mis à ma disposition par la société :Online SAS - BP 438 - 75366 Paris CEDEX 08. Cette dernière connait mon identité.

    +

    Je vous invite, si vous estimiez que le contenu de ce site, vous causerait quelques préjudices que ce soient, à prendre directement attache avec moi via twitter @gnieark ou par e-mail gniearkAROBAZEfreePOINTfr plutot qu’auprès de mon prestataire. D’autant que ce dernier, hormis le fait de connaitre mon identité et de pouvoir débrancher électriquement le serveur hébergeant, entre autres ce site, n’a aucun accès sur le contenu de ce dernier.

    Que je décide de prendre en compte vos griefs ou non, je ne manquerai pas de vous répondre rapidement.

    -
    -
    +

    Copy left

    Ce site a été codé avec amour principalement par Gnieark et est distribué sous licence GNU GPL V3. Son code source est disponible sur github.com/gnieark/botsArena.

    Il intègre quelques morceaux de code tiers:

    @@ -698,4 +696,3 @@ Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

    -
    \ No newline at end of file