Exercice langage C : Jeux de cailloux

Le jeu des cailloux : un tas de N cailloux se trouve entre deux joueurs ; à tour de rôle chacun prend 1, 2 ou 3 cailloux. Celui qui est obligé de prendre le dernier caillou a perdu.

Ce jeu possède une stratégie gagnante :  le joueur qui réussit, à laisser un nombre de cailloux égal à un multiple de 4 plus 1, à chaque fois qu’il doit jouer, gagne à coup sûr.

Le but est d’écrire un programme qui simule le jeu des cailloux (entre vous et la machine) :

Ecrire une fonction initialiser qui demande le nombre de cailloux et quel joueur commence le premier.

Ecrire une fonction utilisateur_joue qui demande à l’utilisateur le nombre de cailloux à prendre et qui met à jour le nombre de cailloux restants.

Ecrire une fonction machine_joue qui permet à la machine de prendre un nombre de cailloux et qui met à jour le nombre de cailloux restants.

Ecrire le programme principal.

Les prototypes :

void initialiser(int *nbCa, int *jo) ;

void utilisateur_joue(int *nbCa) ;

void machine_joue(int *nbCa) ;

nbCa : le nombre de cailloux

jo : joueur (1 : l’utilisateur et 2 : la machine)


 

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* jeu des cailloux */

#include

/* initialisation de la partie, avec la saisie du nombre total de cailloux et
 * du joueur qui demarre la partie */
void initialiser(int *nbCa, int *jo);

/* le jeu proprement dit pour un des deux joueurs : choix du nombre de
 * cailloux */
void jeu(int jo, int *nbCa);

/* la machine joue */
void machine_joue(int *nbCa);

/* l'utilisateur joue, et saisit le nombre de cailloux */
void utilisateur_joue(int *nbCa);

/* changement de joueur dans *jo */
void changer_joueur (int *jo);

int main()
{
	int finJeu = 0;
	int nbCailloux , joueur, perdant;
	initialiser(&nbCailloux, &joueur);

	while ( !finJeu )
	{
		printf("\nil reste %d cailloux\n", nbCailloux);
		jeu (joueur, &nbCailloux);
		if (nbCailloux == 0)
		{
			perdant = joueur;
			finJeu = 1;
		}
		else
		{
			changer_joueur (&joueur);
		}
	}

	if (perdant == 1)
	{
		printf("dommage: tu as perdu\n");
	}
	else
	{
		printf("bravo: tu as gagne\n");
	}

	return 0;
}

void initialiser(int *nbCa, int *jo)
{
	int rep;
	printf("donnez le nombre de cailloux : "); scanf("%d", nbCa);
	printf("\nchoix du premier joueur :\n");
	printf("\tutilisateur.: 1\n");
	printf("\tmachine.....: 2\n");
	printf("qui ? ");
	scanf("%d", &rep);
	switch (rep)
	{
		case 1: *jo = 1;
			break;
		case 2: *jo = 2;
			break;
	}
}

void jeu(int jo, int *nbCa)
{
	if (jo == 2)
	{
		machine_joue(nbCa);
	}
	else
	{
		utilisateur_joue(nbCa);
	}
}

void machine_joue(int *nbCa)
{
	int cailloux_pris, modu;
	modu = *nbCa % 4;
	switch (modu)
	{
		case 0: cailloux_pris = 3;
			break;
		case 1: cailloux_pris = 1;
			break;
		case 2: cailloux_pris = 1;
			break;
		case 3: cailloux_pris = 2;
			break;
	}
	printf("j\'ai pris %d cailloux \n",cailloux_pris);
	*nbCa = *nbCa - cailloux_pris;
}

void utilisateur_joue(int *nbCa)
{
	int cailloux_pris;
	do
	{
		printf("combien de cailloux: ");
		scanf("%d", &cailloux_pris);
	}
	while ((cailloux_pris <= 0) || (cailloux_pris >= 4) ||
		(cailloux_pris > *nbCa));
	*nbCa = *nbCa - cailloux_pris;
}

void changer_joueur (int *jo)
{
	if (*jo == 2)
	{
		*jo = 1;
	}
	else
	{
		*jo = 2;
	}
}