[php] NSI

Viewer

  1. <?php 
  2. $var = '/***
  3.  
  4.   Solution du TD http://defeo.lu/aws/tutorials/tutorial2
  5.  
  6.  **/
  7.  
  8. class Puissance4 {
  9.   /*
  10.     Intialise un plateau de jeu de dimensions `rows` × `cols` (par défaut 6×7),
  11.     et fait l\'affichage dans l\'élément `element_id` du DOM.
  12.    */
  13.   constructor(element_id, player1, player2, rows=6, cols=7) {
  14.     this.player_names = [player1, player2];
  15.     // Nombre de lignes et de colonnes
  16.     this.rows = rows;
  17.     this.cols = cols;
  18.       // cet tableau à deux dimensions contient l\'état du jeu:
  19.     //   0: case vide
  20.     //   1: pion du joueur 1
  21.     //   2: pion du joueur 2
  22.     this.board = Array(this.rows);
  23.     for (let i = 0; i < this.rows; i++) {
  24.       this.board[i] = Array(this.cols).fill(0);
  25.     }
  26.     // un entier: 1 ou 2 (le numéro du prochain joueur)
  27.     this.turn = 1;
  28.     // Nombre de coups joués
  29.     this.moves = 0;
  30.     /* un entier indiquant le gagnant:
  31.         null: la partie continue
  32.            0: la partie est nulle
  33.            1: joueur 1 a gagné
  34.            2: joueur 2 a gagné
  35.     */
  36.     this.winner = null;
  37.  
  38.     // L\'élément du DOM où se fait l\'affichage
  39.     this.element = document.querySelector(element_id);
  40.     // On ajoute le gestionnaire d\'événements pour gérer le click
  41.     //
  42.     // Pour des raisons techniques, il est nécessaire de passer comme gestionnaire
  43.     // une fonction anonyme faisant appel à `this.handle_click`. Passer directement
  44.     // `this.handle_click` comme gestionnaire, sans wrapping, rendrait le mot clef
  45.     // `this` inutilisable dans le gestionnaire. Voir le "binding de this".
  46.     this.element.addEventListener(\'click\', (event) => this.handle_click(event));
  47.     // On fait l\'affichage
  48.     this.render();
  49.   }
  50.  
  51.   /* Affiche le plateau de jeu dans le DOM */
  52.   render() {
  53.     let table = document.createElement(\'table\');
  54.     //ATTENTION, la page html est écrite de haut en bas. Les indices
  55.     //pour le jeu vont de bas en haut (compteur i de la boucle)
  56.     for (let i = this.rows - 1; i >= 0; i--) {
  57.       let tr = table.appendChild(document.createElement(\'tr\'));
  58.       for (let j = 0; j < this.cols; j++) {
  59.         let td = tr.appendChild(document.createElement(\'td\'));
  60.         let colour = this.board[i][j];
  61.         if (colour)
  62.           td.className = \'player\' + colour;
  63.         td.dataset.column = j;
  64.       }
  65.     }
  66.     this.element.innerHTML = \'\';
  67.     this.element.appendChild(table);
  68.   }
  69.  
  70.         set(row, column, player) {
  71.     // On colore la case
  72.           this.board[row][column] = player;
  73.     // On compte le coup
  74.     this.moves++;
  75.         }
  76.  
  77.   /* Cette fonction ajoute un pion dans une colonne */
  78.         play(column) {
  79.     // Trouver la première case libre dans la colonne
  80.     let row;
  81.     for (let i = 0; i < this.rows; i++) {
  82.       if (this.board[i][column] == 0) {
  83.         row = i;
  84.         break;
  85.       }
  86.     }
  87.     if (row === undefined) {
  88.       return null;
  89.     } else {
  90.       // Effectuer le coup
  91.       this.set(row, column, this.turn);
  92.       // Renvoyer la ligne où on a joué
  93.       return row;
  94.     }
  95.         }
  96.  
  97.   handle_click(event) {
  98.     // Vérifier si la partie est encore en cours
  99.     if (this.winner !== null) {
  100.               if (window.confirm("Game over!\\n\\nDo you want to restart?")) {
  101.                       this.reset();
  102.         this.render();
  103.                         }
  104.                         return;
  105.     }
  106.  
  107.           let column = event.target.dataset.column;
  108.       if (column !== undefined) {
  109.         const player_name = this.player_names[this.turn -1];
  110.         const computer_player_names = ["Baby", "Boy", "Daddy", "Grandpa"];
  111.         if (computer_player_names.includes(player_name)) {
  112.               const s_board = this.board.map(String).join(\'-\');
  113.               const xhr = new XMLHttpRequest();
  114.               var args = "board=" + s_board + "&player_id=" + this.turn + "&player_name=" + player_name;
  115.               args = args + "&column=" + column;
  116.             xhr.open("GET", "power4_computer_play?" + args);
  117.             xhr.send();
  118.             xhr.responseType = "json";
  119.             xhr.onload = () => {
  120.               if (xhr.readyState == 4 && xhr.status == 200) {
  121.                 this.handle_click_column(xhr.response.column)
  122.               } else {
  123.                 console.log(`Error: ${xhr.status}`);
  124.               }
  125.             };
  126.         }
  127.         else {
  128.             this.handle_click_column(column)
  129.       }
  130.     }
  131.   }
  132.   handle_click_column(column) {
  133.  
  134.       //attention, les variables dans les datasets sont TOUJOURS
  135.       //des chaînes de caractères. Si on veut être sûr de ne pas faire de bêtise,
  136.       //il vaut mieux la convertir en entier avec parseInt
  137.       column = parseInt(column);
  138.            let row = this.play(parseInt(column));
  139.  
  140.       if (row === null) {
  141.         window.alert("Column is full!");
  142.       } else {
  143.         // Vérifier s\'il y a un gagnant, ou si la partie est finie
  144.         if (this.win(row, column, this.turn)) {
  145.           this.winner = this.turn;
  146.         } else if (this.moves >= this.rows * this.columns) {
  147.           this.winner = 0;
  148.         }
  149.         // Passer le tour : 3 - 2 = 1, 3 - 1 = 2
  150.         this.turn = 3 - this.turn;
  151.  
  152.         // Mettre à jour l\'affichage
  153.         this.render()
  154.  
  155.         //Au cours de l\'affichage, pensez eventuellement, à afficher un
  156.         //message si la partie est finie...
  157.         switch (this.winner) {
  158.           case 0:
  159.             window.alert("Null game!!");
  160.             break;
  161.           case 1:
  162.             window.alert("Player 1 wins");
  163.             break;
  164.           case 2:
  165.             window.alert("Player 2 wins");
  166.             break;
  167.         }
  168.       }
  169.   }
  170.  
  171.   /*
  172.    Cette fonction vérifie si le coup dans la case `row`, `column` par
  173.    le joueur `player` est un coup gagnant.
  174.  
  175.    Renvoie :
  176.      true  : si la partie est gagnée par le joueur `player`
  177.      false : si la partie continue
  178.  */
  179.         win(row, column, player) {
  180.                 // Horizontal
  181.     let count = 0;
  182.     for (let j = 0; j < this.cols; j++) {
  183.       count = (this.board[row][j] == player) ? count+1 : 0;
  184.       if (count >= 4) return true;
  185.     }
  186.                 // Vertical
  187.     count = 0;
  188.     for (let i = 0; i < this.rows; i++) {
  189.       count = (this.board[i][column] == player) ? count+1 : 0;
  190.             if (count >= 4) return true;
  191.     }
  192.                 // Diagonal
  193.     count = 0;
  194.     let shift = row - column;
  195.     for (let i = Math.max(shift, 0); i < Math.min(this.rows, this.cols + shift); i++) {
  196.       count = (this.board[i][i - shift] == player) ? count+1 : 0;
  197.             if (count >= 4) return true;
  198.     }
  199.                 // Anti-diagonal
  200.     count = 0;
  201.     shift = row + column;
  202.     for (let i = Math.max(shift - this.cols + 1, 0); i < Math.min(this.rows, shift + 1); i++) {
  203.       console.log(i,shift-i,shift)
  204.       count = (this.board[i][shift - i] == player) ? count+1 : 0;
  205.       if (count >= 4) return true;
  206.     }
  207.  
  208.     return false;
  209.         }
  210.  
  211.   // Cette fonction vide le plateau et remet à zéro l\'état
  212.   reset() {
  213.     for (let i = 0; i < this.rows; i++) {
  214.       for (let j = 0; j < this.cols; j++) {
  215.         this.board[i][j] = 0;
  216.       }
  217.     }
  218.                 this.move = 0;
  219.     this.winner = null;
  220.         }
  221. }
  222. const urlParams = new URLSearchParams(window.location.search);
  223. const player1 = urlParams.get(\'player1\');
  224. const player2 = urlParams.get(\'player2\');
  225. // On initialise le plateau et on visualise dans le DOM
  226. // (dans la balise d\'identifiant `game`).
  227. let p4 = new Puissance4(\'#game\', player1, player2);';

Editor

You can edit this paste and save as new:


File Description
  • NSI
  • Paste Code
  • 08 May-2024
  • 7.23 Kb
You can Share it: