Affichage simple⚓︎
Améliorer l'affichage
L'affichage actuel est minimaliste. Nous allons créer de nouvelles fonctions permettant d'avoir un affichage plus lisible.
Pour cela, il va falloir transformer le plateau en une matrice, c'est-à-dire un tableau de tableaux. Chaque sous-tableau correspond à une pile, le fond étant à gauche et le sommet à droite.
Chaque sous-tableau a autant de valeurs qu'il y a de disques. Lorsqu'il n'y a pas tous les disques sur une pile, les emplacements vides sont représentés par des 0
.
Par exemple, la matrice ci-dessous correspond à ce plateau.
tab = [[5, 2, 0, 0, 0],
[4, 3, 1, 0, 0],
[0, 0, 0, 0, 0]]
Exercice 8
Compléter le code de la fonction pile_vers_tableau
qui prend en paramètres une pile pile
et un entier n
, et qui renvoie un tableau de n
valeurs correspondant à la pile.
>>> pile = pile_vide()
>>> empile(pile, 4)
>>> empile(pile, 3)
>>> empile(pile, 1)
>>> pile_vers_tableau(pile, 5)
[4, 3, 1, 0, 0]
Exercice 9
Compléter le code de la fonction plateau_vers_matrice
qui prend en paramètre un plateau et renvoie la matrice correspondant.
Indice
Le nombre de disques correspond à la somme des tailles des piles.
>>> plateau = nouvelle_partie(5)
>>> deplace_1_disque(plateau[0], plateau[1])
>>> deplace_1_disque(plateau[0], plateau[2])
>>> print(plateau)
3/4/5 1 2
>>> plateau_vers_matrice(plateau)
[[5, 4, 3, 0, 0], [1, 0, 0, 0, 0], [2, 0, 0, 0, 0]]
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 10
Compléter le code de la fonction affiche_matrice
qui prend en paramètre une matrice et qui affiche les piles correspndant à cette matrice. Les 0
sont remplacés par des |
et les autres nombres sont affichés.
>>> matrice = [[5, 4, 3, 0, 0], [1, 0, 0, 0, 0], [2, 0, 0, 0, 0]]
>>> affiche_matrice(matrice)
| | |
| | |
3 | |
4 | |
5 1 2
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 11
Compléter le code de la fonction affiche_plateau
qui prend en paramètre un plateau et qui affiche le plateau. Il faut utiliser les fonctions précédentes.
>>> plateau = nouvelle_partie(5)
>>> deplace_1_disque(plateau[0], plateau[1])
>>> deplace_1_disque(plateau[0], plateau[2])
>>> afiche_plateau(plateau)
| | |
| | |
3 | |
4 | |
5 1 2
=======
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 12 (bonus)
En modifiant certaines des fonctions précédentes, rajouter un affichage à chaque déplacement de disque sur le plateau.
Si vous avez besoin de retrouver le plateau à partir d'une pile, vous pouvez utiliser la fonction plateau_de
qui est déjà définie et qui est telle que plateau_de(pile)
qui renvoie le plateau sur lequel se trouve pile
.
Il peut être intéressant de sauter une ligne avant d'afficher le plateau. Vous pouvez le faire en rajoutant l'instruction print()
au bon endroit.
Vous pouvez également rajouter une pause avec l'instruction sleep(0.5)
. La valeur correspond à la durée de la pause, en secondes.
>>> plateau = nouvelle_partie(2)
>>> resolution(plateau)
1 | |
2 | |
=======
| | |
2 1 |
=======
| | |
| 1 2
=======
| | 1
| | 2
=======
Exercice 13 (bonus)
Écrire une fonction affichage_complexe
qui prend en paramètre une matrice et qui l'affiche de la manière suivante :
>>> affichage_complexe([[5, 4, 3, 2, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
=== | |
===== | |
======= | |
========= | |
=========== | |
>>> affichage_complexe([[5, 4, 0, 0, 0], [3, 2, 0, 0, 0], [1, 0, 0, 0, 0]])
| | |
| | |
| | |
========= ===== |
=========== ======= ===
Le disque de taille k
est représenté par une chaîne de 2k
+1 symboles '='
. Chaque pile occupe 2n
+1 colonnes, avec n
le nombre total de disques. Les parties des tiges sans disques sont toujours représentées par '|'
.
Vous pouvez écrire des fonctions supplémentaires pour vous aider.
# Tests
(insensible à la casse)(Ctrl+I)