nsi:jeu:puissance4
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| nsi:jeu:puissance4 [2021/09/04 10:47] – créée goupillwiki | nsi:jeu:puissance4 [2022/12/09 12:14] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 34: | Ligne 34: | ||
| <code python> | <code python> | ||
| """ | """ | ||
| - | module | + | module |
| """ | """ | ||
| Ligne 60: | Ligne 60: | ||
| Voici un exemple. Ici le joueur 1 a les jeton jaunes et le joueur 2 a les jetons rouges. | Voici un exemple. Ici le joueur 1 a les jeton jaunes et le joueur 2 a les jetons rouges. | ||
| + | {{: | ||
| + | <code python> | ||
| + | # tableau correspondant | ||
| + | [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] | ||
| + | </ | ||
| + | //Bien que j'ai noté ce tableau sur plusieurs lignes, il s'agit bien d'un tableau à une dimension puisqu' | ||
| + | <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] | ||
| + | </ | ||
| + | === Créer une grille vide === | ||
| + | <code python linenums: | ||
| + | def make_empty_grid() -> list: | ||
| + | """ | ||
| + | Renvoie un tableau de LIGNES * COLS cases et ne contenant que des 0 | ||
| + | """ | ||
| + | # à vous de compléter | ||
| + | </ | ||
| + | |||
| + | === Lire le contenu d'une case d'une grille donnée === | ||
| + | |||
| + | <code python linenums: | ||
| + | def read(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | lig: entier dans [0;LIGNES[, indice de ligne | ||
| + | col: entier dans [0;COLS[, indice de colonne | ||
| + | Renvoie le contenu de grid correspondant à la ligne lig et colonne col | ||
| + | """ | ||
| + | assert 0 <= lig < LIGNES | ||
| + | assert 0 <= col < COLS | ||
| + | assert len(grid) == LIGNES * COLS | ||
| + | return # Complétez ! | ||
| + | </ | ||
| + | |||
| + | === Afficher une grille === | ||
| + | |||
| + | Il pourra être utile de donner une version lisible du contenu de la grille. | ||
| + | Je propose la solution suivante. | ||
| + | |||
| + | <code python linenums: | ||
| + | SYMBOLS = " OX" # symboles pour les différents joueurs. | ||
| + | # SYMBOLS[0] correspond à une case vide. | ||
| + | |||
| + | def grid_to_str(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | renvoie une version texte de la grille. | ||
| + | """ | ||
| + | # création d'une grille avec les symboles au lieu des numéros | ||
| + | symb_grid = [SYMBOLS[joueur] for joueur in grid] | ||
| + | # création d'une grille de ligne | ||
| + | symb_lignes = [" | ||
| + | return " | ||
| + | </ | ||
| + | |||
| + | C'est un peu compliqué. Quelques détails pour les plus curieux : | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | === Vérifier si une colonne est pleine === | ||
| + | |||
| + | Une colonne si la case du haut de cette colonne est occupée. Pour une colonne '' | ||
| + | |||
| + | <code python linenums: | ||
| + | def col_is_full(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | col: indice de la colonne | ||
| + | renvoie True si la colonne est pleine, False sinon | ||
| + | """ | ||
| + | # à vous... | ||
| + | </ | ||
| + | |||
| + | === Vérifier si la grille est pleine === | ||
| + | |||
| + | Il faut vérifier chaque colonne. Si au moins une n'est pas pleine, c'est que la grille n'est pas pleine. | ||
| + | |||
| + | <code python linenums: | ||
| + | def grid_is_full(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | renvoie True si la grille est pleine, False sinon | ||
| + | """ | ||
| + | # à vous... | ||
| + | </ | ||
| + | |||
| + | === insérer jeton === | ||
| + | |||
| + | Ajoute un jeton du joueur donné dans la plus haute case libre de la colonne. | ||
| + | |||
| + | <code python linenums: | ||
| + | def insert(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | col: indice de la colonne | ||
| + | player: numéro du joueur | ||
| + | """ | ||
| + | assert not col_is_full(grid, | ||
| + | # À vous ! | ||
| + | </ | ||
| + | |||
| + | === Vérifier un alignement === | ||
| + | |||
| + | Cette partie est plus difficile. L' | ||
| + | |||
| + | * On choisit une orientation -- diagonale ↘, diagonale ↗, verticale, horizontale | ||
| + | * On choisit un point de départ, par exemple le coin supérieur gauche | ||
| + | * On parcourt cet alignement du point de départ jusqu' | ||
| + | |||
| + | <code lang-none> | ||
| + | FONCTION get_line | ||
| + | ENTRÉES | ||
| + | grille | ||
| + | pas: déplacement à faire d'un case à l' | ||
| + | depart: position de départ | ||
| + | SORTIE: une chaîne de caractères line valeurs de l' | ||
| + | DÉBUT | ||
| + | soit position en cours définie par la position de depart | ||
| + | soit line une chaine vide | ||
| + | TANT QUE position en cours à l' | ||
| + | lire le contenu de la grille en position, | ||
| + | ajouter ce qui a été lu au bout de line | ||
| + | modifier position selon le pas | ||
| + | FIN | ||
| + | RENVOYER line | ||
| + | FIN | ||
| + | </ | ||
| + | |||
| + | //Exemple :// | ||
| + | <code lang-none> | ||
| + | 0000000 | ||
| + | 0000000 | ||
| + | 0010000 | ||
| + | 0022200 | ||
| + | 0012120 | ||
| + | 1121211 | ||
| + | </ | ||
| + | Si on se donne '' | ||
| + | |||
| + | Exemple d' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | 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: | ||
| + | ''' | ||
| + | line: chaîne représentant un alignement. ex : " | ||
| + | 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 | ||
| + | ''' | ||
| + | </ | ||
| + | |||
| + | Et maintenant vous pouvez envisager une fonction qui parcours toutes les lignes possibles à la recherche d'une victoire. | ||
| + | |||
| + | <code python linenums: | ||
| + | def grid_has_victory(grid: | ||
| + | """ | ||
| + | grid: grille de jeu | ||
| + | renvoie True si un alignement gagnant a été trouvé, False sinon | ||
| + | """ | ||
| + | # À vous ! | ||
| + | </ | ||
| + | |||
| + | === Fichier complet === | ||
| + | |||
| + | À placer dans un fichier '' | ||
| + | |||
| + | <code python linenums> | ||
| + | """ | ||
| + | module fonctionspuissance4 | ||
| + | """ | ||
| + | |||
| + | COLS = 7 # Nombre de colonnes de la grille | ||
| + | LIGNES = 6 # Nombre de lignes de la grille | ||
| + | TO_WIN = 4 # Nombre de jetons à aligner pour gagner | ||
| + | |||
| + | def make_empty_grid() -> list: | ||
| + | """ | ||
| + | Renvoie un tableau de LIGNES * COLS cases et ne contenant que des 0 | ||
| + | """ | ||
| + | # à vous de compléter | ||
| + | | ||
| + | def read(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | lig: entier dans [0;LIGNES[, indice de ligne | ||
| + | col: entier dans [0;COLS[, indice de colonne | ||
| + | Renvoie le contenu de grid correspondant à la ligne lig et colonne col | ||
| + | """ | ||
| + | assert 0 <= lig < LIGNES | ||
| + | assert 0 <= col < COLS | ||
| + | assert len(grid) == LIGNES * COLS | ||
| + | return # Complétez ! | ||
| + | |||
| + | SYMBOLS = " OX" # symboles pour les différents joueurs. | ||
| + | # SYMBOLS[0] correspond à une case vide. | ||
| + | |||
| + | def grid_to_str(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | renvoie une version texte de la grille. | ||
| + | """ | ||
| + | # création d'une grille avec les symboles au lieu des numéros | ||
| + | symb_grid = [SYMBOLS[joueur] for joueur in grid] | ||
| + | # création d'une grille de ligne | ||
| + | symb_lignes = [" | ||
| + | return " | ||
| + | |||
| + | def col_is_full(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | col: indice de la colonne | ||
| + | renvoie True si la colonne est pleine, False sinon | ||
| + | """ | ||
| + | # à vous... | ||
| + | |||
| + | def grid_is_full(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | renvoie True si la grille est pleine, False sinon | ||
| + | """ | ||
| + | # à vous... | ||
| + | |||
| + | def insert(grid: | ||
| + | """ | ||
| + | grid: tableau de LIGNES * COLS éléments | ||
| + | col: indice de la colonne | ||
| + | player: numéro du joueur | ||
| + | """ | ||
| + | assert not col_is_full(grid, | ||
| + | # À vous ! | ||
| + | |||
| + | def get_line(grid: | ||
| + | """ | ||
| + | grid: grille de jeu | ||
| + | step: paire (step_lig, | ||
| + | start: paire (start_lig, start_col) indiquant la position de départ | ||
| + | renvoie une chaîne correspondant à l' | ||
| + | """ | ||
| + | # À vous ! | ||
| + | |||
| + | def line_has_victory(line: | ||
| + | ''' | ||
| + | line: chaîne représentant un alignement. ex : " | ||
| + | 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: | ||
| + | """ | ||
| + | grid: grille de jeu | ||
| + | renvoie True si un alignement gagnant a été trouvé, False sinon | ||
| + | """ | ||
| + | # À vous ! | ||
| + | </ | ||
| + | |||
| + | ==== Fichier principal ==== | ||
| + | |||
| + | Il faut importer les fonctions définies précédemment. | ||
| + | |||
| + | <code python linenums> | ||
| + | # main.py | ||
| + | |||
| + | from fonctionspuissance4 import * | ||
| + | </ | ||
| + | |||
| + | Ensuite le jeu suit l' | ||
| + | |||
| + | <code lang-none> | ||
| + | DÉBUT | ||
| + | créer une grille vide | ||
| + | afficher la grille | ||
| + | joueur en cours est 1 | ||
| + | partie_finie est faux | ||
| + | TANT QUE partie finie est faux RÉPÉTER | ||
| + | demander au joueur en quelle colonne il souhaite jouer | ||
| + | jouer le coup pour le joueur en cours | ||
| + | afficher la grille | ||
| + | SI la grille contient une victoire ALORS | ||
| + | partie_finie passe à vrai | ||
| + | afficher un message indiquant la victoire du joueur | ||
| + | SINON SI la grille est pleine ALORS | ||
| + | partie_finie passe à vrai | ||
| + | afficher un message indiquant le match nul | ||
| + | SINON | ||
| + | changer de joueur | ||
| + | FIN | ||
| + | FIN | ||
| + | FIN | ||
| + | </ | ||
| - | # **Important :** plutôt que d' | + | À vous de compléter |
nsi/jeu/puissance4.1630745254.txt.gz · Dernière modification : de goupillwiki
