@ccueil Colles

Initiation à la programmation, en python

Un deuxième programme, écrit pas à pas: jeu du nombre mystérieux

Y. Morel




Règle du jeu

Le jeu du nombre mystérieux se joue à deux: une personne qui choisit secrètement un nombre entier entre 0 et 100, et une autre personne qui doit le trouver.
La personne qui cherche à deviner propose un nombre; la personne qui fait deviner donne alors une des trois réponses:
  • Gagné: bien sûr si le nombre proposé est le bon
  • trop petit: si le nombre proposé est plus petit que celui à deviner
  • trop grand: si le nombre proposé est plus grand que celui à deviner

Première version

On appelle par exemple M le nombre à faire deviner, par exemple M=37. Le programme suivant est donné à la personne qui cherche à deviner le nombre mystérieux. Celle-ci l'exécute, et entre donc sa proposition.
M=37
N=int(input("Entrer un nombre:"))
if N==M:
    print("Gagné !")
elif N>M:
    print("Trop grand")
else:
    print("Trop petit")
L'instruction elif est la contraction de else et if: "sinon, si", et permet d'ajouter une condition (voir les structures algorithmiques de base).
La personne qui cherche à deviner exécute ce programme, elle ne voit donc pas la valeur de M qu'on ne demande pas d'afficher. Le programme prend alors la place du joueur qui fait deviner et retourne la réponse adaptée: "gagné", "trop petit" ou "trop grand".
Le programme s'arrête alors à ce stade, et la personne qui cherche à deviner peut ensuite relancer autant de fois que nécessaire le programme jusqu'à gagner.

Nombre de coups fixé à l'avance

On peut automatiser le fait d'avoir à relancer le programme. Ajoutons pour le moment la règle suivante: on fixe le nombre maximum de tentatives à 5; si après 5 propositions le nombre mystère n'est pas trouvé, la partie est perdue.
Le programme devient:
M=37
N=int(input("Entrer un nombre:"))
for i in range(1,5):
    if N==M:
        print("Gagné !")
        print("nombre de coups:",i)
        quit()
    elif N>M:
        print("Trop grand")
    else:
        print("Trop petit")
    N=int(input("Entrer un nombre:"))
print("Perdu en 5 coups")
Avant de quitter, en cas de victoire, on affiche le nombre de coups utilisés, c'est-à-dire le numéro i de l'itération.

Sans limite

On peut enfin laisser libre le nombre de coups. Dans ce cas, on n'utilise pas une boucle avec un nombre prédéfini d'itération, mais une boucle "tant que" (while(*)):
M=37
N=int(input("Entrer un nombre:"))
while not(N==M):
    if N>M:
        print("Trop grand")
    else:
        print("Trop petit")
    N=int(input("Entrer un nombre:"))

print("Gagné !")


Sans limite, et décompte du nombre de coups

Au contraire du programme avec un nombre de coups fixé à l'avance, on ne connaît pas dans le programme précédent le nombre d'itérations effectuées.
Il reste à ajouter ce compteur. Ceci se fait très classiquement ainsi: on utilise une variable, c par exemple, qu'on initialise à 0, puis à chaque passage on ajoute 1 à c ainsi:
c=c+1
On dit qu'on incrémente la variable c.
Notre programme est donc complété ainsi:
M=37
N=int(input("Entrer un nombre:"))
c=1
while not(N==M):
    if N>M:
        print("Trop grand")
    else:
        print("Trop petit")
    N=int(input("Entrer un nombre:"))
    c=c+1

print("Gagné !")
print("nombre de coups:",c)

Joueur seul, contre l'ordinateur

Enfin, jusqu'ici, un joueur fait deviner son nombre (37 jusque là) à un autre joueur par le biais d'un programme.
Il n'y a plus qu'un pas pour que l'ordinateur devienne complètement le joueur qui fait deviner: il doit choisir lui-même le nombre à faire deviner !
On peut par exemple lui demander de tirer ce nombre au hasard: il faut pour cela importer une bibliothèque(*) permettant de tirer des nombres au hasard, et de s'en servir. La fonction randint(*) retourne alors un nombre entier aléatoire.
from random import randint
M=randint(1,100)
N=int(input("Entrer un nombre:"))
c=1
while not(N==M):
    if N>M:
        print("Trop grand")
    else:
        print("Trop petit")
    N=int(input("Entrer un nombre:"))
    c=c+1
print("Gagné !")
print("nombre de coups:",c)
À vous de jouer maintenant… combien de coups pour trouver le nombre mystérieux ?

Une autre partie ?

On peut maintenant aussi proposer une nouvelle partie. Bien sûr, on ne va pas recopier le programme entier, encore moins plusieurs fois et autant de fois que de nouvelles parties qu'on va proposer.
On ajoute autour de notre programme complet une boucle conditionnelle, dont la condition A=1 est initialement vérifiée (en initialisant simplement A à 1 au tout début). Ensuite, en fin de jeu, on propose une nouvelle partie et l'utilisateur saisit une nouvelle valeur pour A pour laquelle on convient que la valeur 1 siginifie une autre partie (la boucle conditionnelle se relance), tandis que 0 (ou tout autre valeur) met donc fin à la boucle conditionnelle et au programme.

from random import randint
A=1
while A==1:
    M=randint(1,100)
    print(M)
    N=int(input("Entrer un nombre:"))
    c=1
    while not(N==M):
        if N>M:
            print("Trop grand")
        else:
            print("Trop petit")
        N=int(input("Entrer un nombre:"))
        c=c+1
    print("Gagné !")
    print("nombre de coups:",c)
    A=int(input("Une autre partie 1-Oui/ 2-Non ?"))


Variables, affectation, types et opérations



randint
contraction de random, aléatoire, et integer, entier. Le type integer désigne les nombres entiers, ou intègres, non divisés, ni partagés …
while
En français: "tant que", ou "pendant que".
while introduit une boucle conditionnelle, c'est-à-dire un ensemble d'instructions qui vont être répétées tant que la condition indiquée à la suite du while est vraie, c'est-à-dire satisafaite.
Voir les structures algorithmiques de base.
bibliothèque
En anglais (en python donc, et plus généralement en informatique), library.
Une library, ou module, regroupe un ensemble de programmes, fonctions, commandes, qui peuvent être chargés.

Par exemple, la library math permet d'importer des fonctions mathématiques comme pi, sqrt, cos, sin, … , et la library random permet d'importer random(), randint(), gauss(), …

L'ensemble des modules et bibliothèques se trouve ici: https://docs.python.org/3.6/py-modindex.html.