Solution ex10

Voici comment écrire le code de la fonction guess() qui doit deviner le nombre du jeu de classe Game passé en paramètre, en complétant le code donné :

class Game {
  private $number;
  private $num_tries;

  function __construct() {
    $this->number = rand(0, 10000);
    $this->num_tries = 0;
  }

  function propose($value) {
    $this->num_tries++;
    if ($this->num_tries > 15) {
      throw new Exception("La méthode propose() a été appelée 15 fois");
    }
    if ($value == $this->number) {
      return 0;
    } elseif ($value > $this->number) {
      return 1;
    } else {
      return -1;
    }
  }
}

function guess($Game) {
  $result = 0;
  $min = 0;
  $max = 10000;

  // Boucle jusqu'à ce que le nombre soit trouvé
  while ($result != 0) {
    // Propose un nombre au milieu de la plage
    $guess = (int) (($min + $max) / 2);
    $result = $Game->propose($guess);

    // Si le nombre proposé est trop grand, la plage supérieure est réduite
    if ($result == 1) {
      $max = $guess - 1;
    }
    // Si le nombre proposé est trop petit, la plage inférieure est augmentée
    elseif ($result == -1) {
      $min = $guess + 1;
    }
  }

  return $guess;
}

$Game = new Game();
$result = guess($Game);

La fonction guess() utilise la méthode de division et conquête pour deviner le nombre. Elle définit une plage de valeurs (entre $min et $max) et propose un nombre au milieu de cette plage. Si le nombre proposé est trop grand, la plage supérieure est réduite à la valeur proposée moins 1. Si le nombre proposé est trop petit, la plage inférieure est augmentée à la valeur proposée plus 1. La boucle se répète jusqu’à ce que le nombre soit trouvé.

Soyez le premier à commenter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.




Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.