Merge pull request #20 from gnieark/dev

boats
This commit is contained in:
Gnieark 2015-12-14 23:19:44 +01:00
commit 1bde92373a
6 changed files with 353 additions and 32 deletions

View File

@ -1,2 +1,181 @@
<?php
print_r($_POST);
function place_ship_on_map($x1,$y1,$x2,$y2,$map){
if (($x1 <> $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;
}

View File

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

View File

@ -1,7 +1,43 @@
<h2>Initialisation de la partie</h2>
<p>Pour démarrer la partie, l'arène va envoyer une requette http(s) à votre programme contenant les paramètres POST suivants:</p>
<p>La bataille navale se joue en trois phases:</p>
<ul><li>Placement des bateaux sur les maps</li>
<li>Echange de tirs</li>
<li>Fin de partie</li>
</ul>
<p>A chaque tour de jeu l'arène fait des requetes http(s) contenant des paramètres de type POST, vers vos bots. Ces derniers doivent répondre selon les spécifications ci dessous.</p>
<h2>Paramètres communs à toutes les phases de jeu</h2>
<h3>"game"</h3>
<p>string, sera toujours "Battleship" Peut servir si votre url sert à plusieurs jeux</p>
<h3>"match_id"</h3>
<p>String. répond à l'expression réguilière suivante: ^[0-9]+-(1|2)$</p>
<p>Le premier nombre (digits avant le tiret) identifie le match. L'arène ne vous rappelera pas à chaque tour les cases que vous avez déjà ciblé. A vous de les sauvegarder en attendant le tour suivant. D'autant que votre bot peut être amené à disputer plusieurs matchs simultanément (avec des match_id différents). Le numéro après le tiret vous indique si vous êtes le bot 1 ou le bot 2 dans l'ordre de jeu. Ca vous servira notemment à gérer les cas où votre bot joue les deux joueurs.</p>
<h3>"act"</h3>
<p> Peut prendre trois valeurs:</p>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
<li>"init" On démarre la partie, vous devez placer vos bateaux</li>
<li>"play" Vous prenez subissez un tir, et envoyez aussi un tir</li>
<li>"end" La partie est finie</li>
</ul>
<h2>Initialisation de la partie</h2>
<h3>Infos reçues par votre bot</h3>
<p>Votre bot recevra les paramètres communs à toutes les phases de jeu (avec act => init) et les suivants:</p>
<h4>"opponent"</h4>
<p>String identifiant votre adversaire. Ainsi, vous pouvez pousser le délire jusqu'à faire un algorythme qui s'adapte en fonction de l'adversaire et de l'historique des combats avec ce dernier.</p>
<h4>"width"</h4>
<p>integer, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</p>
<h4>"height"</h4>
<p>integer, compris entre 1 et 100, bornes incluses, Vous indique la hauteur de la map.</p>
<h4>"ship1"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 1 case à placer.</p>
<h4>"ship2"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 2 cases à placer.</p>
<h4>"ship3"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 3 cases à placer.</p>
<h4>...</h4>
<p>...</p>
<h4>"ship6"</h4>
<p>integer, compris entre 0 et 10, bornes incluses, Vous indique le nombre de bateaux de longeur 6 cases à placer.</p>
<h3>Ce que doit retourner votre bot</h3>
Il doit retourner la position des navires.

View File

@ -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;
}
}

View File

@ -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;
}
}};

View File

@ -1,11 +1,9 @@
<article>
<h2>Mentions légales</h2>
<p>Directeur de la publication: Gnieark.</p>
<p>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é.</p>
<p>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 <a href="https://twitter.com/gnieark">@gnieark</a> ou par e-mail gniearkAROBAZEfreePOINTfr plutot quauprès de mon prestataire. Dautant que ce dernier, hormis le fait de connaitre mon identité et de pouvoir débrancher électriquement le serveur hébergeant ce site, na aucun accès sur le contenu de ce dernier.</p>
<p>Ce site personnel est hébergé par mes soins sur un serveur dédié mis à ma disposition par la société :<i>Online SAS - BP 438 - 75366 Paris CEDEX 08</i>. Cette dernière connait mon identité.</p>
<p>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 <a href="https://twitter.com/gnieark">@gnieark</a> ou par e-mail gniearkAROBAZEfreePOINTfr plutot quauprès de mon prestataire. Dautant que ce dernier, hormis le fait de connaitre mon identité et de pouvoir débrancher électriquement le serveur hébergeant, entre autres ce site, na aucun accès sur le contenu de ce dernier.</p>
<p>Que je décide de prendre en compte vos griefs ou non, je ne manquerai pas de vous répondre rapidement.</p>
</article>
<article>
<h2>Copy left</h2>
<p>Ce site a été codé avec amour principalement par Gnieark et est distribué sous licence <a href="http://www.gnu.org/licenses/gpl-3.0.fr.html">GNU GPL V3</a>. Son code source est disponible sur <a href="https://github.com/gnieark/botsArena">github.com/gnieark/botsArena</a>.</p>
<p> Il intègre quelques morceaux de code tiers:</p>
@ -698,4 +696,3 @@ Public License instead of this License. But first, please read
&lt;<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>&gt;.</p>
</article>