Aller au contenu

TP - Exercices pour aller plus loin

Exercice n°1 : Chasse au trésor (2)

Cet exercice est la suite de celui-ci !

Pour cette deuxième partie, le programme doit :

  1. reprendre les éléments de la partie précédente.
  2. faire en sorte que l'utilisateur ne puisse pas faire de proposition en-dehors des indices possibles.
  3. faire jouer l'utilisateur jusqu'à ce que celui-ci découvre l'indice d'emplacement du trésor. Il faudra faire appel à une (ou plusieurs) fonction(s).
  4. afficher le nombre de coups qu'il a fallu au joueur pour déterminer cet emplacement (et afficher la liste pour vérification).

On redonne ci-dessous le programme trouvé lors de la partie précédente :

##----- Importation des Modules -----##
from random import *

##----- Programme principal -----##
n = int(input("Entrez la valeur d'un entier : "))
liste = [0]*n                       # Liste de n zéros

indice = randint(0, n-1)            # Indice de "1" dans la liste
liste[indice] = 1

prop = int(input("Donner un indice entre {} et {} : ".format(0, n-1)))
if prop == indice:
    print('Bravo !')
elif prop > indice:
    print('Cherche a gauche')
else:
    print('Cherche a droite')

print(liste)                        # Vérification
Une piste ?

Il faut créer une première fonction pour vérifier que la proposition de l'utilisateur ne sort pas de la liste.

Une autre piste ?

Une seconde fonction paraît nécessaire (mais n'est pas indispensable) pour la réponse du programme à la proposition de l'utilisateur.

Exercice n°2 : Chasse au trésor (3)

Puisque le joueur doit indiquer dans quelle case il cherche, il faudra qu'un affichage correct du plateau de jeu lui permette de visualiser les numéros des lignes et des colonnes.

Voici l'affichage attendu après exécution du programme à ce stade :

[' ', '1', '2', '3', '4', '5', '6', '7', '8', '9']
['1', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['2', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['3', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['4', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', ' ']
['5', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['6', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['7', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['8', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['9', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']

Les conventions d'affichages et le travail demandé sont :

  1. Concevoir le plateau comme une liste de 10 listes ayant chacune 10 éléments ;
  2. Pour que l'affichage final soit plus agréable, les éléments seront forcément des caractères uniques :
    • Les caractères de '1' à '9' indique le numéro de ligne et/ou de colonne d'une case ;
    • Le caractère espace ' ' indique une case vide non encore visitée par le joueur ;
    • Le caractère 'X' représente l'emplacement du trésor. Dans la version finale du programme, le trésor n'apparaîtra plus mais, pour vérifier le bon fonctionnement du programme à chaque nouvelle étape, il est utile de le visualiser pour l'instant ;
    • Enfin, le caractère '0' représentera les cases déjà visitées par l'utilisateur (à voir dans une prochaine étape).
      Insérez les numéros de lignes et de colonnes dans la première ligne et la première colonne puis remplissez toutes les autres cases par des caractères espace ' '.
  3. Placez aléatoirement le caractère 'X' qui représente le trésor dans le plateau.
Une piste ?

Commencez par créer un plateau vide, remplit de caractères espaces ' ' et sans faire de copier/coller inutile.

En ce qui concerne l'affichage, il faut le réaliser ligne par ligne, c'est-à-dire liste par liste...

Une autre piste ?

Pour compléter la première ligne et la première colonne, il peut être utile d'utiliser la fonction de conversion de type str().

Le plateau ?

Il existe plusieurs moyens pour générer le plateau. Voici un nouvel exemple d'automatisation par rapport à d'autres solutions déjà données :

##----- Variables et constantes -----##
taille = 10                         # Plateau carré de taille lignes et taille colonnes
plateau = []
for i in range(taille):
    ligne = [' ']*taille
    plateau.append(ligne)
Le trésor ?

On importe le module random et on génère les coordonnées du trésor sous la forme d'une liste :

##----- Importation des Modules -----##
from random import *

##----- Variables et constantes -----##
ligne_tresor = randint(1, taille-1)
col_tresor = randint(1, taille-1)

Exercice n°3 : Chasse au trésor (4)

On rappelle : un trésor est caché dans le plateau de jeu et l'utilisateur donne un couple de coordonnées [ligne, colonne] afin de découvrir où se cache le trésor. Le programme doit vérifier que la proposition est valide puis afficher la case correspondante sous forme du caractère 'O' dans la grille.

Concevoir une fonction demander() qui répond à ce principe.

Une piste ?

Pour chaque coordonnée saisie, il faut vérifier qu'elle se situe bien entre deux valeurs autorisée. La fonction demander() doit donc nécessiter deux arguments.

Une autre piste ?

Grâce à la fonction demander(), on vérifie que la première coordonnée est correcte, puis on recommence pour la seconde coordonnée. Enfin, l'affichage de cette position dans la grille sera assuré par le programme principal.

Exercice n°4 : Chasse au trésor (5)

On récapitule : un trésor est caché dans le plateau de jeu et l'utilisateur donne un couple de coordonnées [ligne, colonne] afin de découvrir où se cache le trésor. Le programme doit lui répondre droite si le trésor est à droite de cette proposition, gauche s'il est à gauche, haut si le trésor se trouve au-dessus et bas pour en-dessous, en accolant éventuellement deux de ces informations.

Concevoir une fonction position() qui répond à ce principe. Bien évidemment, la fonction renvoie 'Bravo !' dans le cas où le trésor est découvert.

Une piste ?

Concevoir d'un coup et en totalité cette fonction risque d'être difficile. Au lieu de traiter les quatre positions en une fois, pourquoi ne pas commencer par vérifier les positions gauche et droite ?

Pour cela, on peut définir une fonction gauche_droite() en raisonnant sur les colonnes, c'est-à-dire sur la seconde coordonnée.

Quels sont les numéros de colonnes possibles pour que le trésor se situe à gauche de la proposition du joueur ? et à droite ?

Une étape ?
##----- Définition des Fonctions -----##
def gauche_droite(col_jouee, col_tresor):
    """ Entrees : col_jouee est l'ordonnee a tester, col_tresor est celle du tresor
        Sorties : renvoie une chaine de caracteres qui indique la position en colonne """
    if col_jouee < col_tresor:
        return ' a droite'
    elif col_jouee > col_tresor:
        return ' a gauche'
    else:
        return ''

##----- Programme principal -----##
print('Le tresor est a {}'.format(gauche_droite(colonne, col_tresor)))

Exercice n°5 : Chasse au trésor (6)

Il ne reste qu'à mettre les éléments ensemble. Le joueur doit faire des propositions jusqu'à découvrir le trésor. Lorsqu'il l'obtient, il est content. Bien évidemment, le trésor reste affiché dans la grille pour tester le fonctionnement du programme. On masquera ensuite le 'X' pour obtenir un jeu fonctionnel.

On n'oublie pas non plus l'affichage du score...

Une piste ?

On définit une nouvelle fonction qui reprend une grande partie du programme principal tant que...

Une autre piste ?

Si vous avez besoin d'une autre piste maintenant, c'est que vous n'avez pas travaillé assez consciencieusement dans les étapes précédentes. Recommencez-les !