« 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++;
}
|