Remove hanoi.py
This commit is contained in:
parent
024c292dbf
commit
37e6c39377
1 changed files with 0 additions and 125 deletions
|
@ -1,125 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
"""Jeu de Hanoï pour implémenter des piles"""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
|
||||
def main() -> None:
|
||||
p1 = Pile()
|
||||
p2 = Pile()
|
||||
p3 = Pile()
|
||||
|
||||
p2 = ajout_tous_disques(p2)
|
||||
|
||||
while not partie_finie(p1, p2, p3):
|
||||
affiche_etat_piles(p1, p2, p3)
|
||||
faire_coup(p1, p2, p3)
|
||||
|
||||
print("Bravo, vous avez terminé")
|
||||
|
||||
|
||||
class Pile:
|
||||
"""Une pile composée de maillons"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.val: Optional[int] = None
|
||||
self.suivant: Optional[Pile] = None
|
||||
|
||||
def est_vide(self) -> bool:
|
||||
"""Vérifie si la pile est vide"""
|
||||
|
||||
return self.suivant is None
|
||||
|
||||
def empile(self, nombre: int):
|
||||
"""Empile nombre sur la pile"""
|
||||
|
||||
maillon = Pile()
|
||||
maillon.val = nombre
|
||||
maillon.suivant = self
|
||||
return maillon
|
||||
|
||||
def depile(self):
|
||||
"""Dépile la pile"""
|
||||
|
||||
return self.suivant
|
||||
|
||||
def valeur_top(self) -> Optional[int]:
|
||||
"""Retourne la valeur en haut de la pile sans dépiler"""
|
||||
|
||||
if self.est_vide():
|
||||
return None
|
||||
return self.val
|
||||
|
||||
|
||||
def ajout_tous_disques(pile: Pile) -> Pile:
|
||||
"""Ajoute tous les disques sur p"""
|
||||
|
||||
nombre_disques = int(input("Combien de disques ? "))
|
||||
while nombre_disques >= 1:
|
||||
pile = pile.empile(nombre_disques)
|
||||
nombre_disques -= 1
|
||||
return pile
|
||||
|
||||
|
||||
def partie_finie(p1: Pile, p2: Pile, p3: Pile) -> bool:
|
||||
"""Détermine si la partie est finie"""
|
||||
|
||||
return p2.est_vide() and (p1.est_vide() or p3.est_vide())
|
||||
|
||||
|
||||
def affiche_etat_piles(p1: Pile, p2: Pile, p3: Pile) -> None:
|
||||
"""Afficher l'état des trois piles"""
|
||||
|
||||
print("Pile 1 :")
|
||||
affiche_etat(p1)
|
||||
print("Pile 2 :")
|
||||
affiche_etat(p2)
|
||||
print("Pile 3 :")
|
||||
affiche_etat(p3)
|
||||
|
||||
|
||||
def affiche_etat(pile: Pile) -> None:
|
||||
"""Affiche l'état d'une pile"""
|
||||
|
||||
if pile.est_vide():
|
||||
print("La pile est vide")
|
||||
else:
|
||||
diam = pile.valeur_top()
|
||||
print(f"Le disque en haut de la pile est de diamètre {diam}")
|
||||
|
||||
|
||||
def faire_coup(p1: Pile, p2: Pile, p3: Pile) -> None:
|
||||
"""Demande à l'utilisateur de jouer"""
|
||||
|
||||
num_pile = int(input("Où voulez-vous prendre le disque ? "))
|
||||
pile_a_depiler = selection_pile(p1, p2, p3, num_pile)
|
||||
|
||||
if pile_a_depiler.est_vide():
|
||||
print("Impossible, cette pile est vide")
|
||||
return
|
||||
diam = pile_a_depiler.valeur_top()
|
||||
print(f"Vous avez sélectionné le disque de diamètre {diam}")
|
||||
|
||||
num_pile = int(input("Où voulez-vous poser le disque ? "))
|
||||
pile_ou_empiler = selection_pile(p1, p2, p3, num_pile)
|
||||
|
||||
if not pile_ou_empiler.est_vide() and diam > pile_ou_empiler.valeur_top():
|
||||
print("Coup non autorisé")
|
||||
else:
|
||||
pile_a_depiler = pile_a_depiler.depile()
|
||||
pile_ou_empiler = pile_ou_empiler.empile(diam)
|
||||
|
||||
|
||||
def selection_pile(p1: Pile, p2: Pile, p3: Pile, num_pile: int) -> Pile:
|
||||
"""Retourne la pile correspondant à num_pile"""
|
||||
|
||||
if num_pile == 1:
|
||||
return p1
|
||||
if num_pile == 2:
|
||||
return p2
|
||||
return p3
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue