summaryrefslogtreecommitdiff
path: root/sem_5/HLIN510_Web/tp2/Mastermind.php
blob: 548af3af6bc78d827ef81927e764b3408b680cce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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"));
?>