Algo. et prog. 2 en
Logo de Python
Arnaud COUTURIER - Python 3.10

✏️ TP 5 - Prog. objets niv.3

Ce TP est la suite directe du TP 4.

Question 1

On va créer un terrain, dans lequel les personnages seront visibles, et pourront se déplacer. Un terrain sera représenté visuellement dans la console comme un tableau de caractères à deux dimensions, et on affichera sur chaque case le caractère "·" là où il n'y a aucun personnage, ou un autre caractère là où se situera le personnage du joueur.

Cela se fera grâce à une classe Terrain, donc créer la classe et grâce à son constructeur chaque instance de Terrain devra avoir les attributs taille_x et taille_y, qui décrivent la taille du terrain en nombre de cases sur x et y.

Pour commencer un terrain ne contiendra qu'un seul perso, donc ajouter un attribut perso qui permet au terrain de savoir quel perso il contient.

Ces 3 attributs doivent être spécifiés lors de la création de chaque terrain, donc leur valeur initiale doit être spécifiée en paramètre du constructeur.

Question 2

Il nous faut augmenter les capacités de chaque Personnage, pour qu'ils puissent avoir une position x et y. Donc ajouter pour chaque perso un attribut position, qui est une liste de deux int: le premier est la position du perso sur x, le second sur y. Ajouter le ou les paramètres au constructeur de Personnage pour pouvoir spécifier la position initiale.

On veut aussi donner à chaque personnage la capacité de se dessiner. Pour cela chaque perso retient simplement un caractère qui le représente. Ce caractère sera dans l'attribut caractère_apparence, et sa valeur initiale doit être passée en paramètre du constructeur, pour qu'on puisse spécifier le caractère de chaque perso au moment de leur création.

Question 3

Dans la classe Terrain, ajouter une méthode dessiner, qui affiche le terrain dans la console. Elle ne prend aucun paramètre.

Chaque ligne du terrain (qui est comme un tableau à 2 dimensions) doit être représentée par une ligne de texte dans la console. Ainsi vous devez afficher le tableau case par case sur la même ligne, puis ligne par ligne, jusqu'à ce que toutes les lignes soient afichées.

Pour chaque case, si elle est vide, c'est à dire si le personnage du terrain ne s'y trouve pas, le caractère "·" doit être affiché. Si la case contient le personnage du terrain, alors le caractère spécifique du perso doit être affiché.

Instanciez un Personnage, un Terrain, et essayer de l'afficher correctement par sa méthode dessiner().

Voici ce que vous devriez voir pour un terrain de 15 sur x par 10 sur y, et son perso à la position x=2 et y=1 et qui a pour caractère "@":


· · · · · · · · · · · · · · ·
· · @ · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · ·

Remarquez que pour x on va de gauche à droite, mais pour y on va du haut vers le bas. y=0 est la première ligne en haut.

Dans la console, les lignes sont bien plus hautes que la largeur d'un caractère, ce qui risque de donner un aspect "écrasé" horizontalement à votre terrain. Pour contre-balancer ça, ajoutez un caractère espace après le caractère de chaque case (y compri celle où se trouve le perso), comme dans l'exemple montré.

Question 4

On va permettre au joueur de déplacer son perso sur le terrain. Pour cela on va lui afficher le terrain, puis lui demander d'entrer au clavier quelle action il / elle veut faire, et ainsi jusqu'à ce que l'utilisateur décide d'arrêter. Cela doit se faire dans la méthode démarrer (qui ne prend aucun paramètre), d'une nouvelle classe Jeu.

Pour quitter il faudra entrer "qq" (deux fois la lettre q).

Pour se déplacer ça sera:

  • "z" pour aller vers le HAUT visuellement dans la console
  • "s" pour aller vers le BAS visuellement dans la console
  • "q" pour aller vers la GAUCHE visuellement dans la console
  • "d" pour aller vers la DROITE visuellement dans la console

Chaque instance de Jeu doit avoir deux attributs:

  1. terrain, qui est l'instance de Terrain dans lequel le jeu se déroule. La valeur initiale doit être passée en paramètre du constructeur.
  2. perso_heros, qui est l'instance de Personnage que le joueur humain contrôle par le clavier. La valeur initiale doit aussi être passée en paramètre du constructeur.

Sous l'affichage du terrain, avant de laisser l'utilisateur entrer son choix, afficher la salutation de son perso. On veut que le perso donne sa position lorsqu'il salue, donc modifier la méthode saluer() de la classe Personnage pour avoir quelque chose du genre:


Bonjour, je suis Toto: vie= 100/100. Position=(0,0)

Créer une instance de Jeu, et le démarrer. Vous devriez avoir un résultat comme celui-ci:

Question 5

Le fait que l'affichage s'ajoute toujours en bas de la console, et que l'ancien affichage reste visible n'est pas pratique. Ce qu'on voudrait c'est que le terrain reste "fixe" visuellement dans la console, ça serait plus facile à regarder.

Pour ça il existe une commande au niveau du système d'exploitation qui permet de "nettoyer" la console, c'est à dire effacer tout ce qui est visible. Cette commande est "clear" pour Linux, et "cls" pour Windows. Replit tourne avec Linux. Allez dans le "Shell" (dans replit, l'onglet à côté de "Console") et appuyez simplement plusieurs fois sur la touche "Entrée" pour sauter des lignes. Ensuite entrez la commande clear et voyez que tout est effacé.

On peut appeler une commande du système d'exploitation depuis Python grâce à la fonction system du module os. Cette fonction prend un paramètre de type str, qui est le nom de la commande système à exécuter. Le module os est appelé ainsi pour "Operating System", système d'exploitation en anglais, et il fait partie de la bibliothèque standard de Python.

Appelez "clear" au bon endroit de votre code pour obtenir ceci: