let's fight

master
Gnieark 9 years ago
parent 5f5f754d26
commit 771adddea6

@ -0,0 +1,138 @@
<!DOCTYPE html><html lang="fr"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="Gnieark"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Arbitre Morpion</title>
<style type="text/css">
<!-- @font-face {font-family: 'Special Elite';font-style: normal; font-weight: 400; src: local('Special Elite'), local('SpecialElite-Regular'), url(http://themes.googleusercontent.com/static/fonts/specialelite/v4/9-wW4zu3WNoD5Fjka35Jm_n8qdNnd5eCmWXua5W-n7c.woff) format('woff');}
body{width:100%;font-size:100%; top: 0px;line-height:140%;word-wrap:break-word;text-rendering:optimizelegibility;margin:0 auto;font-family : "lucida grande", "gill sans", arial, sans-serif;}
header{background-color:#502FD2; width: 100%; overflow: hidden;height: auto;}
header h1{display: block; font-size:300%; color:#FFF;float: left; width: 45%;font-family: 'Special Elite', cursive;margin-left: 5%;}
header p{display: block; width: 45%;color:#FFF; float: left;}
section {border-bottom: 1px solid rgb(204, 204, 204); margin: 0 auto;overflow: hidden;width: 90%;}
-->
</style>
</head>
<body>
<header><h1>Arène à morpions</h1></header>
<section>
<form method="POST" action="#">
<p>
<input type="text" placeholder="URL de la premiere IA" name="ia1URL"<?php if(isset($_POST['ia1URL'])){echo "value=\"".$_POST['ia1URL']."\"";} ?>/>
<input type="text" placeholder="X ou O" name="youIA1" <?php if(isset($_POST['youIA1'])){echo "value=\"".$_POST['youIA1']."\"";} ?>/>
</p>
<p>
<input type="text" placeholder="URL de la deuxième IA" name="ia2URL" <?php if(isset($_POST['ia2URL'])){echo "value=\"".$_POST['ia2URL']."\"";} ?>/>
<input type="text" placeholder="X ou O" name="youIA2" <?php if(isset($_POST['youIA2'])){echo "value=\"".$_POST['youIA2']."\"";} ?>/>
</p>
<p><input type="submit" value="Fight!" name="submit">
</form>
<pre>
<?php
if(isset($_POST['submit'])){
//initialiser la grille
$grille=array(
'0-0' => '','0-1' => '','0-2' => '',
'1-0' => '','1-1' => '','1-2' => '',
'2-0' => '','2-1' => '','2-2' => '');
$end=false;
$playerEnCours=1;
while($end==false){
switch($playerEnCours){
case 1:
$playerURL=$_POST['ia1URL'];
$playerCHAR=$_POST['youIA1'];
break;
case 2:
$playerURL=$_POST['ia2URL'];
$playerCHAR=$_POST['youIA2'];
break;
default:
echo "une erreur est survenue";
die;
}
$playerRep=htmlentities(getIAResponse($playerCHAR,$playerURL,$grille));
echo "Reponse: ".$playerRep."\n";
//tester la validité de la réponse
if((isset($grille[$playerRep])) && ($grille[$playerRep]=="")){
//reponse conforme
echo $playerCHAR." joue en ".$playerRep." la nouvelle grille est \n";
$grille[$playerRep]=$playerCHAR;
for($j=0;$j<3;$j++){
for($i=0;$i<3;$i++){
echo $grille[$j."-".$i];
if ($grille[$j."-".$i]==""){
echo " ";
}
}
echo "\n";
}
//tester si trois caracteres allignés
if(
(($grille['0-0']==$grille['0-1'])&&($grille['0-1']==$grille['0-2'])&&($grille['0-2']!==""))
OR (($grille['1-0']==$grille['1-1'])&&($grille['1-1']==$grille['1-2'])&&($grille['1-2']!==""))
OR (($grille['2-0']==$grille['2-1'])&&($grille['2-1']==$grille['2-2'])&&($grille['2-2']!==""))
OR (($grille['0-0']==$grille['1-0'])&&($grille['1-0']==$grille['2-0'])&&($grille['2-0']!==""))
OR (($grille['0-1']==$grille['1-1'])&&($grille['1-1']==$grille['2-1'])&&($grille['2-1']!==""))
OR (($grille['0-2']==$grille['1-2'])&&($grille['1-2']==$grille['2-2'])&&($grille['2-2']!==""))
OR (($grille['0-0']==$grille['1-1'])&&($grille['1-1']==$grille['2-2'])&&($grille['2-2']!==""))
OR (($grille['0-2']==$grille['1-1'])&&($grille['1-1']==$grille['2-0'])&&($grille['2-0']!==""))
){
echo "le joueur ".$playerCHAR." a gagné.";
$end=true;
break;
}
//tester si toutes les cases ne seraient pas prises
$full=true;
foreach($grille as $char){
if($char==""){
$full=false;
break;
}
}
if($full){
echo "Match nul";
$end=true;
break;
}
//on change de joueur
if($playerEnCours==1){
$playerEnCours=2;
}else{
$playerEnCours=1;
}
}else{
echo "le joueur ".$playerCHAR." a fait une réponse non conforme. Il perd";
break;
}
}
}
function getIAResponse($youChar,$iaBaseUrl,$grille){
$paramsGrille="";
foreach($grille as $key => $case){
$paramsGrille.="&".$key."=".$case;
}
$url=$iaBaseUrl."?you=".$youChar.$paramsGrille;
echo "\n".$url."\n";
//return http_get($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
return $output;
}
?>
</pre>
</section>
</body>
</html>

@ -0,0 +1,23 @@
<?php
$cases=array("0-0","0-1","0-2","1-0","1-1","1-2","2-0","2-1","2-2");
//remplir l'array
$freeCases=array();
foreach($cases as $case){
if (!isset($_GET[$case])){
echo "wrong parameters ".$case; die;
}
if($_GET[$case]==""){
$freeCases[]=$case;
}
}
if(!isset($_GET['you'])){
echo "wrong parameters 2"; die;
}
//have all parameters lets play the game
//Stupid IA, juste random
if (count($freeCases)==0){
echo "error. la grille est déjà pleine enfoiré";
die;
}
shuffle($freeCases);
echo $freeCases[0];

@ -0,0 +1,53 @@
#Intelligence Artificielle
Ce défi consiste à développer une intelligence artificielle... au morpion
On fera s'affronter vos IAi lors d'un tournoi.
Vous devez vous débrouiller pour que votre application soit accessible en http ou https (pour ceux qui n'auraient nulle part où déposer leur script sur le web, je preterai un morceau d'un serveur dédié... bref on s'arrangera).
## Fonctionnement des duels
Une première version du code source du programme arbitre est déposée dans le dossier du challenge (rien de secret).
Les IA ne communiquent pas directement entre elles. C'est un programme "arbitre" qui fera des requetes http(s) vers vos scripts.
Il intérrogera chaucun son tour les deux combattants en faisant une requette http avec quelques paramètres GET
## Spécifications GET et retours
Votre programme n'a pas à gérer une partie entière de morpion, juste un tour.
le programme arbitre fait une requette construite de la manière suivante:
```
https://votreUrl/?you=O&0-0=&0-1=O&0-2=X&1-0=X&1-1=X&1-2=O&2-0=O&2-1=&2-2=X
```
Le parametre GET you vous indique quel est votre symbole dans la grille de morpion. classiquement "X" ou "O"
Pour chaque case de la grille de morpion, un paramètre GET correspondant à ses coordonnées vous est indiqué. Il peut être:
* votre symbole (ce qui signifie que vous avez déjà joué là)
* le symbole de otre adversaire. il a déjà joué dans cette case
* rien, la case est disponible.
Votre programme choisit la case sur laquelle il souhaite jouer compte tenu de la grille et retourne ses coordonnées.
Le résultat de la requete http ne peut qu'être: "0-0" ou "0-1" ou "0-2" ou "1-0" etc....
Un joueur (une IA) qui répond autre chose (au caractère près) ou qui répond avec les coordonnées d'une case déjà jouée perd la partie.
Si les parametres GET envoyés par le programme arbitre sont incohérents, votre IA peut insulter l'arbitre comme valeur de retour.
##Tester votre programme
Vous pouvez tester le programme arbitre à l'adresse http://morpionMaster.tinad.fr (il détaille le résultat de chaque partie et permet un débug de vos retours)
Vous renseignez l'URL de votre IA, et vous pouvez lui faire affronter.... elle même, ou mon IA stupide que j'ai codé juste pour pouvoir tester le programme arbitre http://morpionMaster.tinad.fr/stupidIa.php .
Ce dernier programme se contente de donner en réponse les coordonées d'une case libre prise au hazard.
Les deux scripts php (IA débile et Master) sont dans le dossier morpionMaster
##Gagnants
L'affrontement aura lieu lundi prochain.
Je modifierai le programme arbitre pour qu'il génère des parties entre deux adversaires
* jusqu'à ce qu'un des deux adversaires ait 3 manches gagnées de plus que l'autre.
* Au bout de 200 parties si l'écart au score est inférieur à 3, les candidats sont déclarés aexeco.
* Le gagnant du concours de rapidité au challenge de programmation a un avantage d'une partie automatiquement gagnée en début de script.
* En cas d'aexeco, ... on verra, à coup de shifumi
Loading…
Cancel
Save