Méthodologie de la programmation
TP II


Dans ce TP nous alons construire un petit jeu du pendu intéractif se jouant dans le terminal.

Exercice 0

Comme vu dans le cours précédent on commence par écrire le scope main qui contiendra l’appel de la première fonction du programme :

if __name__ == "__main__":

Il est de convention d’écrire une fonction, purement esthétique, qui affiche que l’on est bien dans le programme et/ou donne des informations sur celui-ci à l’exécution du programme.
Par exemple :

def infos():
    print("""
            ===============================================
                            Jeu du pendu
            ===============================================
            """)

Exercice 1

Écrire une fonction get_mot() qui demande à l’utilisateur de rentrer un mot à faire deviner, le retourne s’il est une chaîne de caractères valides et recommence dans le cas contaire.

def get_mot():
    """
    pass est une instruction (correspondante au NOP en assembleur) 
    qui ne fait rien.
    Contrairement aux commentaires, pass est évaluée et permet donc 
    d'écrire des fonctions vides bien que syntaxiquement valides.
    Ici bien sûr pass est à remplacer par votre code.
    """
    pass

Exercice 2

Écrire une fonction pendu_run() qui prend en argument le mot retourné par la fonction get_mot() et initialise la partie avec les informations suivantes :

def pendu_run(mot):
    """
    Au début du jeu
        * Initialise la liste des lettres déjà devinées.
        * Initialise le nombre d'essais restant (généralement autour de 10).
        * Informe l'utilisateur de combien de lettres contient le mot à deviner.
        * Informe l'utilisateur de combien d'essais il dispose pour deviner le mot.
    """
    pass

Exercice 3

Le but du jeu est donc de faire deviner le mot choisi au départ de la manière suivante :

La partie s’arrête si le mot est deviné ou si le joueur n’a plus d’essais.

Nous allons donc implémenter ceci dans la fonction pendu_run() :

def pendu_run(mot):
    # Réponse de l'exercice 2
    
    """
    Penser également, à chaque tour du jeu, à :
        * Informer le joueur s'il a fait une erreur ou pas.
        * Informer le joueur du nombre d'essais qui lui restent.
        * Informer le joueur de sa victoire/défaite.
    
    """
    pass

Exercice 4

Écrire la fonction print_mot() qui affiche l’état du mot à faire deviner :

def print_mot(mot, lettres_devinees):
    """
    Affiche le mot à deviner en y révélant les lettres déjà devinées
    et en remplaçant les autres par '_'.
    """
    pass

Insérer cette fonction dans la boucle de la fonction pendu_run() pour que son résultat soit affiché à chaque début de tour.

Exercice 5

Écrire, et insérer dans la boucle de gameplay, la fonction rejouer() qui après la fin d’une partie demande au joueur s’il veut rejouer (et relance une partie si la réponse est positive).

Exercice 6

Modifier la fonction get_mot() pour non plus demander à l’utilisateur un mot à deviner mais pour chercher ce dernier aléatoirement dans une liste de mots établie à l’avance.

"""
Vous pouvez également créer une fonction secondaire qui, 
en fonction d'un paramètre, choisi le générateur de mot voulu.

Par exemple :
""" 

def random_mot_from_list():
    pass

def mot_from_user():
    pass
    
def get_mot(input = 'list'):
    if input == 'user':
        return mot_from_user()
    elif input == 'list':
        return random_mot_from_list()  

Exercice Bonus

Modifier une nouvelle fois la fonction get_mot() pour cette fois-ci aller chercher un mot aléatoirement dans un fichier.

On peut trouver facilement des listes déjà faites de mots, comme par exemple celle-ci.

Conseils


""" 
Renvoie True si tous les caractères de str sont alphanumériques 
et False dans le cas contraire.
"""
str.isalpha()

Documentation du module random : https://docs.python.org/3/library/random.html



Bonus :

Page de la doc Python sur les fichiers : https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files


"""
Cette fonction permet de lire un fichier ligne par ligne. 
Attention cependant, elle retourne la ligne complète ; 
c'est à dire avec son caractère de fin de ligne.
"""
f.readline()

"""
Cette fonction retourne la totalité d'un fichier sous la forme d'une string.
"""
f.read()

"""
Cette fonction permet de découper une string en une liste de ligne, 
sans caractère de retour...
"""
str.splitlines()