Boris Eng

R&D Engineer at OCamlPro, PhD in computer science [first name][last name]@proton.me
« Return to Teaching

Pierre-feuille-ciseaux en C

1 - À partir de ce programme, representez les possibilités du jeu pierre-feuille-ciseaux avec des conditions if en comparant le coup du joueur 1 et celui du joueur 2 sachant que PIERRE gagne contre CISEAUX, CISEAUX gagne contre FEUILLE et FEUILLE gagne contre PIERRE. On peut fixer une valeur de départ à coupJ1 et coupJ2 pour tester.

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdlib.h>

#include <stdio.h>

#define PIERRE 0
#define FEUILLE 1
#define CISEAUX 2
int main()
{
    int coupJ1;
    int coupJ2;
    // Remplir ici avec des conditions pour gérer tous les cas

    return EXIT_SUCCESS;
}

2 - Modifier le programme pour jouer contre l’ordinateur. Le joueur joue en entrant un entier et l’ordinateur choisit son coup aléatoirement. Vous pouvez générer un entier aléatoire entre 0 et 2 avec cette commande après avoir importé la bibliothèque time.h avec #include <time.h> :

1
2
srand(time(NULL)); // seulement une seule fois au début du programme pour initialiser

int r = rand() % 3; // 3 est exclu

3 - Demandez à l’utilisateur d’entrer un nombre de manches et réaliser plusieurs manches du jeu automatiquement avec une boucle for. Déterminez qui est le gagnant en comptant le nombre de victoires de chacun.

Correction

Première version (énumération des coups gagnants)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>

#include <stdlib.h>

#include <time.h>


#define FALSE 0
#define TRUE 1

#define PIERRE 0
#define FEUILLE 1
#define CISEAUX 2

void affiche_coup(int coup)
{
  switch (coup)
  {
    case PIERRE:
      printf("pierre");
      break;
    case FEUILLE:
      printf("feuille");
      break;
    case CISEAUX:
      printf("ciseaux");
      break;
    default:
      printf("[invalide]");
  }
}

int main()
{
  int coupJ, coupO;
  int ptsJ, ptsO;
  int nb_manches;
  int tours_restants;
  srand(time(NULL)); // initialise l'aléatoire


  // On demande à l'utilisateur d'entrer un nombre de manches valides (supérieur à 0)

  do
  {
    printf("Combien de fois voulez-vous jouer ? \n");
    scanf("%d", &nb_manches);
  } while (nb_manches <= 0);
  tours_restants = nb_manches;

  // Boucle principale du jeu

  do
  {
    printf("\nQue voulez-vous jouer ? (PIERRE=0, FEUILLE=1, CISEAUX=2)\n");
    scanf("%d", &coupJ); // Récupération du coup du joueur

    coupO = rand() % 3;  // Calcul du coup de l'ordinateur


    // Vérification du gagnant de la manche

    printf("* Vous avez joué ");
    affiche_coup(coupJ);
    printf("\n* L'ordinateur a joué ");
    affiche_coup(coupO);
    printf("\nRésultat : ");
    if (coupJ == coupO)
      printf("égalité\n");
    else if ((coupJ == PIERRE && coupO == CISEAUX) ||
             (coupJ == CISEAUX && coupO == FEUILLE) ||
             (coupJ == FEUILLE && coupO == PIERRE))
    {
      printf("vous avez gagné\n");
      ptsJ++;
    }
    else
    {
      printf("vous avez perdu\n");
      ptsO++;
    }

    tours_restants--;
  } while (tours_restants > 0);

  // Vérification du gagnant final

  printf("\n-----------------------\n");
  if (ptsJ > ptsO)
    printf("Vous avez gagné la partie !");
  else if (ptsJ == ptsO)
    printf("Il n'y aucun gagnant.");
  else
    printf("Vous avez perdu la partie...");
  printf("\n");

  return EXIT_SUCCESS;
}
Deuxième version (comparaison et modulo) Dans la première version, on vérifie qui a gagné la manche avec une condition :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if (coupJ == coupO)
      printf("égalité\n");
    else if ((coupJ == PIERRE && coupO == CISEAUX) ||
             (coupJ == CISEAUX && coupO == FEUILLE) ||
             (coupJ == FEUILLE && coupO == PIERRE))
    {
      printf("vous avez gagné\n");
      ptsJ++;
    }
    else
    {
      printf("vous avez perdu\n");
      ptsO++;
    }
    
On la remplace par ça :
1
2
3
4
5
6
7
8
9
10
11
12
13
    if (coupJ == coupO)
      printf("égalité\n");
    else if (coupJ == (coupO+1)%3)
    {
      printf("vous avez gagné\n");
      ptsJ++;
    }
    else
    {
      printf("vous avez perdu\n");
      ptsO++;
    }