Outils pour utilisateurs

Outils du site


nsi:jeu:puissance4

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:jeu:puissance4 [2022/12/08 12:41] goupillwikinsi:jeu:puissance4 [2022/12/09 12:14] (Version actuelle) goupillwiki
Ligne 73: Ligne 73:
  
 //Bien que j'ai noté ce tableau sur plusieurs lignes, il s'agit bien d'un tableau à une dimension puisqu'il n'y a qu'une paire de crochets.// //Bien que j'ai noté ce tableau sur plusieurs lignes, il s'agit bien d'un tableau à une dimension puisqu'il n'y a qu'une paire de crochets.//
 +
 +<code python>
 +# c'est exactement le même tableau du point de vue de Python :
 +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 1, 2, 2, 1, 0, 0, 2, 1, 1, 1, 2, 2, 0]
 +</code>
  
 === Créer une grille vide === === Créer une grille vide ===
Ligne 109: Ligne 114:
 # SYMBOLS[0] correspond à une case vide. # SYMBOLS[0] correspond à une case vide.
  
-def display(grid:list):+def grid_to_str(grid:list) -> str:
     """     """
     grid: tableau de LIGNES * COLS éléments     grid: tableau de LIGNES * COLS éléments
-    affiche la grille en mode texte dans la console.+    renvoie une version texte de la grille.
     """     """
     # création d'une grille avec les symboles au lieu des numéros     # création d'une grille avec les symboles au lieu des numéros
Ligne 171: Ligne 176:
 </code>     </code>    
  
-=== Vérifier une victoire ===+=== Vérifier un alignement ===
  
-Cette partie est plus difficile. L'humain reconnaît d'un coup dœil la présence ou l'absence d'alignement. Je vous propose l'approche suivante :+Cette partie est plus difficile. L'humain reconnaît d'un coup d'œil la présence ou l'absence d'alignement. Je vous propose l'approche suivante :
  
   * On choisit une orientation -- diagonale ↘, diagonale ↗, verticale, horizontale   * On choisit une orientation -- diagonale ↘, diagonale ↗, verticale, horizontale
   * On choisit un point de départ, par exemple le coin supérieur gauche   * On choisit un point de départ, par exemple le coin supérieur gauche
-  * On parcours la grille depuis ce point de départ dans la direction donnée et on compte les symboles rencontrés. Pour cela, on mémorise le contenu de la case précédente et quand la nouvelle case est identique on ajoute 1 à un compteurComme on ne veut pas compter les cases vides, on n'ajoute 1 que si la nouvelle case n'est pas une case vide. +  * On parcourt cet alignement du point de départ jusqu'à atteindre un bordOn relève les valeurs rencontrées.
-  * Quand on en rencontre une quantité suffisante pour faire un alignement on répond que la fonction a trouvé un alignement. +
-  * Si on atteint un bord sans trouver d'alignement, la fonction répond qu'elle n'a pas trouvé d'alignement. +
- +
-Voici un algorithme possible+
  
 <code lang-none> <code lang-none>
 +FONCTION get_line
 ENTRÉES ENTRÉES
     grille     grille
     pas: déplacement à faire d'un case à l'autre     pas: déplacement à faire d'un case à l'autre
-    départ: position de départ+    depart: position de départ 
 +SORTIE: une chaîne de caractères line valeurs de l'alignement
 DÉBUT DÉBUT
-    soit position en cours définie par la position de départ +    soit position en cours définie par la position de depart 
-    soit 0 le contenu en cours +    soit line une chaine vide
-    soit 0 la valeur du compteur+
     TANT QUE position en cours à l'intérieur de la grille RÉPÉTER     TANT QUE position en cours à l'intérieur de la grille RÉPÉTER
-        soit j le contenu de la grille à la position en cours +        lire le contenu de la grille en position, 
-        SI j == 0 ALORS +        ajouter ce qui a été lu au bout de line 
-            mettre compteur à 0 et contenu en cours à 0 +        modifier position selon le pas
-        SINON SI j == contenu en cours ALORS +
-            augmenter le compteur de 1 +
-        SINON +
-            contenu en cours devient égal à j +
-            Le compteur passe à 1 +
-        FIN +
-        SI compteur >= quantité nécessaire pour gagner ALORS +
-            RENVOYER VRAI +
-        FIN +
-        changer la position courante selon le pas+
     FIN     FIN
-    RENVOYER FAUX+    RENVOYER line
 FIN FIN
 </code> </code>
-     
-Traduisez cet algorithme en fonction. 
  
-<code python linenums:65> +//Exemple :// 
-def line_has_victory(grid:list, step:tuple, start:tuple) -> bool: +<code lang-none
-    """ +0000000 
-    grid: grille de jeu +0000000 
-    step: paire (step_lig,step_col) indiquant le déplacement d'une case à la suivante +0010000 
-    start: paire (start_lig, start_col) indiquant la position de départ +0022200 
-    renvoie True si un alignement gagnant a été trouvé, False sinon +0012120 
-    """ +1121211
-    # À vous !+
 </code> </code>
-    +Si on se donne ''depart= (0,0)'', cela désigne le coin supérieur gauche. ''pas = (1,1)'' fait se déplacer en diagonale ↘. L'appel ''get_line(grille, pas, depart)'' doit renvoyer ''%%"001211"%%''
 Exemple d'utilisation : Exemple d'utilisation :
-  * ''%%line_has_victory(grid, (1,1), (0,0))%%'' recherche une victoire dans la diagonale ↘ partant du coin supérieur droit, +  * ''%%get_line(grid, (1,1), (0,0))%%'' renvoie la diagonale ↘ partant du coin supérieur droit, 
-  * ''%%line_has_victory(grid, (1,1), (0,1))%%'' recherche une victoire dans la diagonale ↘ partant de la deuxième case de la première ligne, +  * ''%%get_line(grid, (1,1), (0,1))%%'' renvoie la diagonale ↘ partant de la deuxième case de la première ligne, 
-  * ''%%line_has_victory(grid, (-1,1), (0,3))%%'' recherche une victoire dans la diagonale ↙ partant de la quatrième case de la première ligne, +  * ''%%get_line(grid, (-1,1), (0,3))%%'' renvoie la diagonale ↙ partant de la quatrième case de la première ligne, 
-  * ''%%line_has_victory(grid, (0,1), (0,3))%%'' recherche une victoire dans la colonne partant de la quatrième case de la première ligne, +  * ''%%get_line(grid, (0,1), (0,3))%%'' renvoie la colonne partant de la quatrième case de la première ligne, 
-  * ''%%line_has_victory(grid, (1,0), (2,0))%%'' recherche une victoire dans la troisième ligne.+  * ''%%get_line(grid, (1,0), (2,0))%%'' renvoie la troisième ligne. 
 + 
 +On ajoute une deuxième fonction pour compter le nombre max de répétitions d'un symbole : 
 + 
 +<code python> 
 +def line_has_victory(line:str, valeur:int) -> bool: 
 +    ''' 
 +    line: chaîne représentant un alignement. ex : "012111" 
 +    valeur: valeur recherchée. ex : 1 
 +    renvoie True si line contient un alignement assez long 
 +      ex: ici non, il n'y a que 3 fois le 1 à la suite 
 +    ''' 
 +</code>
  
 Et maintenant vous pouvez envisager une fonction qui parcours toutes les lignes possibles à la recherche d'une victoire. Et maintenant vous pouvez envisager une fonction qui parcours toutes les lignes possibles à la recherche d'une victoire.
Ligne 276: Ligne 278:
 # SYMBOLS[0] correspond à une case vide. # SYMBOLS[0] correspond à une case vide.
  
-def display(grid:list):+def grid_to_str(grid:list) -> str:
     """     """
     grid: tableau de LIGNES * COLS éléments     grid: tableau de LIGNES * COLS éléments
-    affiche la grille en mode texte dans la console.+    renvoie une version texte de la grille.
     """     """
     # création d'une grille avec les symboles au lieu des numéros     # création d'une grille avec les symboles au lieu des numéros
Ligne 311: Ligne 313:
     # À vous !     # À vous !
  
-def line_has_victory(grid:list, step:tuple, start:tuple) -> bool:+def get_line(grid:list, step:tuple, start:tuple) -> str:
     """     """
     grid: grille de jeu     grid: grille de jeu
     step: paire (step_lig,step_col) indiquant le déplacement d'une case à la suivante     step: paire (step_lig,step_col) indiquant le déplacement d'une case à la suivante
     start: paire (start_lig, start_col) indiquant la position de départ     start: paire (start_lig, start_col) indiquant la position de départ
-    renvoie True si un alignement gagnant a été trouvé, False sinon+    renvoie une chaîne correspondant à l'alignement demandé
     """     """
     # À vous !     # À vous !
 +
 +def line_has_victory(line:str, valeur:int) -> bool:
 +    '''
 +    line: chaîne représentant un alignement. ex : "012111"
 +    valeur: valeur recherchée. ex : 1
 +    renvoie True si line contient un alignement assez long
 +      ex: ici non, il n'y a que 3 fois le 1 à la suite
 +    '''
  
 def grid_has_victory(grid:list) -> bool: def grid_has_victory(grid:list) -> bool:
Ligne 340: Ligne 350:
 Ensuite le jeu suit l'algorithme suivant : Ensuite le jeu suit l'algorithme suivant :
  
-<code lang:none linenums>+<code lang-none>
 DÉBUT DÉBUT
     créer une grille vide     créer une grille vide
Ligne 356: Ligne 366:
             partie_finie passe à vrai             partie_finie passe à vrai
             afficher un message indiquant le match nul             afficher un message indiquant le match nul
 +        SINON
 +            changer de joueur
         FIN         FIN
     FIN     FIN
nsi/jeu/puissance4.1670499698.txt.gz · Dernière modification : de goupillwiki