summaryrefslogtreecommitdiff
path: root/sem_5/HLIN510_Web/tp2
diff options
context:
space:
mode:
Diffstat (limited to 'sem_5/HLIN510_Web/tp2')
-rw-r--r--sem_5/HLIN510_Web/tp2/Mastermind.php74
-rw-r--r--sem_5/HLIN510_Web/tp2/Rapport_TER_2019.pdfbin0 -> 193816 bytes
-rw-r--r--sem_5/HLIN510_Web/tp2/master.php93
3 files changed, 167 insertions, 0 deletions
diff --git a/sem_5/HLIN510_Web/tp2/Mastermind.php b/sem_5/HLIN510_Web/tp2/Mastermind.php
new file mode 100644
index 0000000..548af3a
--- /dev/null
+++ b/sem_5/HLIN510_Web/tp2/Mastermind.php
@@ -0,0 +1,74 @@
+<?php
+interface iMastermind {
+ public function __construct($taille=4);
+ public function test($code);
+ public function getEssais();
+ public function getTaille();
+}
+
+/** classe dont une instance est un jeu de mastermind */
+class Mastermind implements iMastermind {
+ /** code à découvrir chaine de car compris entre 0 et 9 */
+ protected $code="";
+
+ /** liste des essais */
+ protected $lessai=array();
+
+ /** constructeur par défaut : génération d'un code aléatoire de taille
+ * chiffres différents
+ */
+ public function __construct($taille=4){
+ for($i=0;$i<$taille;$i++){
+ $c=rand(0,9); // nouveau chiffre
+ $this->code.="$c";
+ }
+ }
+ /** teste la validité d'une chaîne code et retourne un booléen :
+ * - que des chiffres ;
+ * - de même taille que $this->code
+ */
+ public function valide($code){
+ if(!is_string($code) || strlen($code)!=strlen($this->code)
+ || !ctype_digit($code)){
+ return false;
+ }
+ return true;
+ }
+ /** teste une chaîne de caractères par rapport au code et retourne un
+ * tableau de 2 entiers : ( nb de chiffres bien placés, nb de chiffres mal
+ * placés ou false si invalide
+ */
+ public function test($code){
+ if(!$this->valide($code))
+ return false;
+ $res=array("bon"=>0, "mal"=>0);
+ $tampon=$this->code;
+ for($i=0;$i<strlen($code);$i++){ // boucle des biens placés
+ if($tampon[$i]==$code[$i]){
+ $tampon[$i]='Y'; // afin de ne plus le prendre en compte
+ $res["bon"]++;
+ }
+ } // fin de la boucle des biens placés
+ for($i=0;$i<strlen($code);$i++){ // boucle des mals placés
+ $pos = strpos($tampon,$code[$i]);
+ if (!($pos === false)) {
+ $res["mal"]++;
+ $tampon[$pos]='Y';
+ }
+ } // fin de boucle des mals placés
+ $this->lessai[$code]=$res;
+ return $res;
+ }
+
+ /** retourne la taille du code */
+ public function getTaille () {
+ return strlen($this->code);
+ }
+ public function getEssais () {
+ return $this->lessai;
+ }
+}
+// $m=new Mastermind(); //pour tester
+// print_r($m);
+// print_r($m->test("1234"));
+?>
diff --git a/sem_5/HLIN510_Web/tp2/Rapport_TER_2019.pdf b/sem_5/HLIN510_Web/tp2/Rapport_TER_2019.pdf
new file mode 100644
index 0000000..c20b4ca
--- /dev/null
+++ b/sem_5/HLIN510_Web/tp2/Rapport_TER_2019.pdf
Binary files differ
diff --git a/sem_5/HLIN510_Web/tp2/master.php b/sem_5/HLIN510_Web/tp2/master.php
new file mode 100644
index 0000000..58f8e26
--- /dev/null
+++ b/sem_5/HLIN510_Web/tp2/master.php
@@ -0,0 +1,93 @@
+<?php
+//include "Mastermind.php"; // PLUS NÉCESSAIRE AVEC AUTOLOAD !
+function __autoload($classname){ // avant le session_start !
+ include './' . $classname . '.php';
+}
+session_start();
+if (isset($_POST['nouveau'])){ // SI nouvelle partie
+ $_SESSION=array();
+}
+ini_set('display_errors', 1); error_reporting(E_ALL);
+?>
+<!doctype html>
+<html lang="fr">
+<head>
+<meta charset="utf-8" />
+<title>Site de jeu : Mastermind</title>
+</head>
+<body>
+<h1 align="center">Mastermind</h1>
+<form method="post">
+<p>Veuillez saisir successivement des combinaisons de
+
+<?php
+$i=1;
+if(isset($_SESSION['jeu'])){ // restauration objet Mastermind
+ $jeu=$_SESSION['jeu'];
+ // print_r($jeu); // DEBUG
+ $taille=$jeu->getTaille();
+}else { // début de partie
+ if(!empty($_GET['taille'])){
+ $taille=(int)$_GET['taille'];
+ }else{
+ $taille=4;
+ }
+ $jeu=new Mastermind($taille);
+ $_SESSION['jeu']=$jeu;
+}
+echo $taille;
+?> chiffres jusqu'à la victoire !
+</p>
+<table>
+ <tr>
+ <th align="left" valign="middle">Num&eacute;ro</th>
+ <th align="left" valign="middle">Proposition</th>
+ <th align="left" valign="middle">Bien plac&eacute;(s)</th>
+ <th align="left" valign="middle">Mal plac&eacute;(s)</th>
+ </tr>
+<?php
+ foreach($jeu->getEssais() as $code=>$res){
+ echo "<tr><td>$i</td><td>".$code."</td><td>".$res['bon'].
+ "</td><td>".$res['mal']."</td></tr>\n";
+ $i++;
+ }
+if (!empty($_POST['prop'])){ // une proposition
+ $r=$jeu->test($_POST['prop']); // résultat
+
+ if ($r===false){ // proposition invalide
+ echo "<tr><td>Incorrect</td><td>".$_POST['prop'].
+ "</td><td></td><td></td></tr>\n";
+ }else { // valide !
+ echo "<tr><td>$i</td><td>".$_POST['prop']."</td><td>".$r["bon"].
+ "</td><td>".$r["mal"]."</td></tr>\n";
+ $_SESSION['jeu']=$jeu;
+ $i++;
+ }
+ if ($r===false || $r["bon"]!=$taille){ // tq pas gagné !
+ echo "<tr><td>$i</td><td>";
+ echo "<input type='text' name='prop' autofocus size='".$jeu->getTaille().
+ "'</td><td></td><td></td></tr>\n";
+?>
+ </table>
+ <input type="submit" value="OK">
+<?php
+ }else{ // GAGNE
+?>
+ <tr><td></td><td>GAGNE !</td><td></td></tr>
+ </table>
+<?php
+ }
+}else{ // pas de proposition
+ echo "<tr><td>$i</td><td>";
+ echo "<input type='text' name='prop' autofocus size='".$jeu->getTaille().
+ "'</td><td></td><td></td></tr>\n";
+?>
+ </table>
+ <input type="submit" value="OK">
+<?php
+}
+?>
+ <input type="submit" name="nouveau" value="Nouvelle Partie">
+ </form>
+ </body>
+</html>