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é.

Be the first to comment

Leave a Reply

Your email address will not be published.




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