Skip to content

Chifumi

Énoncé

Question 1

Écrivez un programme qui permet à son utilisateur de jouer à Chifumi (aussi appelé "Pierre, feuille, ciseaux" et dont les règles sont rappelées sur Wikipedia) à l'infini contre une intelligence artificielle qui joue aléatoirement (pas si intelligente que ça donc). Pour la boucle infinie nous utiliserons while True.

Vous ferez bien attention à ce que votre programme soit robuste face des entrées utilisateur invalides.

Question 2

Les nombres aléatoires sont générés à partir d'une constante, la graine. Par défaut, cette graine change à chaque nouvelle exécution du programme, simulant ainsi un comportement aléatoire. Il est possible de définir la même graine pour toutes les exécutions d'un programme en appelant la fonction random.seed().

À l'aide de la fonction random.seed, modifiez votre programme Chifumi pour être certain de toujours gagner les X premiers coups du jeu, avec X dépendant de votre capacité mémoire à vous, utilisateur humain. Autrement dit, faîtes en sorte que l'ordinateur joue la même séquence de coups à chaque exécution du programme.

Si le rôle de la fonction seed vous paraît un peu mystérieux, étudiez attentivement le petit exemple ci-dessous :

On lance l'interpréteur Python une première fois pour afficher trois nombres aléatoires sans utiliser seed :

1
2
3
4
5
6
7
8
>>> from random import randint
>>> print(randint(1,100))
32
>>> print(randint(1,100))
6
>>> print(randint(1,100))
48
>>> ^D
On sort de l'interpréteur (en tapant ctrl-d) puis on refait le même test :
1
2
3
4
5
6
7
8
>>> from random import randint
>>> print(randint(1,100))
27
>>> print(randint(1,100))
30
>>> print(randint(1,100))
63
>>> ^D
On voit que les trois nombres sont bien différents d'un test à l'autre.

On refait la même manipulation en utilisant cette fois-ci la fonction seed (en lui passant en paramètre une valeur quelconque) :

1
2
3
4
5
6
7
8
9
>>> from random import seed, randint
>>> seed(17)
>>> print(randint(1,100))
67
>>> print(randint(1,100))
54
>>> print(randint(1,100))
39
>>> ^D
On sort de l'interpréteur (en tapant ctrl-d) puis on refait le même test (en gardant la même graine, c'est à dire la même valeur passée en paramètre de seed):
1
2
3
4
5
6
7
8
9
>>> from random import seed, randint
>>> seed(17)
>>> print(randint(1,100))
67
>>> print(randint(1,100))
54
>>> print(randint(1,100))
39
>>> ^D
Qu'observez-vous ?

Correction question 2

Cliquez ici pour révéler la correction.

chifumi.py :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python3
"""Papier caillou ciseaux"""

import random


def main():
    """point d'entrée du programme"""

    # Initialisation du générateur aléatoire avec
    # une graine constante d'une exécution à l'autre
    # pour toujours obtenir la même suite de nombres
    # aléatoires.
    random.seed(41)

    plays = ["paper", "rock", "scissors"]

    while True:
        player = input("paper, rock, scissors ?\n")
        # La fonction random.randint(a, b) renvoie un entier
        # aléatoire dans l'intervalle [a, b]
        computer = plays[random.randint(0, 2)]

        if player == computer:
            print("Égalité!")
        elif player == "rock":
            if computer == "paper":
                print("You lose!", computer, "covers", player)
            else:
                print("You win!", player, "smashes", computer)
        elif player == "paper":
            if computer == "scissors":
                print("You lose!", computer, "cut", player)
            else:
                print("You win!", player, "covers", computer)
        elif player == "scissors":
            if computer == "rock":
                print("You lose...", computer, "smashes", player)
            else:
                print("You win!", player, "cut", computer)
        else:
            print("Invalid play. Check your spelling please !")


main()