L3 Info : PHP et Applications Web
 
◃  Ch. 3 Un coup de poker  ▹
 

Classe PokerUI et script principal

  • La classe PokerUI permet de produire les composants nécessaires pour interagir avec l'utilisateur
    /**
     * Classe PokerUI
     *
     * @author Dominique Fournier
     * @date 2017-2022
     * @version 1.3 compatible PHP7.4
     */
    
    include_once "JeuCartes.php";
    include_once "Main.php";
    
    class PokerUI {
    
      /**
       * @access private
       * @var JeuCartes
       */
      private JeuCartes $paquetCartes;
    
      /**
       * @access private
       * @var Main
       */
      private $main;
    
      /**
       * @access public
       */
      public function __construct(){
        $this->paquetCartes = new JeuCartes();
        $this->paquetCartes->melangePaquet();
    
        $this->main = new Main();
    
        $this->main->addCarte($this->paquetCartes->distribueCarte());
        $this->main->addCarte($this->paquetCartes->distribueCarte());
        $this->main->addCarte($this->paquetCartes->distribueCarte());
        $this->main->addCarte($this->paquetCartes->distribueCarte());
        $this->main->addCarte($this->paquetCartes->distribueCarte());
    
        $this->main->triMain();
      }
    
      /**
       * @access public
       * @param array les indices des cartes à renouveler
       * @return void
       */
      public function renouvelleMain(array $indexes): void {
        foreach ($indexes as $index) {
          $c = $this->main->getCarte($index);
          $this->main->setCarte($index,$this->paquetCartes->distribueCarte());
          $this->paquetCartes->remiseCarte($c);
        }
        $this->main->triMain();
      }
    
      /**
       * @access public
       * @return void
       */
      public function affichePaquetCarte():void {
        $bjc = new BoiteJeuCartes($this->paquetCartes);
        echo $bjc;
      }
    
      /**
       * @access public
       * @return void
       */
      public function afficheMain(): void {
        echo new BoiteMain($this->main);
      }
    
      /**
       * @access public
       * @return void
       */
      public function afficheFormulaireMain(): void {
        echo "<form action='".$_SERVER['PHP_SELF']."' method='get'>
    <div class='main'><fieldset><legend>Formulaire de changement de cartes</legend>
    <input type='checkbox' name='main[]' value='0' />";
        echo new BoiteCarte($this->main->getCarte(0));
        echo "<input type='checkbox' name='main[]' value='1' />\n";
        echo new BoiteCarte($this->main->getCarte(1));
        echo "<input type='checkbox' name='main[]' value='2' />\n";
        echo new BoiteCarte($this->main->getCarte(2));
        echo "<input type='checkbox' name='main[]' value='3' />\n";
        echo new BoiteCarte($this->main->getCarte(3));
        echo "<input type='checkbox' name='main[]' value='4' />\n";
        echo new BoiteCarte($this->main->getCarte(4));
        echo "<input type='submit' value='changer' name='action' />\n";
        echo "<input type='submit' value='finir' name='action' />\n";
        echo "<input type='submit' value='raz' name='action' />\n";
        echo "</div></form>\n";
      }
    
      /**
       * @static
       * @access public
       * @retrun void
       */
      public static function afficheMessage($message): void {
        echo "<h3>$message</h3>\n";
      }
    
      /**
       * @access public
       * @return void
       */
      public static function afficheLienRecommencer(): void {
        echo "<p><a href='".$_SERVER['PHP_SELF']."'>Recommencer ?</a></p>\n";
      }
    
    }
  • Le script principal jeuPoker.php gère la session et les états de l'application
    include_once "BoiteJeuCartes.php";
    include_once "BoiteMain.php";
    include_once "PokerUI.php";
    
    function afficheDebutHTML() {
    echo "<!doctype html>
            <html lang='fr'>
    <head>
    <meta charset='UTF-8'>
    <title>Poker</title>
    
    <link rel='stylesheet' type='text/css' href='poker.css' />
    </head>
    <body>
    <div class='poker'>
    <h1>Manipuler une main de 5 cartes au Poker</h1>\n";
    }
    
    
    function afficheFinHTML() {
    echo "</div>
    
    </body>
    </html>\n";
    }
    
    // initialisation ou entretien de la session
    session_start();
    
    // on peut commencer à afficher le début de la page web
    afficheDebutHTML();
    
    // Vérification de la situation de la session
    
    // premier passage l'objet gerant l'UI dans la session n'existe pas
    if (!isset($_SESSION['UI'])) {
      $_SESSION['UI' ] = new PokerUI();
      $UI = &$_SESSION['UI'];
    
      PokerUI::afficheMessage("Première main");
      // on affiche la main et propose de changer des cartes
      $UI->afficheMain();
    
      $UI->afficheFormulaireMain();
    
    }
    else {
      // l'application est déjà lancée
      // création d'une variable locale au script
      $UI = &$_SESSION['UI'];
    
      // une partie est déjà commencée
      if (isset($_GET) && isset($_GET['action'])) {
    
        switch ($_GET['action']) {
    
        case 'changer':
          PokerUI::afficheMessage("Ancienne main");
          $UI->afficheMain();
    
          if (isset($_GET['main']) && is_array($_GET['main'])) {
    	// on procède au changement de cartes
    	$UI->renouvelleMain($_GET['main']);
          }
    
          PokerUI::afficheMessage("Nouvelle main");
          $UI->afficheMain();
    
          $UI->afficheFormulaireMain();
          break;
    
        case 'finir':
          $UI->afficheMain();
          session_unset();
          session_destroy();
          PokerUI::afficheLienRecommencer();
          break;
    
        case 'raz':
          // cas de la remise à zéro : une variable de formulaire transmet l'ordre
          session_unset();
          session_destroy();
          PokerUI::afficheLienRecommencer();
          break;
    
        default :
          echo "Une action imprévue a été demandée";
        }
    
      }
    }
    
    // Quoi qu'il arrive on affiche l'état du jeu
    // fonctionne meme quand action=raz !
    PokerUI::afficheMessage("État du paquet");
    $UI->affichePaquetCarte();
    
    
    
      // on termine l'affichage de la page html
    afficheFinHTML();
    
    ?>
    
  • test du script