[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Officiels
> Programmation
> Apprenez à programmer en C ! > [Théorie] Les bases du débutant > TP : Plus ou Moins, votre premier jeu
> Lecture du tutoriel
TP : Plus ou Moins, votre premier jeu
Nous arrivons maintenant dans le premier TP.
T.P. est l'accronyme de "Travaux pratiques". Ca veut dire... qu'on va pratiquer oui oui
Quel est le but des TP ?
Le but est de vous montrer que
vous savez faire des choses avec ce que je vous ai appris. Car en effet, la théorie c'est bien, mais si on ne sait pas mettre tout ça en pratique de manière concrète... ben ça sert à rien d'avoir passé du temps à apprendre
Et, croyez-le ou non, mais vous avez déjà le niveau pour réaliser un premier programme amusant. C'est un petit jeu en mode console (les programmes en fenêtres arriveront plus tard je vous le rappelle).
Le principe du jeu est simple, et le jeu est facile à programmer. C'est pour cela que j'ai choisi d'en faire le premier TP du cours
Le principe du programme
Avant toute chose, il faut que je vous explique en quoi va consister notre programme.
C'est un petit jeu que j'appelle "Plus ou moins".
Le principe est le suivant :
- L'ordinateur tire au sort un nombre entre 1 et 100
- Il vous demande de deviner le nombre. Vous rentrez donc un nombre entre 1 et 100
- L'ordinateur compare le nombre que vous avez rentré avec le nombre "mystère" qu'il a tiré au sort. Il vous dit si le nombre mystère est supérieur ou inférieur à celui que vous avez entré
- Puis, l'ordinateur vous redemande le nombre.
- ... Et il vous indique si le nombre mystère est supérieur ou inférieur.
- Et ainsi de suite, jusqu'à ce que vous ayez trouvé le nombre mystère.
Le but du jeu, bien sûr, est de trouver le nombre mystère en un minimum de coups
Voici une capture d'écran d'une partie, c'est ce que vous devez arriver à faire :
Code : Console | Quel est le nombre ? 50
C'est plus !
Quel est le nombre ? 75
C'est plus !
Quel est le nombre ? 85
C'est moins !
Quel est le nombre ? 80
C'est moins !
Quel est le nombre ? 78
C'est plus !
Quel est le nombre ? 79
Bravo, vous avez trouve le nombre mystere !!! |
Tirer un nombre au sort
Mais comment tirer un nombre au hasard ? Je ne sais pas le faire !
Certes

Nous ne savons pas générer un nombre aléatoire. Il faut dire que demander cela à l'ordinateur n'est pas simple : il sait bien faire des calculs, mais lui demander de choisir un nombre au hasard ça il sait pas faire !
En fait, pour "essayer" d'obtenir un nombre aléatoire, on doit faire faire des calculs complexes à l'ordinateur... ce qui revient au bout du compte à faire des calculs
Bon, on a donc 2 solutions :
- Soit on demande à l'utilisateur à rentrer le nombre mystère via un scanf d'abord. Ca implique qu'il y ait 2 joueurs : l'un rentre un nombre au hasard, et l'autre essaie de le deviner ensuite.
- Soit on tente le tout pour le tout, et on essaie quand même de générer un nombre aléatoire automatiquement. L'avantage est qu'on peut jouer tout seul du coup. Le défaut... est qu'il va falloir que je vous explique comment faire
Nous allons tenter la seconde solution, mais rien ne vous empêche de coder la première si vous voulez après
Pour générer un nombre aléatoire, on utilise la fonction rand().
Cette fonction génère un nombre au hasard. Mais nous, on veut que ce nombre soit compris entre 1 et 100 par exemple (si on ne connaît pas les limites ça va devenir trop compliqué

)
Pour ce faire, on va utiliser la formule suivante :
Code : C1
2 | srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
|
(je ne pouvais pas trop vous demander de la deviner
)
La première ligne (avec srand) permet d'initialiser le générateur de nombre aléatoires. Oui c'est un peu compliqué je vous avais prévenu

nombreMystere est une variable qui contiendra le nombre au hasard.
L'instruction srand ne doit être exécutée qu'une seule fois (au début du programme). Il faut obligatoirement faire un srand une fois, et seulement une fois.
Vous pouvez ensuite faire autant de rand() que vous voulez pour générer des nombres aléatoires. Mais il ne faut PAS que l'ordinateur lise l'instruction srand 2 fois par programme, ne l'oubliez pas.
MAX et MIN sont des constantes, le premier est le nombre maximal (100) et le second le nombre minimal (1). Je vous recommande de définir ces constantes au début du programme, comme ceci :
Code : C1 | const long MAX = 100, MIN = 1;
|
(pour un nombre aléatoire entre 1 et 100)
Les librairies à inclure
Pour que votre programme marche correctement, vous aurez besoin d'inclure 3 librairies : stdlib, stdio et time (la dernière sert pour les nombres aléatoires).
Votre programme devra donc commencer par :
Code : C1
2
3 | #include <stdio.h>
#include <stdlib.h>
#include <time.h>
|
J'en ai assez dit !
Bon allez, j'arrête là parce que sinon je vais vous donner tout le code du programme si ça continue
Bref, vous en savez assez. Je vous ai expliqué le principe du programme, je vous ai fait une capture d'écran du programme au cours d'une partie.
Avec tout ça, vous êtes tout à fait capables d'écrire le programme
A vous de jouer !
Bonne chance !

Stop !
Je ramasse les copies
Alors, avez-vous réussi à coder le programme ?
Je veux pas vous mettre la pression mais... vous devriez
Cela n'est pas bien compliqué.
Je vais vous donner une correction (la mienne), mais il y a plusieurs bonnes façons de faire le programme. Si votre code source n'est pas identique au mien et que vous avez trouvé une autre façon de le faire, c'est bien aussi hein
La correction de "Plus ou Moins"
Code : C 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 | /*
Plus ou Moins
-------------
Réalisé par M@teo21, pour les cours du Site du Zér0
<lien url="www.siteduzero.com">www.siteduzero.com</lien> (cours de programmation en C / C++ pour débutants)
Création le : 20/12/2005
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ( int argc, char** argv )
{
long nombreMystere = 0, nombreEntre = 0;
const long MAX = 100, MIN = 1;
// Génération du nombre aléatoire
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
/* La boucle du programme. Elle se répète tant que l'utilisateur
n'a pas trouvé le nombre mystère */
do
{
// On demande le nombre
printf("Quel est le nombre ? ");
scanf("%ld", &nombreEntre);
// On compare le nombre entré avec le nombre mystère
if (nombreMystere > nombreEntre)
printf("C'est plus !\n\n");
else if (nombreMystere < nombreEntre)
printf("C'est moins !\n\n");
else
printf ("Bravo, vous avez trouve le nombre mystere !!!\n\n");
} while (nombreEntre != nombreMystere);
system("PAUSE");
}
|
Exécutable et sources
Pour ceux qui le désirent, je mets à votre disposition en téléchargement l'exécutable du programme ainsi que les sources.
Il y a deux dossiers, l'un avec l'exécutable (compilé sous Windows je le rappelle), et l'autre avec les sources.
Dans le cas de "Plus ou moins", les sources sont très simples : il y a juste un fichier main.c.
N'ouvrez pas le fichier main.c directement. Ouvrez d'abord votre ide favori (Dev, Visual...) et créez un nouveau projet de type console
vide. Une fois que c'est fait, demander à
ajouter au projet le fichier main.c.
Vous pourrez alors compiler le programme pour tester, et le modifier si vous le désirez
Explications
Je vais maintenant vous expliquer mon code, en commençant par le début.
Les directives de précompilateur
Ce sont les lignes commençant par # tout en haut. Elles incluent les librairies dont on a besoin.
Je vous les ai données tout à l'heure, donc si vous vous êtes plantés là c'est que vous êtes vraiment euh... pas doués
Les variables
On n'en a pas eu besoin de beaucoup.
Juste une pour le nombre entré par l'utilisateur (nombreEntre) et une autre qui retient le nombre aléatoire généré par l'ordinateur (nombreMystere).
J'ai aussi défini les constantes comme je vous l'ai dit au début de ce chapitre. L'avantage de définir les constantes en haut du programme, c'est que comme ça si vous voulez changer la difficulté (en mettant 1000 pour MAX par exemple) il suffit juste d'éditer cette ligne et de recompiler.
La boucle
J'ai choisi de faire une boucle do... while. En théorie, une boucle while simple aurait pu fonctionner aussi, mais j'ai trouvé qu'utiliser do... while était plus logique.
Pourquoi ?
Parce que, souvenez-vous, do... while est une boucle qui s'exécute
au moins une fois. Et nous, on sait qu'on veut demander le nombre à l'utilisateur au moins une fois (il ne peut pas trouver le résultat en moins d'un coup, ou alors c'est qu'il est super fort

)
A chaque passage dans la boucle, on redemande à l'utilisateur le nombre. On stocke le nombre qu'il propose dans nombreEntre.
Puis, on compare ce nombreEntre au nombreMystere. Il y a 3 possibilités :
- Le nombre mystère est supérieur au nombre entré, on indique donc l'indice "C'est plus !"
- Le nombre mystère est inférieur au nombre entré, on indique l'indice "C'est moins !"
- Et si le nombre mystère n'est ni supérieur ni inférieur ? Ben... c'est qu'il est égal forcément ! D'où le else. Dans ce cas, on affiche la phrase "Bravo vous avez trouvé !"
Il faut une condition pour la boucle. Celle-ci était facile à trouver : on continue la boucle
TANT QUE le nombre entré n'est pas égal au nombre mystère.
La fois où le nombre est égal (c'est-à-dire quand on a trouvé), la boucle s'arrête. Le programme est alors terminé
Non, vous ne croyiez tout de même pas que j'allais m'arrêter là ?

Les cours du Site du Zér0 c'est comme la mousse au chocolat, quand y'en a plus y'en a encore !
Je veux vous inciter à continuer à améliorer ce programme, pour vous entraîner. N'oubliez pas que
c'est en vous entraînant comme ceci que vous progresserez ! Ceux qui lisent les cours d'une traite sans jamais faire de tests font une grosse erreur, je l'ai dit et je le redirai
Figurez-vous que j'ai une imagination débordante, et même sur un petit programme comme celui-ci je vois plein d'idées pour l'améliorer !
Attention : cette fois je ne vous fournis pas de correction, il faudra vous débrouiller tous seuls ! Si vous avez vraiment des problèmes, n'hésitez pas à aller faire un tour sur
les forums du site, faites une recherche pour voir si on n'a pas déjà donné la réponse à vos questions, sinon créez un nouveau sujet pour poser ces questions
- Faites un compteur de "coups". Ce compteur devra être une variable que vous incrémenterez à chaque fois que vous passez dans la boucle. Lorsque l'utilisateur a trouvé le nombre mystère, vous lui direz "Bravo, vous avez trouvé le nombre mystère en 8 coups" par exemple.
- Lorsque l'utilisateur aura trouvé le nombre mystère, le programme s'arrête. Pourquoi ne pas demander s'il veut faire une autre partie ?
Si vous faites ça, il vous faudra faire une boucle qui englobera la quasi-totalité de votre programme. Cette boucle devra se répéter TANT QUE l'utilisateur n'a pas demandé à arrêter le programme. Je vous conseille de rajouter une variable booléenne "continuerPartie" initialisée à 1 au départ. Si l'utilisateur demande à arrêter le programme, vous mettrez la variable à 0 et le programme s'arrêtera.
- Implémentez un mode 2 joueurs ! Attention, je veux qu'on ait le choix entre un mode 1 joueur et un mode 2 joueurs !
Vous devrez donc faire un menu au début de votre programme qui demande à l'utilisateur le mode de jeu qu'il veut faire.
La seule chose qui changera entre les deux modes de jeu, c'est la génération du nombre mystère. Dans un cas ce sera un rand() comme on a vu, dans l'autre cas ça sera... un scanf 
- Créez plusieurs niveaux de difficulté. Au début, faites un menu qui demande le niveau de difficulté. Par exemple :
- 1 = entre 1 et 100
- 2 = entre 1 et 1000
- 3 = entre 1 et 10000
Si vous faites ça, vous devrez changer votre constante MAX... Ben oui, ça ne peut plus être une constante si la valeur doit changer au cours du programme ! Renommez donc cette variable en nombreMaximum (vous prendrez soin d'enlever le mot-clé "const" sinon ça sera toujours une constante !). La valeur de cette variable dépendra du niveau qu'on aura choisi.
Voilà, ça devrait vous occuper un petit bout de temps
Amusez-vous bien et n'hésitez pas à chercher d'autres idées pour améliorer ce "Plus ou Moins", je suis sûr qu'il y en a !
N'oubliez pas que
les forums sont à votre disposition si vous avez des questions
Voilà notre premier TP s'achève ici

J'espère que vous l'avez apprécié et que vous allez tenter de faire un maximum de modifications tous seuls comme des grands, car c'est réellement ce qui vous fera progresser.
Au fur et à mesure du cours, les TP deviendront bien sûr de plus en plus intéressants, et vous vous étonnerez dans quelques temps de ce que vous arriverez à faire !