This commit is contained in:
gnieark 2016-06-18 00:56:46 +02:00
parent 73f5dd4e37
commit 2892d62519
2 changed files with 327 additions and 299 deletions

View File

@ -20,304 +20,332 @@ 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, $fullLogs = true;
'width' => $_SESSION['width'], }else{
'height' => $_SESSION['height'], $fullLogs = 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();
}
//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(
if($sunk){ 'opponent' => $opponentName,
$result="hit and sunk"; 'width' => $postValues['gridWidth'],
//remove the ship 'height' => $postValues['gridHeight'],
unset($_SESSION['ships'][$opponent][$shipIndex]); 'ship1' => $postValues['nbShip1'],
$_SESSION['ships'][$opponent] = array_values($_SESSION['ships'][$opponent]); 'ship2' => $postValues['nbShip2'],
//var_dump($_SESSION['ships'][$opponent]); 'ship3' => $postValues['nbShip3'],
//win the game? 'ship4' => $postValues['nbShip4'],
if(count($_SESSION['ships'][$opponent]) == 0){ 'ship5' => $postValues['nbShip5'],
$result="hit sunk and win"; 'ship6' => $postValues['nbShip6']
$continue=0; )
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$currentPlayer); );
}
} $anwserPlayerJson=get_IA_Response($currentBot['url'],$botParamsToSend);
if($fulLLogs){
break; $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{
//remember this shot $fullLogs="";
$_SESSION['strikes'][$currentPlayer][]=array( }
'target' => $x.",".$y,
'result' => $result
);
$boatsPlayer = json_decode( html_entity_decode($anwserPlayer));
//send message for the arena's ajax web page if(!$boatsPlayer){
echo json_encode(array( echo $currentBot['name']." a fait une réponse non conforme, il perd.".$anwserPlayer;
'opponent'=> $opponent, if($player==1){
'target' => $x.",".$y, save_battle('Battleship',$bot1['name'],$bot2['name'],2);
'log' => $currentBot['name']." tire en ".$x.",".$y." ".$result, }else{
'continue' => $continue save_battle('Battleship',$bot1['name'],$bot2['name'],1);
)); }
die;
die; }
break;
default: //init grid
break; 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 $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;
}
$botParamsToSend=array(
'game' => 'Battleship',
'match_id' => $_SESSION['matchId']."-".$currentPlayer,
'act' => 'fight',
'opponent' => $opponentName,
'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' => json_encode($_SESSION['strikes'][$currentPlayer]),
'his_strikes' => json_encode($_SESSION['strikes'][$opponent])
);
$anwserPlayer=get_IA_Response($currentBot['url'],$botParamsToSend);
if(!preg_match('/^[0-9]+,[0-9]+$/',$anwserPlayer)){
echo json_encode(array(
'target' => '',
'log' => $currentBot['name']." a fait une réponse non conforme, il perd.".$anwserPlayer
));
save_battle('Battleship',$_SESSION['bot1']['name'],$_SESSION['bot2']['name'],$opponent);
die;
}
list($x,$y)=explode(",",$anwserPlayer);
//check if shot is under map's limits
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"
));
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,
'log' => $currentBot['name']." tire en ".$x.",".$y." ".$result,
'continue' => $continue
));
die;
break;
default:
break;
} }

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>