commit
1bde92373a
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}};
|
||||
|
|
|
@ -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 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.</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 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.</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
|
|||
<<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>>.</p>
|
||||
|
||||
|
||||
</article>
|
Loading…
Reference in New Issue
Block a user