Projets et mini-jeux
Cours complet · sciences numériques et technologie (seconde), chapitre 7 · seconde générale, SNT
Travailler ce chapitre sur Adloun Exercices corrigés de ce chapitre
Ce chapitre met en œuvre tout ce qui précède — variables, conditions, boucles, fonctions, listes et hasard — sur des projets complets. Chaque projet donne un cahier des charges, puis une solution commentée. Le mieux est de commencer par écrire le programme soi-même avant de lire le corrigé.
7.1 Le nombre mystère
L'ordinateur choisit un entier secret entre et . À chaque tour, le joueur propose un nombre ; le programme répond « plus grand », « plus petit » ou « gagné », et compte le nombre d'essais.
import random
secret = random.randint(1, 100)
essais = 0
trouve = False
while not trouve:
proposition = int(input("Ton nombre ? "))
essais = essais + 1
if proposition < secret:
print("Plus grand !")
elif proposition > secret:
print("Plus petit !")
else:
print("Gagné en", essais, "essais !")
trouve = True
En proposant toujours le milieu de l'intervalle encore possible, on divise par deux le nombre de candidats à chaque essai : nombres sont éliminés en au plus coups (). C'est le principe de la dichotomie.
À chaque essai, la barre bleue — l'ensemble des nombres encore possibles — est coupée en deux. Elle passe de candidats à , , , , … Le secret est trouvé au sixième coup, et jamais plus de sept ne sont nécessaires.
On inverse les rôles : la fonction trouve un nombre secret en le cherchant par dichotomie, et renvoie le nombre de coups.
def deviner(secret):
bas, haut = 1, 100
coups = 0
while bas <= haut:
milieu = (bas + haut) // 2
coups = coups + 1
if milieu < secret:
bas = milieu + 1
elif milieu > secret:
haut = milieu - 1
else:
return coups
print(deviner(73)) # 7 au maximum
7.2 Pierre-feuille-ciseaux
Le joueur saisit « pierre », « feuille » ou « ciseaux » ; l'ordinateur choisit au hasard ; le programme annonce le résultat. On utilise random.choice(liste), qui tire un élément au hasard dans une liste.
import random
choix = ["pierre", "feuille", "ciseaux"]
joueur = input("pierre, feuille ou ciseaux ? ")
ordi = random.choice(choix)
print("L'ordinateur joue :", ordi)
if joueur == ordi:
print("Égalité")
elif (joueur == "pierre" and ordi == "ciseaux") or \
(joueur == "feuille" and ordi == "pierre") or \
(joueur == "ciseaux" and ordi == "feuille"):
print("Gagné !")
else:
print("Perdu !")
Le caractère \ en fin de ligne permet d'écrire une condition longue sur plusieurs lignes. Les trois cas gagnants pour le joueur sont énumérés avec des or.
7.3 Estimation de par la méthode de Monte-Carlo
On tire au hasard points dans le carré . La proportion de points tombant dans le quart de disque de rayon (ceux vérifiant ) approche : on en déduit une estimation de .
\pgfmathsetseed{2026}
Les points tombent au hasard, uniformément, dans le carré de côté . La part de points verts est donc, à peu de chose près, la part d'aire occupée par le quart de disque, c'est-à-dire : compter des points suffit à mesurer une aire, et donc à estimer .
import random
def estimation_pi(N):
dedans = 0
for i in range(N):
x = random.random()
y = random.random()
if x*x + y*y <= 1:
dedans = dedans + 1
return 4 * dedans / N
print(estimation_pi(100000)) # proche de 3.14...
C'est une application directe de la loi des grands nombres : la fréquence des points « dans le disque » approche la probabilité , d'autant mieux que est grand.
7.4 Le jeu du 20 (dés)
Le joueur lance un dé autant de fois qu'il veut et cumule les points. Mais s'il obtient un , son total retombe à et la partie s'arrête. Objectif : atteindre au moins . On simule ici une stratégie automatique « je m'arrête dès que j'ai au moins ».
import random
def partie():
total = 0
while total < 20:
de = random.randint(1, 6)
if de == 1:
return 0 # perdu : total remis à zéro
total = total + de
return total # gagné : total >= 20
print(partie())
En répétant la partie, on estime la probabilité de gagner (atteindre ) :
def frequence_victoire(N):
victoires = 0
for i in range(N):
if partie() >= 20:
victoires = victoires + 1
return victoires / N
print(frequence_victoire(10000))
7.5 Motifs et FizzBuzz (bonus)
FizzBuzz : afficher les entiers de à , mais remplacer les multiples de par « Fizz », les multiples de par « Buzz », et les multiples de par « FizzBuzz ».
for i in range(1, 21):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
La multiplication d'une chaîne par un entier la répète : "" 3 vaut "***".
n = 5
for i in range(1, n + 1):
print("*" * i)
# Affiche un triangle :
# *
# **
# ***
# ****
# *****