Mon Labo Python

Utiliser le module random en python pour créer son premier jeu

Module random en Python : premier jeu de plus ou moins codé par une débutante en autodidacte

Un mot souligné en rouge sur l'écran, et aucun message pour dire pourquoi. Ça m'a suffi pour comprendre que ce premier jeu python n'allait pas s'écrire tout seul, même après plusieurs soirées à apprendre seule ce langage. Le hasard, en programmation, ne s'invite pas sans qu'on lui ouvre la porte, et pour une débutante en python comme moi, cette porte porte un nom : le module random.

Petite précision avant d'aller plus loin : certains liens de cet article sont des liens d'affiliation. Si vous cliquez et que vous vous inscrivez à une formation, je touche une petite commission, sans que ça change quoi que ce soit à votre prix. Je ne parle jamais d'un outil que je n'utilise pas vraiment pour apprendre.

Le module random, ou comment sortir Python de son silence

Dans mes notes de la Formation au langage Python, j'avais gribouillé une ligne sur la notion de « module », sans vraiment comprendre à quoi ça servait sur le moment. Le mot me semblait réservé à des gens qui pensaient déjà en ingénieurs, pas à quelqu'un qui apprenait entre deux tâches du soir.

Python tout seul, c'est le sel et le poivre : de quoi cuisiner l'essentiel, jamais de quoi surprendre personne. Le module random ajoute l'épice qu'on ne trouve pas dans le tiroir du bas, celle qui change complètement le résultat d'un script.

Importer un module a longtemps sonné comme une opération risquée, alors qu'import random ne fait qu'ouvrir une porte vers une boîte à outils déjà installée avec Python - c'est tout le principe des modules, qui mériterait un article à lui seul.

Notes manuscrites sur l'import du module random en Python, prises par une débutante qui apprend seule

Pourquoi Python me dit que « random » n'est pas défini ?

Le message d'erreur qui suit un import random oublié dit à peu près ceci : Python ne connaît pas le mot random, alors qu'il apparaît une ligne plus bas dans le script. La cause est presque toujours la même — la ligne d'import a été oubliée, ou glissée trop bas dans le fichier.

Une fois, ce message m'a semblé presque poli comparé à d'habitude — au lieu de me perdre dans dix pistes différentes, j'ai su tout de suite où regarder, et j'ai remonté le curseur droit vers la première ligne sans paniquer.

Le réflexe à garder : dès que Python prétend ne pas reconnaître un mot que vous utilisez pourtant, vérifiez d'abord la ligne d'import tout en haut du fichier avant de chercher une faute ailleurs. Neuf fois sur dix, c'est là que ça coince.

Quand ça bloque plus longtemps que prévu, je préfère fermer l'ordinateur et aller prendre l'air du côté du lac d'Aydat plutôt que de m'acharner sur le même message pendant une heure, le code, lui, peut attendre.

Ce que fait vraiment random.randint() dans mon jeu

La fonction qui fait tout le travail s'appelle random.randint(a, b). Pour un jeu où le nombre à deviner doit rester simple, un intervalle entre 1 et 10 suffit largement, et Python respecte les deux bornes : le 1 et le 10 peuvent sortir, pas seulement les chiffres entre les deux.

Pour comparer ce chiffre tiré au hasard avec une proposition, il faut un moyen de récupérer ce que la joueuse tape au clavier — c'est le rôle de la fonction input(), que je garde pour un autre article tellement il y a à en dire.

Faire dialoguer le hasard et les conditions

Si le chiffre proposé est trop petit, le jeu doit répondre « plus haut ». S'il est trop grand, « plus bas ». Cette logique tient sur quelques lignes de if et de else, et c'est sans doute la structure la plus utile à maîtriser avant d'aller plus loin avec l'aléatoire — j'en parle plus en détail dans mon article sur comment utiliser les conditions if else python pour débuter ses scripts.

Perrine, qui me lit depuis Bordeaux, m'a écrit récemment que ces conditions lui faisaient penser à un aiguillage dans une recette — on continue tout droit ou on bifurque selon ce qui se passe dans la casserole. L'image n'est pas de moi, elle l'a trouvée toute seule, et elle est tellement juste que je la lui emprunte depuis.

Capture d'écran du premier jeu Python en plus ou moins qui fonctionne enfin, boucle while et conditions if else

Comment empêcher le jeu de tourner en boucle sans fin ?

Mon jeu refusait de s'arrêter, ou alors il annonçait une victoire n'importe quand. Il manquait une boucle while pour répéter la question tant que la bonne réponse n'était pas trouvée - un mécanisme qui revient si souvent, une fois qu'on dépasse les scripts qui s'exécutent une seule fois, qu'il mériterait aussi son propre article.

La règle que je retiens : une boucle while a besoin d'une condition qui finira par devenir fausse, sinon le jeu — ou le programme, tout court — tourne indéfiniment. Avant d'écrire la boucle, je me demande toujours ce qui doit changer à chaque tour pour qu'elle finisse par s'arrêter.

Un vrai hasard, ou juste une formule bien cachée ?

On pourrait se dire qu'un jeu de devinettes, c'est un exercice dépassé. C'est pourtant une bonne porte d'entrée vers la notion de générateur pseudo-aléatoire : l'ordinateur ne tire pas un chiffre au sens où nous l'entendons, il suit un calcul, mais le résultat reste imprévisible pour qui joue en face.

Ce détail ne change rien à la partie de plus ou moins : gagner reste gagner, même si le hasard sort d'une formule plutôt que d'un dé en plastique.

Pour aller plus loin sans se perdre

Une fois le module random apprivoisé, l'étape suivante est souvent d'améliorer les messages affichés — passer de « Bravo, vous avez trouvé » à quelque chose qui reprend le chiffre trouvé. J'ai détaillé cette astuce dans comment utiliser les f-strings en python pour ne plus s'embrouiller.

Il plante encore si on tape une lettre au lieu d'un chiffre, et pour régler ça, il faudra que je m'attaque un jour à comment utiliser try except python pour éviter les bugs qui bloquent tout.

On m'avait conseillé de m'inscrire à un MOOC pour structurer tout ça, et je l'ai abandonné après deux semaines, perdue entre des vidéos qui allaient trop vite et personne pour répondre quand je bloquais. Ce qui a vraiment tenu la distance, c'est la Formation au langage Python — des leçons assez courtes pour tenir dans une soirée, avec un fil à suivre quand plus rien n'a de sens en fin de journée.

Si jamais l'envie me prend d'aller voir ce que ça donne dans un navigateur plutôt que dans un terminal, j'ai gardé de côté la Formation JavaScript pratique pour plus tard — sans savoir encore quand je m'y mettrai.

Est-ce qu'un vrai développeur ressent encore ce petit frisson devant un jeu de plus ou moins aussi simple que le mien ? Je n'en sais rien, mais j'espère que oui.

Articles connexes