Merge pull request #93 from gnieark/dev

battleShip Json
This commit is contained in:
Gnieark 2016-06-20 22:35:40 +02:00 committed by GitHub
commit 4889e67f61
26 changed files with 781 additions and 777 deletions

View File

@ -108,6 +108,7 @@ pre{
font-family: Consolas, "Times New Roman", Verdana; font-family: Consolas, "Times New Roman", Verdana;
border-left: 4px solid #CCC; border-left: 4px solid #CCC;
padding-left: 8px; padding-left: 8px;
white-space: normal;
} }
.podium{list-style-type:none;padding: 5px 20px 5px 0;} .podium{list-style-type:none;padding: 5px 20px 5px 0;}
.podium li{padding: 5px 20px 5px 0;} .podium li{padding: 5px 20px 5px 0;}

View File

@ -1,5 +1,14 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
$lang = array( $lang = array(
'lang' => 'en', 'lang' => 'en',

View File

@ -1,5 +1,14 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
$lang = array( $lang = array(
'lang' => 'fr', 'lang' => 'fr',

View File

@ -1,5 +1,16 @@
<article> <article>
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
echo '<h2>A props de '.htmlentities($_GET['params']).'</h2><p>Inscrit le '.$theBot['date_inscription'].'</p><p>'.$theBot['description'].'</p> echo '<h2>A props de '.htmlentities($_GET['params']).'</h2><p>Inscrit le '.$theBot['date_inscription'].'</p><p>'.$theBot['description'].'</p>
<p><i><a href="/p/editBot/'.$theBot['id'].'">Si vous êtes le propriétaire de ce bot, vous pouvez le modifier</a></i></p>'; <p><i><a href="/p/editBot/'.$theBot['id'].'">Si vous êtes le propriétaire de ce bot, vous pouvez le modifier</a></i></p>';
?> ?>

View File

@ -1,4 +1,14 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
//Del unvalidated bots //Del unvalidated bots
mysqli_query($lnMysql, "DELETE FROM bots WHERE active='0' AND TIMESTAMPDIFF(DAY, NOW(), date_inscription) > 2"); mysqli_query($lnMysql, "DELETE FROM bots WHERE active='0' AND TIMESTAMPDIFF(DAY, NOW(), date_inscription) > 2");

View File

@ -1,6 +1,17 @@
<article> <article>
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
//<?php echo xd_check_input(0);<input type="hidden" name="act" value="addBot"/> //<?php echo xd_check_input(0);<input type="hidden" name="act" value="addBot"/>
if((isset($_POST['xd_check'])) && ($_POST['act'] == "addBot")){ if((isset($_POST['xd_check'])) && ($_POST['act'] == "addBot")){

View File

@ -20,305 +20,357 @@ switch ($_POST['act']){
session_unset(); session_unset();
$_SESSION['xd_check']=$xd; $_SESSION['xd_check']=$xd;
//verifier parametres POST //verifier parametres POST
$postParamsWanted=array( $postParamsWanted=array(
// key,min,max // key,min,max
array('gridWidth',1,100), array('gridWidth',1,100),
array('gridHeight',1,100), array('gridHeight',1,100),
array('nbShip1',0,10), array('nbShip1',0,10),
array('nbShip2',0,10), array('nbShip2',0,10),
array('nbShip3',0,10), array('nbShip3',0,10),
array('nbShip4',0,10), array('nbShip4',0,10),
array('nbShip5',0,10), array('nbShip5',0,10),
array('nbShip6',0,10) array('nbShip6',0,10)
); );
foreach($postParamsWanted as $p){ foreach($postParamsWanted as $p){
if(!isset($_POST[$p[0]])){ if(!isset($_POST[$p[0]])){
error (500,'missing parameter 1'); error (500,'missing parameter 1');
die; die;
}else{ }else{
$value=$_POST[$p[0]]; $value=$_POST[$p[0]];
} }
if ( if (
(!is_numeric($value)) (!is_numeric($value))
OR ($value < $p[1]) OR ($value < $p[1])
OR ($value > $p[2]) OR ($value > $p[2])
) )
{ {
error(500,'wrong parameters '.$p[0]); error(500,'wrong parameters '.$p[0]);
die; die;
}
$postValues[$p[0]]=$value;
}
//check if bots exists
$bot1Exists = false;
$bot2Exists = false;
foreach($bots as $bot){
if($bot['id'] == $_POST['bot1']){
$bot1 = $bot;
$_SESSION['bot1']=$bot;
$bot1Exists =true;
}
if($bot['id'] == $_POST['bot2']){
$bot2 = $bot;
$_SESSION['bot2']=$bot;
$bot2Exists =true;
}
if ($bot1Exists && $bot2Exists){
break;
}
}
if ((!$bot1Exists) OR (!$bot2Exists)){
error (500,"missing parameter 2");
}
if(!is_it_possible_to_place_ships_on_grid($postValues['gridWidth'],$postValues['gridHeight'],$postValues['nbShip1'],$postValues['nbShip2'],$postValues['nbShip3'],$postValues['nbShip4'],$postValues['nbShip5'],$postValues['nbShip6'])){
error (404,"grid is too little for these ships");
}
//vars checked, lets init the initGame
$_SESSION['matchId']=get_unique_id();
for($player = 1; $player <= 2; $player++){
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.".$anwserPlayer;
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) +1;
}else{
$long=abs($xStart - $xEnd) +1;
}
$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;
}
//remember each cases of each boats
$boatListOfCases=array();
if($xStart == $xEnd){
if($yStart <= $yEnd ){
$start=$yStart;
$end=$yEnd;
}else{
$start=$yEnd;
$end=$yStart;
} }
for($i = $start; $i <= $end; $i++){ $postValues[$p[0]]=$value;
$boatListOfCases[]=$xStart.",".$i;
}
}else{
if($xStart <= $xEnd ){
$start=$xStart;
$end=$xEnd;
}else{
$start=$xEnd;
$end=$xStart;
}
for($i = $start; $i <= $end; $i++){
$boatListOfCases[]=$i.",".$yStart;
}
}
$_SESSION['ships'][$player][]=$boatListOfCases;
}
foreach($nbBoatsIwant as $nb){
if($nb <> 0){
echo $currentBot['name']." n'a pas placé le bon nombre de bateaux. Il perd.";
if($player==1){
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
}else{
save_battle('Battleship',$bot1['name'],$bot2['name'],1);
}
die;
}
}
}
$_SESSION['ship1']=$postValues['nbShip1'];
$_SESSION['ship2']=$postValues['nbShip2'];
$_SESSION['ship3']=$postValues['nbShip3'];
$_SESSION['ship4']=$postValues['nbShip4'];
$_SESSION['ship5']=$postValues['nbShip5'];
$_SESSION['ship6']=$postValues['nbShip6'];
$_SESSION['strikes'][1]=array();
$_SESSION['strikes'][2]=array();
$_SESSION['width']=$postValues['gridWidth'];
$_SESSION['height']=$postValues['gridHeight'];
echo json_encode($grid); die;
die;
break;
case "fight":
if(count($_SESSION['strikes'][1]) == count($_SESSION['strikes'][2])){
//player 1 has to fight
$currentPlayer=1;
$currentBot=$_SESSION['bot1'];
$opponent=2;
$opponentName=$_SESSION['bot2']['name'];
}else{
//it's player2
$currentPlayer=2;
$currentBot=$_SESSION['bot2'];
$opponentName=$_SESSION['bot1']['name'];
$opponent=1;
} }
if(($_POST['fullLogs'] <> 'true') && ($_POST['fullLogs'] <> 'false')){
$botParamsToSend=array( error(500, 'wrong POST parameters');
'game' => 'Battleship', die;
'match_id' => $_SESSION['matchId']."-".$currentPlayer, }
'act' => 'fight', if($_POST['fullLogs'] == 'true'){
'opponent' => $opponentName, $wantFullLogs = true;
'width' => $_SESSION['width'], }else{
'height' => $_SESSION['height'], $wantFullLogs = false;
'ship1' => $_SESSION['ship1'], }
'ship2' => $_SESSION['ship2'],
'ship3' => $_SESSION['ship3'], //check if bots exists
'ship4' => $_SESSION['ship4'], $bot1Exists = false;
'ship5' => $_SESSION['ship5'], $bot2Exists = false;
'ship6' => $_SESSION['ship6'], foreach($bots as $bot){
'your_strikes' => json_encode($_SESSION['strikes'][$currentPlayer]), if($bot['id'] == $_POST['bot1']){
'his_strikes' => json_encode($_SESSION['strikes'][$opponent])
$bot1 = $bot;
); $_SESSION['bot1']=$bot;
$anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend); $bot1Exists =true;
}
if(!preg_match('/^[0-9]+,[0-9]+$/',$anwserPlayer)){ if($bot['id'] == $_POST['bot2']){
echo json_encode(array( $bot2 = $bot;
'target' => '', $_SESSION['bot2']=$bot;
'log' => $currentBot['name']." a fait une réponse non conforme, il perd.".$anwserPlayer $bot2Exists =true;
)); }
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent); if ($bot1Exists && $bot2Exists){
die; break;
} }
list($x,$y)=explode(",",$anwserPlayer); }
if ((!$bot1Exists) OR (!$bot2Exists)){
//check if shot is under map's limits error (500,"missing parameter 2");
if(($x >= $_SESSION['width']) OR ($y >= $_SESSION['height'])){ }
echo json_encode(array(
'target' => '',
'log' => $currentBot['name']." a fait un tir en dehors des limites de la carte. ".$x.",".$y." C'est interdit par les conventions de Geneve. Il perd" if(!is_it_possible_to_place_ships_on_grid($postValues['gridWidth'],$postValues['gridHeight'],
)); $postValues['nbShip1'],$postValues['nbShip2'],$postValues['nbShip3'],
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent); $postValues['nbShip4'],$postValues['nbShip5'],$postValues['nbShip6']))
die; {
} error (404,"grid is too little for these ships");
}
//put previous strikes in a one dimmension array ;
$previousStrikes=array(); //******vars checked, lets init the initGame *******
foreach( $_SESSION['strikes'][$currentPlayer] as $strikes){
$previousStrikes[]=$strikes['target']; $_SESSION['matchId']=get_unique_id();
} $grid['logs'] = array();
//do this strike hit a boat? for($player = 1; $player <= 2; $player++){
$continue=1;
$result=''; if($player==1){
$opponentName=$bot2['name'];
for( $shipIndex = 0; $shipIndex < count( $_SESSION['ships'][$opponent]); $shipIndex ++){ $currentBot=$bot1;
$ennemyBoat = $_SESSION['ships'][$opponent][$shipIndex]; }else{
$opponentName=$bot1['name'];
if(in_array($x.",".$y, $ennemyBoat)){ $currentBot=$bot2;
$result='hit'; }
//sunk?
$sunk=true; $botParamsToSend=array(
foreach($ennemyBoat as $boatCase){ 'game-id' => $_SESSION['matchId'],
if((!in_array($boatCase,$previousStrikes)) && ($boatCase <> $x.",".$y)) { 'game' => 'battleship',
$sunk=false; 'action' => 'init',
break; 'players' => 2,
} 'player-index' => $player -1,
'board' => array(
'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']
)
);
$anwserPlayerJson=get_IA_Response($currentBot['url'],$botParamsToSend);
if($wantFullLogs){
$fullLogs='Arena send to '.$currentBot['name'].'<em>'.htmlentities($anwserPlayerJson['messageSend']).'</em><br/>
HTTP status: <em>'.htmlentities($anwserPlayerJson['httpStatus']).'</em><br/>
Bot anwser: <em>'.htmlentities($anwserPlayerJson['response']).'</em><br/>';
}else{
$fullLogs="";
}
if(!isset($anwserPlayerJson['responseArr']['boats'])){
echo $fullLogs.$currentBot['name']." a fait une réponse non conforme, il perd 1.";
if($player==1){
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
}else{
save_battle('Battleship',$bot1['name'],$bot2['name'],1);
}
die;
}
$boatsPlayer = $anwserPlayerJson['responseArr']['boats'];
//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) +1;
}else{
$long=abs($xStart - $xEnd) +1;
}
$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;
}
//remember each cases of each boats
$boatListOfCases=array();
if($xStart == $xEnd){
if($yStart <= $yEnd ){
$start=$yStart;
$end=$yEnd;
}else{
$start=$yEnd;
$end=$yStart;
}
for($i = $start; $i <= $end; $i++){
$boatListOfCases[]=$xStart.",".$i;
}
}else{
if($xStart <= $xEnd ){
$start=$xStart;
$end=$xEnd;
}else{
$start=$xEnd;
$end=$xStart;
}
for($i = $start; $i <= $end; $i++){
$boatListOfCases[]=$i.",".$yStart;
}
}
$_SESSION['ships'][$player][]=$boatListOfCases;
}
foreach($nbBoatsIwant as $nb){
if($nb <> 0){
echo $fullLogs.$currentBot['name']." n'a pas placé le bon nombre de bateaux. Il perd.";
if($player==1){
save_battle('Battleship',$bot1['name'],$bot2['name'],2);
}else{
save_battle('Battleship',$bot1['name'],$bot2['name'],1);
}
die;
}
}
$grid['logs'][] = $fullLogs.$currentBot['name']." put his ships on the map.";
}
$_SESSION['ship1']=$postValues['nbShip1'];
$_SESSION['ship2']=$postValues['nbShip2'];
$_SESSION['ship3']=$postValues['nbShip3'];
$_SESSION['ship4']=$postValues['nbShip4'];
$_SESSION['ship5']=$postValues['nbShip5'];
$_SESSION['ship6']=$postValues['nbShip6'];
$_SESSION['strikes'][1]=array();
$_SESSION['strikes'][2]=array();
$_SESSION['width']=$postValues['gridWidth'];
$_SESSION['height']=$postValues['gridHeight'];
echo json_encode($grid); die;
die;
break;
case "fight":
if(($_POST['fullLogs'] <> 'true') && ($_POST['fullLogs'] <> 'false')){
error(500, 'wrong POST parameters');
die;
}
if($_POST['fullLogs'] == 'true'){
$wantFullLogs = true;
}else{
$wantFullLogs = false;
} }
if($sunk){
$result="hit and sunk"; if(!isset($fullLogs)){
//remove the ship $fullLogs = "";
unset($_SESSION['ships'][$opponent][$shipIndex]);
$_SESSION['ships'][$opponent] = array_values($_SESSION['ships'][$opponent]);
//var_dump($_SESSION['ships'][$opponent]);
//win the game?
if(count($_SESSION['ships'][$opponent]) == 0){
$result="hit sunk and win";
$continue=0;
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$currentPlayer);
}
} }
break; if(count($_SESSION['strikes'][1]) == count($_SESSION['strikes'][2])){
} //player 1 has to fight
} $currentPlayer=1;
$currentBot=$_SESSION['bot1'];
//remember this shot $opponent=2;
$_SESSION['strikes'][$currentPlayer][]=array( $opponentName=$_SESSION['bot2']['name'];
'target' => $x.",".$y, }else{
'result' => $result //it's player2
); $currentPlayer=2;
$currentBot=$_SESSION['bot2'];
//send message for the arena's ajax web page $opponentName=$_SESSION['bot1']['name'];
echo json_encode(array( $opponent=1;
'opponent'=> $opponent, }
'target' => $x.",".$y,
'log' => $currentBot['name']." tire en ".$x.",".$y." ".$result, $botParamsToSend=array(
'continue' => $continue 'game' => 'Battleship',
)); 'game-id' => $_SESSION['matchId'],
'action' => 'play-turn',
die; 'player-index' => $currentPlayer - 1,
break; 'board' => array(
default: 'opponent' => $opponentName,
break; 'width' => $_SESSION['width'],
'height' => $_SESSION['height'],
'ship1' => $_SESSION['ship1'],
'ship2' => $_SESSION['ship2'],
'ship3' => $_SESSION['ship3'],
'ship4' => $_SESSION['ship4'],
'ship5' => $_SESSION['ship5'],
'ship6' => $_SESSION['ship6'],
'your_strikes' => $_SESSION['strikes'][$currentPlayer],
'his_strikes' => $_SESSION['strikes'][$opponent]
)
);
$anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend);
$anwserPlayerJson=$anwserPlayer['responseArr'];
if($wantFullLogs){
$fullLogs.='Arena send to '.$currentBot['name'].'<em>'.htmlentities($anwserPlayer['messageSend']).'</em><br />
HTTP status: <em>'.htmlentities($anwserPlayer['httpStatus']).'</em><br />
Bot anwser: <em>'.htmlentities($anwserPlayer['response']).'</em><br />';
}else{
$fullLogs.="";
}
if ((!isset($anwserPlayerJson['play']))
OR (!preg_match('/^[0-9]+,[0-9]+$/',$anwserPlayerJson['play']))){
echo json_encode(array(
'target' => '',
'logs' => $fullLogs.$currentBot['name']." a fait une réponse non conforme, il perd."));
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
die;
}
list($x,$y)=explode(",",$anwserPlayerJson['play']);
//check if shot is under map's limits
if(($x >= $_SESSION['width']) OR ($y >= $_SESSION['height'])){
echo json_encode(array(
'target' => '',
'logs' => $fullLogs.$currentBot['name']." a fait un tir en dehors des limites de la carte. ".$x.",".$y." C'est interdit par les conventions de Geneve. Il perd"
));
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
die;
}
//put previous strikes in a one dimmension array ;
$previousStrikes=array();
foreach( $_SESSION['strikes'][$currentPlayer] as $strikes){
$previousStrikes[]=$strikes['target'];
}
//do this strike hit a boat?
$continue=1;
$result='';
for( $shipIndex = 0; $shipIndex < count( $_SESSION['ships'][$opponent]); $shipIndex ++){
$ennemyBoat = $_SESSION['ships'][$opponent][$shipIndex];
if(in_array($x.",".$y, $ennemyBoat)){
$result='hit';
//sunk?
$sunk=true;
foreach($ennemyBoat as $boatCase){
if((!in_array($boatCase,$previousStrikes)) && ($boatCase <> $x.",".$y)) {
$sunk=false;
break;
}
}
if($sunk){
$result="hit and sunk";
//remove the ship
unset($_SESSION['ships'][$opponent][$shipIndex]);
$_SESSION['ships'][$opponent] = array_values($_SESSION['ships'][$opponent]);
//var_dump($_SESSION['ships'][$opponent]);
//win the game?
if(count($_SESSION['ships'][$opponent]) == 0){
$result="hit sunk and win";
$continue=0;
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$currentPlayer);
}
}
break;
}
}
//remember this shot
$_SESSION['strikes'][$currentPlayer][]=array(
'target' => $x.",".$y,
'result' => $result
);
//send message for the arena's ajax web page
echo json_encode(array(
'opponent'=> $opponent,
'target' => $x.",".$y,
'logs' => $fullLogs.$currentBot['name']." tire en ".$x.",".$y." ".$result,
'continue' => $continue
));
die;
break;
default:
break;
} }

View File

@ -1,173 +1,62 @@
<p> <h1>Fonctionnement de la bataille navale</h1>
Battleship is played in two stages : <p>Elle se joue en deux phases</p>
</p>
<ul> <ul>
<li>Boats placement on maps</li> <li>Placement des bateaux sur les maps</li>
<li>Shootout</li> <li>Echange de tirs</li>
</ul> </ul>
<p> <h2>Communications entre l'arène et votre bot</h2>
At each turn, the arena made HTTP(s) queries containing POST parameters, to your bots.<br/> <p>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.</p>
They must respond to the specifications below. <p>Votre bot répond par un array au format JSON.</p>
</p> <h3>Message d'initialisation de votre partie</h3>
<h2>Descriptif des paramètres envoyés par l'arène</h2> l'arène envoie le message suivant:
<table class="tabledoc"> <pre>{"game-id":1609,"game":"battleship","action":"init","players":2,"player-index":0,"board":{"opponent":"stupidIA","width":"10","height":"10","ship1":"0","ship2":"1","ship3":"2","ship4":"1","ship5":"1","ship6":"0"}}</pre>
<tr> <p>Si on décompose le tableau pour l'expliquer:</p>
<th>Parameter</th> <ul>
<th>Description</th> <li><em>game-id</em> string identifiant la partie.</li>
</tr> <li><em>action</em> string identifiant la phase, <em>init</em> tout de suite, sera <em>play-turn</em> dans le châpitre suivant.</li>
<tr> <li><em>game</em> string identifiant le jeu. Ici, ce sera forcément battleship. ça peut servir si vous donnez une seule URL pour plusieurs bots.</li>
<td>game</td> <li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
<td> <li><em>player-index</em> int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.</li>
String, will always "Battleship".<br/> <li><em>board</em> un tableau vous donnant les parametres:
Can be used if your url is used for several games. <ul>
</td> <li><em>opponent</em> Chaîne de caractères identifiant votre adversaire.
</tr> 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. </li>
<tr> <li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
<td>match_id</td> <li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
<td> <li><em>ship1</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</li>
String. Match the following regular expression : ^[0-9]+-(1|2)$<br/> <li><em>ship2</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</li>
The first number (digits before the hyphen) identified the game.<br/> <li>...</li>
The number after the hyphen indicates whether you are the first or second bot in the order to play.<br/> <li><em>ship6</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</li>
It will serve you if your AI makes statistics on games. </ul>
</td> </li>
</tr> </ul>
<tr> <p>Votre bot doit retourner le nom de votre bot et le placement de vos bateaux au format JSON:</p>
<td>act</td> <pre>
<td> {"name":"gnieark","boats":["4,2-4,6","3,3-3,0","2,3-2,1","7,9-5,9","6,8-6,7"]}
Can take two values :<br/> </pre>
<ul> <ul>
<li>"init" : We start the game, you must place your ships</li> <li><em>name</em> Le nom de votre bot (actuellment non pris en compte par cette arène).</li>
<li>"fight" : You send a shot</li> <li><em>boats</em> Tableau indiquant le placement de vos bateaux</li>
</ul> </ul>
</td>
</tr>
<tr>
<td>opponent</td>
<td>
String identifying your opponent.<br/>
So you can grow up delirium by developping an algorithm that adapts depending on the opponent and the history of fighting with it.
</td>
</tr>
<tr>
<td>width</td>
<td>Integer, between 1 and 100, inclusive, indicates the width of the map.</td>
</tr>
<tr>
<td>height</td>
<td>Integer, between 1 and 100, inclusive, indicates the height of the map.</td>
</tr>
<tr>
<td>ship1</td>
<td>Integer, between 0 and 10, inclusive, indicates the number of boats with length of 1 box to set.</td>
</tr>
<tr>
<td>ship2</td>
<td>Integer, between 0 and 10, inclusive, indicates the number of boats with length of 2 box to set.</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>ship6</td>
<td>Integer, between 0 and 10, inclusive, indicates the number of boats with length of 6 box to set.</td>
</tr>
<tr>
<td>your_strikes</td>
<td>
<p>
String, representing an array in JSON format.<br/>
This parameter is only sent when the game is in shooting phase (act=fight).<br/>
It tells you the shots you've already made and their results.<br/>
In the first round of play, it is an empty array.
</p>
<p>
<i>[ ]</i>
</p>
<p>
In the second round of game, it contains the previous shot and the result :
</p>
<p>
<i>[{"target":"2,0","result":""}]</i>
</p>
<p>
In the third round of play, the two previous shots :
</p>
<p>
<i>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</i>
</p>
<p>
Each shot is a sub array for which :
</p>
<ul>
<li>The index target indicates the coordinates of the target shooting x,y</li>
<li>
result may be :
<ul>
<li>Empty "" means that the shot did not hit anything</li>
<li>"hit" An enemy ship has been hit</li>
<li>"hit and sunk" An enemy ship was hit and sunk</li>
</ul>
</li>
</ul>
</td>
</tr>
<tr>
<td>his_strikes</td>
<td>Same except that this is the shot of the opponent.</td>
</tr>
</table>
<h2>What must return your bot</h2>
<h3>During initialization of the game</h3>
<p>
Lors de l'initialisation d'une partie StupidIA VS StupidsIA, l'arène a envoyé au bot les parametres POST suivants :
During initialization of part StupidIA VS StupidIA, the arena send to your bot the following parameters in POST :
</p>
<pre>
game=Battleship&amp;match_id=828-1&amp;act=init&amp;opponent=stupidIA&amp;width=10&amp;height=10&amp;ship1=0&amp;ship2=1&amp;ship3=2&amp;ship4=1&amp;ship5=1&amp;ship6=0
</pre>
<p>
Or, more readable :
</p>
<pre>
[game] => Battleship
[match_id] => 828-1
[act] => init
[opponent] => stupidIA
[width] => 10
[height] => 10
[ship1] => 0
[ship2] => 1
[ship3] => 2
[ship4] => 1
[ship5] => 1
[ship6] => 0
</pre>
<p>
The HTTP page that must generate your bot contains the position of ships.
</p>
<p>
You return a character string that is a JSON array with as many records as ships.<br/>
Each ship is defined by the coordinates of its ends.
</p>
<ul> <ul>
<li>The grid starts at the point 0,0.</li> <h3>boats</h3>
<li>Integers, ordinate and abscissa, defining a point, are separated by a comma &quot;,&quot;.</li> <li>La grille commence au point 0,0.</li>
<li>The two points defining the ends a ship shall be separated by a hyphen &quot;-&quot;.</li> <li>Les entiers, ordonnée et abscisses, définissant un point, sont séparés d'une virgule &quot;,&quot;.</li>
<li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret &quot;-&quot;.</li>
</ul> </ul>
<h4>Placement example of 5 boats with respective sizes 5, 4, 3, 3, 2 boxes :</h4> <h4>Exemple de placement de 5 bateaux tailles respectives 5, 4, 3, 3, 2 cases :</h4>
<pre> <pre>
["3,3-3,7","2,1-2,4","0,1-0,3","7,3-7,1","8,8-7,8"] ["3,3-3,7","2,1-2,4","0,1-0,3","7,3-7,1","8,8-7,8"]
</pre> </pre>
<p> <p>
Of course if your boat overlap, or if their number and length does not match the demand of the arena, you lose the game. Bien évidemment si vos bateaux se chevauchent, ou si leur nombre et leur longueur ne correspond pas à la demande de l'arène, vous perdez la partie.
</p> </p>
<p> <p>
The order of the boats does not matter.<br/> L'ordre des bateaux n'a pas d'importance.<br/>
Similarly, for a boat, the order of its points does not matter either. De la même manière, pour un bateau, l'ordre de ses points n'importe pas non plus.
</p> </p>
<p> <p>
Seen on the grid, the example above would be : Vu sur la grille, l'exemple précédent donnerait :
</p> </p>
<table class="battleshipGrid nofloat" id="tbl1"> <table class="battleshipGrid nofloat" id="tbl1">
<tr> <tr>
@ -314,65 +203,70 @@
<td class="empty" id="bot1-9-9"></td> <td class="empty" id="bot1-9-9"></td>
</tr> </tr>
</table> </table>
<h3>During the fight</h3>
<p> <h3>Message vous demandant de jouer (seulement un tour)</h3>
Examples of parameters sent by the arena. <p>L'arène vous envoie par exemple le message suivant:</p>
</p> <pre>{"game":"Battleship","game-id":1615,"action":"play-turn","player-index":1,"board":{"opponent":"stupidIA","width":"10","height":"10","ship1":"0","ship2":"1","ship3":"2","ship4":"1","ship5":"1","ship6":"0","your_strikes":[{"target":"4,3","result":""},{"target":"9,8","result":""}],"his_strikes":[{"target":"2,2","result":""},{"target":"0,6","result":""},{"target":"7,0","result":""}]}}</pre>
<h4>First round (your_strikes and his_strikes are empty)</h4> <ul>
<pre> <li><em>game-id</em> String identifiant la partie.</li>
[game] => Battleship <li><em>action</em> String identifiant la phase, <em>play-turn</em> tout de suite, qui vous indique que vous devez jouer.</li>
[match_id] => 834-1 <li><em>game</em> String identifiant le jeu. Ici, ce sera forcément battleship. ça peut servir si vous donnez une seulle URL pour plusieurs bots.</li>
[act] => fight <li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
[opponent] => stupidIA <li><em>board</em> La carte je donne le détail ci dessous</li>
[width] => 10 <li><em>you</em> String, Votre caractère dans la grille</li>
[height] => 10 <li><em>player-index</em> Int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.</li>
[ship1] => 0 </ul>
[ship2] => 1 <h4>la map</h4>
[ship3] => 2 <p>Elle est représentée par les éléments d'écrits à l'étape précédente et par deux sous tableaux your_strikes et his strikes</p>
[ship4] => 1 <ul>
[ship5] => 1 <li><em>opponent</em> Chaîne de caractères identifiant votre adversaire.
[ship6] => 0 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. </li>
[your_strikes] => [] <li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
[his_strikes] => [] <li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
</pre> <li><em>ship1</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</li>
<h4>Second round</h4> <li><em>ship2</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</li>
<pre> <li>...</li>
[game] => Battleship <li><em>ship6</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</li>
[match_id] => 834-1 <li><em>your_strikes</em> tableau vous indiquant vos tirs précédents et eur résultat</li>
[act] => fight <li><em>his_strikes</em> Idem, mais pour l'adversaire. Si ce dernier tire selon un modèle prédisible, vous saurez comment comment placer vos bateaux lors de la prochaine partie</li>
[opponent] => stupidIA </ul>
[width] => 10 <h4> your_strikes et his_strikes</h4>
[height] => 10
[ship1] => 0 <p>Chaîne de caractères représentant un array au format JSON.<br/>
[ship2] => 1 Ce parametre n'est envoyé que lors de la phase de tirs du jeu (act=fight).<br/>
[ship3] => 2 Il vous indique les tirs que vous avez déjà effectués et leur résultats.<br/>
[ship4] => 1 Lors du premier tour de jeu, il représente un array vide:
[ship5] => 1 </p>
[ship6] => 0 <pre>[ ]</pre>
[your_strikes] => [{"target":"4,6","result":""}] <p>
[his_strikes] => [{"target":"7,8","result":""}] Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :
</pre> </p>
<h4>Third round</h4> <pre>[{"target":"2,0","result":""}]</pre>
<pre> <p>
[game] => Battleship Lors du troisième tour de jeu, les deux tirs précédents :
[match_id] => 834-1 </p>
[act] => fight <pre>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</pre>
[opponent] => stupidIA <p>
[width] => 10 Chaque tir est un sous array pour lesquels:
[height] => 10 </p>
[ship1] => 0 <ul>
[ship2] => 1 <li>L'index target indique les coordonnées du tir x,y</li>
[ship3] => 2 <li>
[ship4] => 1 result peut être :
[ship5] => 1 <ul>
[ship6] => 0 <li>Vide "" signifie que le tir n'a rien touché</li>
[your_strikes] => [{"target":"4,6","result":""},{"target":"3,9","result":"hit"}] <li>"hit" Un navire ennemi a été touché</li>
[his_strikes] => [{"target":"7,8","result":""},{"target":"7,8","result":""}] <li>"hit and sunk" Un navire ennemi a été touché et coulé</li>
</pre> </ul>
<h4>You simply need to return the address of the box where you want to shoot in the form of x,y</h4> </li>
<pre> </ul>
6,9
</pre> <h3>Réponse de votre bot</h3>
<p> <p>Il doit répondre par les coordonnées de la case dans laquelle il souhaite effectuer un tir.</p>
To shoot on the coordinates x=6 y=9 <pre>{"play":"1,8"}</pre>
</p> <p>x,y</p>
<h2>Outils pour développer et tester votre bot</h2>
<h3>Script Botsarena en cours de développement</h3>
<h2>Faire entrer votre bot dans cette arène</h2>
<p>Le formulaire d'inscription de votre bot est sur la page d'accueil du site.</p>

View File

@ -1,155 +1,45 @@
<p> <h1>Fonctionnement de la bataille navale</h1>
La bataille navale se joue en deux phases : <p>Elle se joue en deux phases</p>
</p>
<ul> <ul>
<li>Placement des bateaux sur les maps</li> <li>Placement des bateaux sur les maps</li>
<li>Echange de tirs</li> <li>Echange de tirs</li>
</ul> </ul>
<p> <h2>Communications entre l'arène et votre bot</h2>
A chaque tour de jeu l'arène fait des requetes http(s) contenant des paramètres de type POST, vers vos bots.<br/> <p>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.</p>
Ces derniers doivent répondre selon les spécifications ci dessous. <p>Votre bot répond par un array au format JSON.</p>
</p> <h3>Message d'initialisation de votre partie</h3>
<h2>Descriptif des paramètres envoyés par l'arène</h2> l'arène envoie le message suivant:
<table class="tabledoc"> <pre>{"game-id":1609,"game":"battleship","action":"init","players":2,"player-index":0,"board":{"opponent":"stupidIA","width":"10","height":"10","ship1":"0","ship2":"1","ship3":"2","ship4":"1","ship5":"1","ship6":"0"}}</pre>
<tr> <p>Si on décompose le tableau pour l'expliquer:</p>
<th>Paramètre</th> <ul>
<th>Description</th> <li><em>game-id</em> string identifiant la partie.</li>
</tr> <li><em>action</em> string identifiant la phase, <em>init</em> tout de suite, sera <em>play-turn</em> dans le châpitre suivant.</li>
<tr> <li><em>game</em> string identifiant le jeu. Ici, ce sera forcément battleship. ça peut servir si vous donnez une seule URL pour plusieurs bots.</li>
<td>game</td> <li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
<td> <li><em>player-index</em> int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.</li>
Chaîne de caractères, sera toujours "Battleship".<br/> <li><em>board</em> un tableau vous donnant les parametres:
Peut servir si votre url sert à plusieurs jeux. <ul>
</td> <li><em>opponent</em> Chaîne de caractères identifiant votre adversaire.
</tr> 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. </li>
<tr> <li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
<td>match_id</td> <li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
<td> <li><em>ship1</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</li>
Chaîne de caractères. Répond à l'expression régulière suivante: ^[0-9]+-(1|2)$<br/> <li><em>ship2</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</li>
Le premier nombre (digits avant le tiret) identifie le match.<br/> <li>...</li>
Le numéro après le tiret vous indique si vous êtes le bot 1 ou le bot 2 dans l'ordre de jeu.<br/> <li><em>ship6</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</li>
Ça vous servira si votre IA fait des statistiques sur les matchs. </ul>
</td> </li>
</tr> </ul>
<tr> <p>Votre bot doit retourner le nom de votre bot et le placement de vos bateaux au format JSON:</p>
<td>act</td> <pre>
<td> {"name":"gnieark","boats":["4,2-4,6","3,3-3,0","2,3-2,1","7,9-5,9","6,8-6,7"]}
Peut prendre deux valeurs :<br/> </pre>
<ul> <ul>
<li>"init" : On démarre la partie, vous devez placer vos bateaux</li> <li><em>name</em> Le nom de votre bot (actuellment non pris en compte par cette arène).</li>
<li>"fight" : Vous envoyez un tir</li> <li><em>boats</em> Tableau indiquant le placement de vos bateaux</li>
</ul> </ul>
</td>
</tr>
<tr>
<td>opponent</td>
<td>
Chaîne de caractères identifiant votre adversaire.<br/>
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.
</td>
</tr>
<tr>
<td>width</td>
<td>Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</td>
</tr>
<tr>
<td>height</td>
<td>Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</td>
</tr>
<tr>
<td>ship1</td>
<td>Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</td>
</tr>
<tr>
<td>ship2</td>
<td>Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>ship6</td>
<td>Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</td>
</tr>
<tr>
<td>your_strikes</td>
<td>
<p>
Chaîne de caractères représentant un array au format JSON.<br/>
Ce parametre n'est envoyé que lors de la phase de tirs du jeu (act=fight).<br/>
Il vous indique les tirs que vous avez déjà effectués et leur résultats.<br/>
Lors du premier tour de jeu, il représente un array vide.
</p>
<p>
<i>[ ]</i>
</p>
<p>
Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :
</p>
<p>
<i>[{"target":"2,0","result":""}]</i>
</p>
<p>
Lors du troisième tour de jeu, les deux tirs précédents :
</p>
<p>
<i>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</i>
</p>
<p>
Chaque tir est un sous array pour lesquels:
</p>
<ul>
<li>L'index target indique les coordonnées du tir x,y</li>
<li>
result peut être :
<ul>
<li>Vide "" signifie que le tir n'a rien touché</li>
<li>"hit" Un navire ennemi a été touché</li>
<li>"hit and sunk" Un navire ennemi a été touché et coulé</li>
</ul>
</li>
</ul>
</td>
</tr>
<tr>
<td>his_strikes</td>
<td>Idem sauf qu'il s'agit du tir de l'adversaire.</td>
</tr>
</table>
<h2>Ce que doit retourner votre bot</h2>
<h3>Lors de l'initialisation de la partie</h3>
<p>
Lors de l'initialisation d'une partie StupidIA VS StupidsIA, l'arène a envoyé au bot les parametres POST suivants :
</p>
<pre>
game=Battleship&amp;match_id=828-1&amp;act=init&amp;opponent=stupidIA&amp;width=10&amp;height=10&amp;ship1=0&amp;ship2=1&amp;ship3=2&amp;ship4=1&amp;ship5=1&amp;ship6=0
</pre>
<p>
Soit, sous forme plus lisible :
</p>
<pre>
[game] => Battleship
[match_id] => 828-1
[act] => init
[opponent] => stupidIA
[width] => 10
[height] => 10
[ship1] => 0
[ship2] => 1
[ship3] => 2
[ship4] => 1
[ship5] => 1
[ship6] => 0
</pre>
<p>
La page http que doit générer votre bot contient la position des navires.
</p>
<p>
Vous retournez une chaine de caractères qui est un tableau JSON ayant autant d'enregistrements que de navires.<br/>
Chaque navire est défini par les coordonnées de ses extrémités.
</p>
<ul> <ul>
<h3>boats</h3>
<li>La grille commence au point 0,0.</li> <li>La grille commence au point 0,0.</li>
<li>Les entiers, ordonnée et abscisses, définissant un point, sont séparés d'une virgule &quot;,&quot;.</li> <li>Les entiers, ordonnée et abscisses, définissant un point, sont séparés d'une virgule &quot;,&quot;.</li>
<li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret &quot;-&quot;.</li> <li>Les deux points définissant les extrémités d'un navire sont séparés par un tiret &quot;-&quot;.</li>
@ -313,65 +203,70 @@
<td class="empty" id="bot1-9-9"></td> <td class="empty" id="bot1-9-9"></td>
</tr> </tr>
</table> </table>
<h3>Lors du combat</h3>
<p> <h3>Message vous demandant de jouer (seulement un tour)</h3>
Voici quelques exemples des parametres envoyés par l'arène. <p>L'arène vous envoie par exemple le message suivant:</p>
</p> <pre>{"game":"Battleship","game-id":1615,"action":"play-turn","player-index":1,"board":{"opponent":"stupidIA","width":"10","height":"10","ship1":"0","ship2":"1","ship3":"2","ship4":"1","ship5":"1","ship6":"0","your_strikes":[{"target":"4,3","result":""},{"target":"9,8","result":""}],"his_strikes":[{"target":"2,2","result":""},{"target":"0,6","result":""},{"target":"7,0","result":""}]}}</pre>
<h4>Premier tour de jeu (your_strikes et his_strikes sont vides)</h4> <ul>
<pre> <li><em>game-id</em> String identifiant la partie.</li>
[game] => Battleship <li><em>action</em> String identifiant la phase, <em>play-turn</em> tout de suite, qui vous indique que vous devez jouer.</li>
[match_id] => 834-1 <li><em>game</em> String identifiant le jeu. Ici, ce sera forcément battleship. ça peut servir si vous donnez une seulle URL pour plusieurs bots.</li>
[act] => fight <li><em>players</em> Int indiquant le nombre de joueurs dans la partie, toujours 2 à la bataille navale.</li>
[opponent] => stupidIA <li><em>board</em> La carte je donne le détail ci dessous</li>
[width] => 10 <li><em>you</em> String, Votre caractère dans la grille</li>
[height] => 10 <li><em>player-index</em> Int, L'ordre de votre bot dans les tours de jeu. Le premier joueur a la valeur 0, le deuxième 1.</li>
[ship1] => 0 </ul>
[ship2] => 1 <h4>la map</h4>
[ship3] => 2 <p>Elle est représentée par les éléments d'écrits à l'étape précédente et par deux sous tableaux your_strikes et his strikes</p>
[ship4] => 1 <ul>
[ship5] => 1 <li><em>opponent</em> Chaîne de caractères identifiant votre adversaire.
[ship6] => 0 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. </li>
[your_strikes] => [] <li><em>width</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la largeur de la map.</li>
[his_strikes] => [] <li><em>height</em> Entier, compris entre 1 et 100, bornes incluses, vous indique la hauteur de la map.</li>
</pre> <li><em>ship1</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 1 case à placer.</li>
<h4>Deuxième tour de jeu</h4> <li><em>ship2</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 2 cases à placer.</li>
<pre> <li>...</li>
[game] => Battleship <li><em>ship6</em> Entier, compris entre 0 et 10, bornes incluses, vous indique le nombre de bateaux de longeur 6 cases à placer.</li>
[match_id] => 834-1 <li><em>your_strikes</em> tableau vous indiquant vos tirs précédents et eur résultat</li>
[act] => fight <li><em>his_strikes</em> Idem, mais pour l'adversaire. Si ce dernier tire selon un modèle prédisible, vous saurez comment comment placer vos bateaux lors de la prochaine partie</li>
[opponent] => stupidIA </ul>
[width] => 10 <h4> your_strikes et his_strikes</h4>
[height] => 10
[ship1] => 0 <p>Chaîne de caractères représentant un array au format JSON.<br/>
[ship2] => 1 Ce parametre n'est envoyé que lors de la phase de tirs du jeu (act=fight).<br/>
[ship3] => 2 Il vous indique les tirs que vous avez déjà effectués et leur résultats.<br/>
[ship4] => 1 Lors du premier tour de jeu, il représente un array vide:
[ship5] => 1 </p>
[ship6] => 0 <pre>[ ]</pre>
[your_strikes] => [{"target":"4,6","result":""}] <p>
[his_strikes] => [{"target":"7,8","result":""}] Lors du deuxième tour de jeu, il contient le tir précédent et son résultat :
</pre> </p>
<h4>Troisième tour de jeu</h4> <pre>[{"target":"2,0","result":""}]</pre>
<pre> <p>
[game] => Battleship Lors du troisième tour de jeu, les deux tirs précédents :
[match_id] => 834-1 </p>
[act] => fight <pre>[{"target":"2,0","result":"hit"},{"target":"5,1","result":"hit"}]</pre>
[opponent] => stupidIA <p>
[width] => 10 Chaque tir est un sous array pour lesquels:
[height] => 10 </p>
[ship1] => 0 <ul>
[ship2] => 1 <li>L'index target indique les coordonnées du tir x,y</li>
[ship3] => 2 <li>
[ship4] => 1 result peut être :
[ship5] => 1 <ul>
[ship6] => 0 <li>Vide "" signifie que le tir n'a rien touché</li>
[your_strikes] => [{"target":"4,6","result":""},{"target":"3,9","result":"hit"}] <li>"hit" Un navire ennemi a été touché</li>
[his_strikes] => [{"target":"7,8","result":""},{"target":"7,8","result":""}] <li>"hit and sunk" Un navire ennemi a été touché et coulé</li>
</pre> </ul>
<h4>Vous devez tout simplement retourner l'adresse de la case sur laquelle vous souhaitez tirer sous forme de x,y</h4> </li>
<pre> </ul>
6,9
</pre> <h3>Réponse de votre bot</h3>
<p> <p>Il doit répondre par les coordonnées de la case dans laquelle il souhaite effectuer un tir.</p>
Pour tirer aux coordonnées x=6 y=9 <pre>{"play":"1,8"}</pre>
</p> <p>x,y</p>
<h2>Outils pour développer et tester votre bot</h2>
<h3>Script Botsarena en cours de développement</h3>
<h2>Faire entrer votre bot dans cette arène</h2>
<p>Le formulaire d'inscription de votre bot est sur la page d'accueil du site.</p>

View File

@ -76,18 +76,6 @@ function generate_numeric_select($start,$end,$selected,$name,$id){
} }
function get_IA_Response($iaUrl,$postParams){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $iaUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return htmlentities($output);
}
function place_ship_on_map($x1,$y1,$x2,$y2,$map){ function place_ship_on_map($x1,$y1,$x2,$y2,$map){
if ((($x1 <> $x2) && ($y1 <> $y2)) if ((($x1 <> $x2) && ($y1 <> $y2))
OR (!isset($map[$y1][$x1])) OR (!isset($map[$y1][$x1]))

View File

@ -19,7 +19,7 @@ function createElem(type,attributes)
{elem.setAttribute(i,attributes[i]);} {elem.setAttribute(i,attributes[i]);}
return elem; return elem;
} }
function fight(xd_check){ function fight(xd_check,fullLogs,gameId){
var xhr = Ajx(); var xhr = Ajx();
xhr.onreadystatechange = function(){if(xhr.readyState == 4){ xhr.onreadystatechange = function(){if(xhr.readyState == 4){
if(xhr.status == 200) { if(xhr.status == 200) {
@ -34,11 +34,11 @@ function fight(xd_check){
document.getElementById( 'bot' + strike['opponent'] + '-' + coords[1] + '-' + coords[0]).innerHTML = "X"; document.getElementById( 'bot' + strike['opponent'] + '-' + coords[1] + '-' + coords[0]).innerHTML = "X";
} }
var p=createElem("p"); var p=createElem("p");
p.innerHTML=strike['log']; p.innerHTML=strike['logs'];
document.getElementById('logs').appendChild(p); document.getElementById('logs').appendChild(p);
document.getElementById("logs").scrollTop=document.getElementById("logs").scrollHeight; document.getElementById("logs").scrollTop=document.getElementById("logs").scrollHeight;
if( strike['continue'] == 1){ if( strike['continue'] == 1){
fight(xd_check); fight(xd_check,fullLogs,gameId);
} }
} }
@ -46,11 +46,11 @@ function fight(xd_check){
}}; }};
xhr.open("POST", '/Battleship', true); xhr.open("POST", '/Battleship', true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send('act=fight&xd_check=' + xd_check); xhr.send('act=fight&xd_check=' + xd_check + '&fullLogs=' + fullLogs);
} }
function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShip4,nbShip5,nbShip6,xd_check){ function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShip4,nbShip5,nbShip6,xd_check,fullLogs){
var shipsArea= parseInt(nbShip1) + 2 * parseInt(nbShip2) + 3 * parseInt(nbShip3) + 4 * parseInt(nbShip4) + 5 * parseInt(nbShip5) + 6 * parseInt(nbShip6); var shipsArea= parseInt(nbShip1) + 2 * parseInt(nbShip2) + 3 * parseInt(nbShip3) + 4 * parseInt(nbShip4) + 5 * parseInt(nbShip5) + 6 * parseInt(nbShip6);
if(shipsArea > parseInt(gridWidth * gridHeight / 2) ){ if(shipsArea > parseInt(gridWidth * gridHeight / 2) ){
@ -131,10 +131,12 @@ function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShi
} }
} }
} }
var p=createElem("p"); for (var i = 0; i < grids['logs'].length; i++) {
p.innerHTML='players placed theirs ships'; var p = createElem("p");
document.getElementById('logs').appendChild(p); p.innerHTML = grids['logs'][i];
fight(xd_check); document.getElementById('logs').appendChild(p);
}
fight(xd_check,fullLogs);
} }
}}; }};
@ -152,6 +154,7 @@ function battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShi
+ '&nbShip5=' + nbShip5 + '&nbShip5=' + nbShip5
+ '&nbShip6=' + nbShip6 + '&nbShip6=' + nbShip6
+ '&xd_check=' + xd_check + '&xd_check=' + xd_check
+ '&fullLogs=' + fullLogs
); );
} }

View File

@ -1,10 +1,21 @@
<article> <!--<article>
<h2>Cette arène est en cours de maintenance, elle sera de nouveau prête dans les prochains jours</h2> <h2>Cette arène est en cours de maintenance, elle sera de nouveau prête dans les prochains jours</h2>
<p><img style="width: 100%;" src="/imgs/Arenes-Nimes.jpg" alt="travaux sur les arènes de Nimes"/></p> <p><img style="width: 100%;" src="/imgs/Arenes-Nimes.jpg" alt="travaux sur les arènes de Nimes"/></p>
</article> </article>-->
<?php <?php
/* #- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
require_once(__DIR__."/functions.php"); require_once(__DIR__."/functions.php");
$bots=get_Bots_Array('Battleship'); $bots=get_Bots_Array('Battleship');
@ -55,9 +66,7 @@ if(!$postParams){
?> ?>
</select></em> </select></em>
</p> </p>
<!-- battleship(bot1,bot2,gridWidth,gridHeight,nbShip1,nbShip2,nbShip3,nbShip4,nbShip5,nbShip6,xd_check) --> <p><input type="checkbox" id="fullLogs"/><label for="fullLogs">view the full logs</label></p>
<p><label>&nbsp;</label><input type="button" value="<?php echo $lang['FIGHT']; ?>" onclick="battleship(document.getElementById('bot1').value,document.getElementById('bot2').value,getElementById('width').value,getElementById('height').value,getElementById('ship1').value,getElementById('ship2').value,getElementById('ship3').value,getElementById('ship4').value,getElementById('ship5').value,getElementById('ship6').value,'<?php echo xd_check_input(2); ?>');"></p> <p><label>&nbsp;</label><input type="button" value="<?php echo $lang['FIGHT']; ?>" onclick="battleship(document.getElementById('bot1').value,document.getElementById('bot2').value,getElementById('width').value,getElementById('height').value,getElementById('ship1').value,getElementById('ship2').value,getElementById('ship3').value,getElementById('ship4').value,getElementById('ship5').value,getElementById('ship6').value,'<?php echo xd_check_input(2); ?>',document.getElementById('fullLogs').checked);"></p>
<div id="fightResult"></div> <div id="fightResult"></div>
</article </article>
*/
?>

View File

@ -4,6 +4,7 @@ article p select {}
td{min-width: 15px; height: 15px;} td{min-width: 15px; height: 15px;}
#fightResult{display:table;} #fightResult{display:table;}
#logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;} #logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;}
#logs em {color: grey; font-size: 70%; test-transform:italic;}
.battleshipGrid{display:table-cell; padding-left:10px; border-collapse:collapse; margin: 20px 20px 20px 20px;} .battleshipGrid{display:table-cell; padding-left:10px; border-collapse:collapse; margin: 20px 20px 20px 20px;}
.nofloat{float: none;} .nofloat{float: none;}
.battleshipGrid tr{} .battleshipGrid tr{}

View File

@ -1,4 +1,14 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
require_once(__DIR__."/functions.php"); require_once(__DIR__."/functions.php");
$bots=get_Bots_Array('connectFou'); $bots=get_Bots_Array('connectFou');

View File

@ -37,7 +37,7 @@
<li><em>players</em> Int indicating the number of players in the game, still 2 on connect Four.</li> <li><em>players</em> Int indicating the number of players in the game, still 2 on connect Four.</li>
<li><em>board</em> The map, i'll explain it at next chapter</li> <li><em>board</em> The map, i'll explain it at next chapter</li>
<li><em>you</em> String, Your bot's character on the grid</li> <li><em>you</em> String, Your bot's character on the grid</li>
<li><em>player-index</em> Int The order of your bot in turns. The first player is 0, second is 2.</li> <li><em>player-index</em> Int The order of your bot in turns. The first player is 0, second is 1.</li>
</ul> </ul>
<h4>The map</h4> <h4>The map</h4>
<p> It is represented by a sub-array, on the "board" parameter.<br/>Exemple:</p> <p> It is represented by a sub-array, on the "board" parameter.<br/>Exemple:</p>

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
function get_Post_Params($botsCount){ function get_Post_Params($botsCount){
$keysBots=array('bot1','bot2'); $keysBots=array('bot1','bot2');
foreach($keysBots as $botKey){ foreach($keysBots as $botKey){

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
require_once(__DIR__."/functions.php"); require_once(__DIR__."/functions.php");
$bots=get_Bots_Array('connectFou'); $bots=get_Bots_Array('connectFou');
?> ?>

View File

@ -1,4 +1,14 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
require_once(__DIR__."/functions.php"); require_once(__DIR__."/functions.php");
switch ($_POST['act']){ switch ($_POST['act']){

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
function get_Post_Params($botsCount){ function get_Post_Params($botsCount){
$keysBots=array('bot1','bot2'); $keysBots=array('bot1','bot2');
foreach($keysBots as $botKey){ foreach($keysBots as $botKey){
@ -15,22 +26,3 @@ function get_Post_Params($botsCount){
} }
return array('bot1' => $_POST['bot1'],'bot2' => $_POST['bot2']); return array('bot1' => $_POST['bot1'],'bot2' => $_POST['bot2']);
} }
/*
function get_Bots_Array(){
//Recupérer la liste des Bots
$bots=array();
$botsList=explode("\n",file_get_contents(__DIR__."/listOfBots.txt"));
foreach($botsList as $botLigne){
if(preg_match("/\ (http|https):\/\//", $botLigne)){
list($name,$url)=explode(" ",$botLigne);
$bots[]=array("name" => $name, "url" =>$url);
}
}
return $bots;
}
*/

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
require_once(__DIR__."/functions.php"); require_once(__DIR__."/functions.php");
$bots=get_Bots_Array('tictactoe'); $bots=get_Bots_Array('tictactoe');

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
$arenas=array( $arenas=array(
array( array(
'id' => "tictactoe", 'id' => "tictactoe",

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
$siteParam=array("BASEURL" => "http://botsarena.tinad.fr/"); $siteParam=array("BASEURL" => "http://botsarena.tinad.fr/");
$mysqlParams=array( $mysqlParams=array(
'host' => 'localhost', 'host' => 'localhost',

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
if(isset($_POST['xd_check'])){ if(isset($_POST['xd_check'])){
//un formulaire a été soumis //un formulaire a été soumis

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
function get_arenas_list(){ function get_arenas_list(){
include (__DIR__."/arenas_lists.php"); include (__DIR__."/arenas_lists.php");
return $arenas; return $arenas;

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
$hist=get_battles_history($currentArena); $hist=get_battles_history($currentArena);

View File

@ -1,4 +1,15 @@
<?php <?php
#- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of botsArena.
#
# Copyright (C) Gnieark et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
$rs=mysqli_query($lnMysql,"SELECT 1 FROM bots_modifs WHERE validate_secret='".mysqli_real_escape_string($lnMysql,$_GET['params'])."';"); $rs=mysqli_query($lnMysql,"SELECT 1 FROM bots_modifs WHERE validate_secret='".mysqli_real_escape_string($lnMysql,$_GET['params'])."';");
if(!$r=mysqli_fetch_row($rs)){ if(!$r=mysqli_fetch_row($rs)){
error(404,"Page doesn't exist"); error(404,"Page doesn't exist");