< Algorithmique impérative

Problématique

On cherche à implémenter un jeu dont voici les règles :

Règles du jeu :

  • On commence avec un tas de billes, le jeu se joue à deux,
  • Les joueurs jouent l'un après l'autre,
  • Chaque joueur, à son tour, peut retirer une, deux, ou trois billes du tas,
  • Le joueur qui prend la dernière bille a perdu.

En plus d'implémenter le mécanisme du jeu, on veillera à respecter les consignes suivantes :

  • Au lancement, le programme rappelle les règles du jeu énoncées ci-dessus.
  • Le contenu du tas de départ est demandé au lancement. Si le nombre donné est 0 ou moins, on prend un nombre aléatoire entre 10 et 30 et on l'annonce.
  • Les deux joueurs entreront leurs noms en début de partie.
  • À chaque tour, le programme rappelle à qui est le tour, en appelant les joueurs par leurs noms. Pour qu'on voie que le tour à passé, l'affichage est vidé des informations et saisies du tour précédent.
  • À chaque tour, le programme rappelle combien il reste de billes dans le tas et donne une représentation graphique s'il reste moins de 30 billes (afficher sur une seule ligne un '.' par bille restante fera amplement l'affaire).
  • Le programme gère les tentatives de triche et rappelle les règles si nécessaire.
  • À la fin du jeu, le gagnant est désigné par son nom.

Première analyse

Analyse approfondie

Solution

Trouver un algorithme pour ce jeu n'est pas aussi évident qu'il y parait.

Implémentation en Pascal

 1program billes;
 2
 3var
 4	nb_billes :				integer;	(* le nombre de billes dans le tas *)
 5	coup :					integer;	(* nombre de billes à retirer lors d'un tour*)
 6	tour :					boolean;	(* vrai si c'est le tour du joueur 1 *)
 7	joueur1, joueur2 :		string;		(* noms des joueurs *)
 8	i :						integer;	(* variable de boucle *)
 9
10begin
11	(* Affichage des règles *)
12	writeln('Règles du jeu :');
13	writeln('* On commence avec un tas de billes, le jeu se joue à deux.');
14	writeln('* Les joueurs jouent l''un après l''autre.');
15	writeln('* Chaque joueur, à son tour, peut retirer une, deux, ou trois billes du tas.');
16	writeln('* Le joueur qui prend la dernière bille a perdu.');
17	
18	(* Recueil des informations nécessaires au jeu *)
19	writeln('Donner le nom du joueur 1 : ');
20	readln(joueur1);
21	writeln('Donner le nom du joueur 2 : ');
22	readln(joueur2);
23	writeln('Donner le nombre de billes : ');
24	readln(nb_billes);
25
26	(* gestion du nombre de billes *)
27	if (nb_billes <= 0) then begin
28		nb_billes := 10+random(20);	(* random(n) renvoie un nombre entre 0 et n *)
29		writeln('Un nombre aléatoire est pris : ',nb_billes);
30	end;
31
32	(* on démarre à false, ainsi c'est le joueur 1 qui jouera en premier *)
33	tour := false;
34
35	repeat
36		(* nettoyer l'écran, un appel de clsrc() peut fonctionner également *)
37		for i:=1 to 20 do writeln();
38
39		(* on change le joueur à qui est le tour *)
40		tour := not(tour);
41
42		(* on indique à qui est le tour *)
43		write('C''est au tour de ');
44		if (tour) then writeln(joueur1) else writeln(joueur2);
45
46		(* affichage (textuel et graphique) du nombre de billes restant *)
47		writeln('Il reste ',nb_billes,' billes. ');
48		if (nb_billes <= 30) then for i:= 1 to nb_billes do write('.');
49		writeln();
50
51		(* demande au joueur son coup , gestion de la triche *)
52		writeln('Combien retirez-vous de billes ?');
53		readln(coup);
54		while ((coup < 1) or (coup > 3) or (coup > nb_billes)) do begin
55			writeln('Tricheur !');
56			writeln('* On ne peut retirer qu''entre une et trois billes.');
57			writeln('* On ne peut plus de billes qu''il n''y en a.');
58			writeln('Combien retirez-vous de billes ?');
59			readln(coup)
60		end;
61
62		(* on a le coup voulu, on le joue *)
63		nb_billes := nb_billes - coup
64
65	until (nb_billes = 0);
66
67	(* c'est le joueur qui a joué en dernier qui est perdant *)
68	(* on inverse pour indiquer le gagnant *)
69	if (not(tour)) then write(joueur1) else write(joueur2);
70	writeln(' gagne !');
71
72end.
Cet article est issu de Wikibooks. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.