Fil d'Ariane
Mis à jour le mercredi 21 juin 2017
  • 40 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Ce cours existe en eBook.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

TP : Plus ou Moins, votre premier jeu

Connectez-vous ou inscrivez-vous pour bénéficier de toutes les fonctionnalités de ce cours !

Nous arrivons maintenant dans le premier 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 cela en pratique de manière concrète… ça ne sert à rien d'avoir passé tout ce temps à apprendre.

Croyez-le ou non, 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.

Préparatifs et conseils

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.

  1. L'ordinateur tire au sort un nombre entre 1 et 100.

  2. Il vous demande de deviner le nombre. Vous entrez donc un nombre entre 1 et 100.

  3. L'ordinateur compare le nombre que vous avez entré 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é.

  4. Puis l'ordinateur vous redemande le nombre.

  5. … Et il vous indique si le nombre mystère est supérieur ou inférieur.

  6. Et ainsi de suite, jusqu'à ce que vous trouviez 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 :

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 ne 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 deux solutions.

  • Soit on demande à l'utilisateur d'entrer le nombre mystère via unscanfd'abord. Ça implique qu'il y ait deux joueurs : l'un entre 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 ensuite si vous voulez.

Pour générer un nombre aléatoire, on utilise la fonctionrand(). 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 (je ne pouvais pas trop vous demander de la deviner !) :

srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

La première ligne (avecsrand) permet d'initialiser le générateur de nombres aléatoires. Oui, c'est un peu compliqué, je vous avais prévenus.nombreMystereest une variable qui contiendra le nombre tiré au hasard.

MAXetMINsont 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 :

const int MAX = 100, MIN = 1;

Les bibliothèques à inclure

Pour que votre programme fonctionne correctement, vous aurez besoin d'inclure trois bibliothèques :stdlib,stdioettime(la dernière sert pour les nombres aléatoires).
Votre programme devra donc commencer par :

#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.

À vous de jouer ! Bonne chance !

Correction !

Stop ! À partir d'ici je ramasse les copies.

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, sachez que c'est probablement aussi bien.

La correction de « Plus ou Moins »

Voici la correction que je vous propose :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ( int argc, char** argv )
{
    int nombreMystere = 0, nombreEntre = 0;
    const int 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("%d", &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);
    
    return 0;
}

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.

Télécharger l'exécutable et les sources de
"Plus ou Moins" (7 Ko)

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 fichiermain.c.
N'ouvrez pas le fichiermain.cdirectement. Ouvrez d'abord votre IDE favori (Code::Blocks, Visual, etc.) et créez un nouveau projet de type console, vide. Une fois que c'est fait, demandez à ajouter au projet le fichiermain.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éprocesseur

Ce sont les lignes commençant par#tout en haut. Elles incluent les bibliothèques dont on a besoin.
Je vous les ai données tout à l'heure, donc si vous avez réussi à faire une erreur là, vous êtes très forts.

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 pour changer la difficulté (en mettant 1000 pourMAXpar exemple) il suffit juste d'éditer cette ligne et de recompiler.

La boucle

J'ai choisi de faire une boucledo... while. En théorie, une bouclewhilesimple aurait pu fonctionner aussi, mais j'ai trouvé qu'utiliserdo... whileétait plus logique.

Pourquoi ? Parce que, souvenez-vous,do… whileest 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 !).

À chaque passage dans la boucle, on redemande à l'utilisateur d'entrer un nombre. On stocke le nombre qu'il propose dansnombreEntre.
Puis, on compare cenombreEntreaunombreMystere. Il y a trois 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 ? Eh bien… c'est qu'il est égal, forcément ! D'où leelse. 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.
Quand ces deux nombres sont égaux (c'est-à-dire quand on a trouvé), la boucle s'arrête. Le programme est alors terminé.

Idées d'amélioration

Vous ne croyiez tout de même pas qu'on allait s'arrêter là ? Je veux vous inciter à continuer à améliorer ce programme, pour vous entraîner. N'oubliez pas que c'est en vous entraînant comme cela 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-là je ne manque pas d'idées pour l'améliorer !

Attention : cette fois je ne vous fournis pas de correction, il faudra vous débrouiller tout seuls ! Si vous avez vraiment des problèmes, n'hésitez pas à aller faire un tour sur les forums du Site du Zéro, section langage C. 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 a 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éennecontinuerPartieinitialisé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 qui l'intéresse.
    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 unrand()comme on a vu, dans l'autre cas ça sera… unscanf.

  • 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… Eh oui, ça ne peut plus être une constante si la valeur doit changer au cours du programme ! Renommez donc cette variable ennombreMaximum(vous prendrez soin d'enlever le mot-cléconstsinon ç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.

Exemple de certificat de réussite
Exemple de certificat de réussite