Adloun

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

ImportantCahier des charges

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
iRemarqueLa bonne stratégie : la dichotomie

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.

Exemple 7.1L'ordinateur devine par dichotomie

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

ImportantCahier des charges

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 !")
iRemarque

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

ImportantCahier des charges

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...
iRemarque

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)

ImportantCahier des charges

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())
Exemple 7.2Estimer la probabilité de gagner

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)

ImportantCahier des charges

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)
Exemple 7.3Un triangle d'étoiles

La multiplication d'une chaîne par un entier la répète : &quot;&quot; 3 vaut &quot;***&quot;.


n = 5
for i in range(1, n + 1):
    print("*" * i)
# Affiche un triangle :
# *
# **
# ***
# ****
# *****

Continuer sur Adloun : animation, QCM, fiches, exercices