hg S’enregistrer Bac Tunisie Algorithmique et programmation : BAC INFORMATIQUE En Tunisie forum informatique Tunisie

Bac Tunisie Algorithmique et programmation : BAC INFORMATIQUE En Tunisie  forum informatique Tunisie Index du Forum

hg Bac Tunisie Algorithmique et programmation TIC réseaux php javascript sql access activités programmation c
hg
FAQ FAQ Rechercher Rechercher Membres Membres Groupes Groupes Profil Profil Se connecter pour vérifier ses messages privés Messages Privés Connexion Connexion


 Forum de l'excellence et l'excellence en innovation 
Pour participer à notre Forum, vous devez
 
inscrire sur notre forum a partir d'ici
 
  NB :
Les membres ''zéro messages'' seront supprimés automatiquement après un nombre de jours donné !!!!
             
   
 
  
forum d'aide informatique : internet, réseau, programmation informatique ...
TP général
 
 
Poster un nouveau sujet   Répondre au sujet    Bac Tunisie Algorithmique et programmation : BAC INFORMATIQUE En Tunisie forum informatique Tunisie Index du Forum -> Espace étudiants -> (¯`·._.·[Series TD & TP']·._.·´¯)
hg Sujet précédent :: Sujet suivant   hd
Auteur Message
KARIMOS
Administrateur

Hors ligne

Inscrit le: 02 Nov 2008
Messages: 1 710
Masculin
Point(s): 5 479
Moyenne de points: 0

Posté le: Dim 24 Jan - 14:50 (2010)    Sujet du message: TP général Répondre en citant

PublicitéSupprimer les publicités ?
Difficulté : *************

Le but du jeu est de retrouver un mot choisi par l'ordinateur en moins de 10 coups. (Bien sur on pourras créer plusieurs niveau de difficulté et réduire le nombre de coups). On verra ensuite comment créer un mode multijoueurs.
Au début on mettra que quelques mots dans le dictionnaire pour servir d'exemple.
Si l'utilisateur trouve une lettre qui se trouve dans le mots, on l'affiche, sinon on réduit le nombre de coups et arrivé a 0 on perd, sauf si le mot est découvert, on gagne.

Bon on vas commencer par créer un dictionnaire de mots avec l'extension ".dico" (cela évite a l'utilisateur d'avoir accès au dictionnaire). Ouvrez le bloc note et marquez quelques mots en majuscule, pae exemple :

MANGER
VOITURE
MAISON
CHEVAL
TELE
PROGRAMMATION
ANTICONSTITUTIONNELLEMENT

Vous n'utilisez pas d'accents si caractères spéciaux. Une fois terminé, vous enregistrez le fichier dans le dossier de votre projet en l'appelant "mots.dico".
Bon on a vu comment lire le contenue d'un fichier, on pourrais écrire la fonction de lecture dans le main.c mais je préfère la mette dans mots.c. Je vous propose aussi de créer un mots.h pour mettre les prototypes des fonctions. Dans le mots.c on met :
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#include "mots.h"

Ce sont toutes les librairies que l'on aura besoin.
Ensuite il vas falloir sélectionner un mot aléatoirement, par exemple avec la fonction "select"
Code:
int select(char *motSelect)
{
    FILE* dico = NULL;
    int nombreMots = 0, MotChoisi = 0, i = 0;
    int caractereLu = 0;
//Initialisez toutes les variables, vous verrez après leur utilitée
    dico = fopen("mots.dico", "r"); // juste lecture

    // verification d'ouverture
    if (dico == NULL) // Si ouverture échouée
    {
        printf("\nImpossible de charger le dictionnaire.\n");
getch();       
return 0;
    }

(nous sommes toujours dans mot.c)

Maintenant on vas calculer le nombre de mots dans le dictionnaire :
Code:
do
    {
        caractereLu = fgetc(dico);
        if (caractereLu == '\n')//A chaque fois qu'il y a un \n
            nombreMots++;//on ajoute un mot !
    } while(caractereLu != EOF);//tant qu'il y a des mots dans le dico

Et on sélectionne un mot :
Code:
MotChoisi = nombreAleatoire(nombreMots); // On pioche un mot au hasard

    // On recommence à lire le fichier depuis le début et on s'arrête au bon mot.
    rewind(dico);
    while (MotChoisi > 0)
    {
        caractereLu = fgetc(dico);
        if (caractereLu == '\n')
            MotChoisi--;
    }
//On se positionne au debut
    fgets(motSelect, 100, dico);

    // On vire l'\n à la fin
    motSelect[strlen(motSelect) - 1] = '\0';
    fclose(dico);

    return 1; // Tout s'est bien passé, on retourne 1
}

Ne pas oublier le nombre aléatoire, comme on l'a vu dans la création du jeu + ou - :
Code:
int nombreAleatoire(int nombreMax)
{
    srand(time(NULL));
    return (rand() % nombreMax);
}


Donc on a terminé notre dico.c avec la sélection du mot aléatoire. On passe au mot.h qui vas contenir quelques prototypes :
Code:
//dico.h
//------


#ifndef DEF_DICO
#define DEF_DICO//empêche les inclusions infinies, on le verra plus tard.

int select(char *motSelect);
int nombreAleatoire(int nombreMax);
//prototypes des fonctions.

#endif

Le dico.h est terminé, on passe au main.c qui contiendra le code du jeu.
Bien sur include ceci :
Code:
//main.c
//------

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <process.h>

#include "mots.h"

On vas initialisé toutes ces fonctions :
Code:
int gagne(int lettreTrouvee[], long tailleMot);
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
char lireCaractere();

Ces variables serviront a comparer les lettres avec le mot secret.
Dans le main on vas initialiser d'autres variables :
Code:
int main(int argc, char* argv[])
{
    char lettre = 0; // Le lettre que l'utilisateur entrera via un scanf
    char motSecret[100] = {0}; // Mot à trouver
    int *lettreTrouvee = NULL; // Un tableau dont chaque cases correspond a une lettre du mot. On renvoi 0 si la lettre est non trouvée et 1 si elle est trouvée.
    long coupsRestants = 10; // Compteur de coups restants, on perd a 0, cette valeur pet être modifiée.
    long i = 0; // variable pour parcourir le tableau.
    long tailleMot = 0;

On vas créer une page d'acceuil pour notre jeu :
Code:
puts("#############################################################");
    printf("\n\tBienvenue dans le jeu du Pendu en console !\n\n");
   puts("#############################################################");
getch();
system("cls");

On créer un tableau contenant le mot secret :
Code:
if (!select(motSecret))
      
        exit(0);

    tailleMot = strlen(motSecret);

    lettreTrouvee = malloc(tailleMot * sizeof(int)); // On demande dynamiquement de la mémoire pour le tableau
    if (lettreTrouvee == NULL)
      
        exit(0);

    for (i = 0 ; i < tailleMot ; i++)
        lettreTrouvee[i] = 0;


Il faut créer une boucle pour le jeu :
Code:
while (coupsRestants > 0 && !gagne(lettreTrouvee, tailleMot))
    {
        printf("\n\nVous avez encore %ld coups a jouer", coupsRestants);
        printf("\nQuel est le mot secret ? ");

        //Il faut masquer les lettres par des "*"
        for (i = 0 ; i < tailleMot ; i++)
        {
            if (lettreTrouvee[i]) // Si on a trouvé la lettre n°i
                printf("%c", motSecret[i]); // On l'affiche
            else
                printf("*"); // Sinon, on affiche des "*"
        }

Fonction qui lis un caractère et qui enlève un coup si elle est fausse :
Code:
printf("\nEntrez une lettre : ");
        lettre = lireCaractere();

        // Si ce n'est pas la bonne lettre
        if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
        {
            coupsRestants--; // On diminue le nombre de coups restants
        }
    }

Il reste la fonction qui récupère et affiche les bonnes lettres :
Code:
if (gagne(lettreTrouvee, tailleMot))
        printf("\n\nVous avez gagné, le mot était : %s", motSecret);
    else
        printf("\n\nVous avez perdut, le mot secret était: %s, retentez votre chance.\n", motSecret);

    free(lettreTrouvee); // On libère la mémoire
getch();
        return 0;
}

Après avoir fermé le main, on ajoute nos autres fonctions, déjà celle qui sert a lire les caractères :
Code:
char lireCaractere()
{
    char caractere = 0;

    caractere = getchar(); // On lit la lettre
    caractere = toupper(caractere); // La fonction toupper met la lettre en majuscule.

    // On lit les autres caractères mémorisés un à un jusqu'à l'\n
    while (getchar() != '\n') ;

    return caractere; // On retourne le premier caractère lu.
}

La fonction gagné :
Code:
int gagne(int lettreTrouvee[], long tailleMot)
{
    long i = 0;
    int joueurGagne = 1;

    for (i = 0 ; i < tailleMot ; i++)
    {
        if (lettreTrouvee[i] == 0)
            joueurGagne = 0;
    }

    return joueurGagne;
}

Et enfin la fonction qui récupère les bonnes lettres :
Code:
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
{
    long i = 0;
    int bonneLettre = 0;

    // On regarde si la lettre entrée se trove dans le mot secret.
    for (i = 0 ; motSecret[i] != '\0' ; i++)
    {
        if (lettre == motSecret[i]) // Si la lettre y est
        {
            bonneLettre = 1; // On mémorise que c'était une bonne lettre
            lettreTrouvee[i] = 1; // On met à 1 le case du tableau de booléens correspondant à la lettre actuelle
        }
    }

    return bonneLettre;
}

Voila, le jeu est fini ! Vous pouvez le tester !!!
Vous pouvez aussi créer un mode multijoueurs, avec un premier joueur qui entre un mot récupéré avec un scanf (le motSecret = motEntreParJoueur1). Vous pouvez faire plusieurs niveaux de difficulté avec le mode facile : 15 coups, moyen 10 coups, difficile 5 coups et diabolique : 2 coups ! Et vous pouvez aussi dessiner le bonhomme en console avec printf :


~~("")_______
~~##~~~ ~ |
"""###"""~~ |
~~##~~~ ~ |
~~" "~~~ ~ |
~~"° °"~~ ~ |
--------------------

(Bon je dessine pas super bien, mais y a de l'idée...).
Et ce que je vous conseille de faire c'est de mettre des centaines de mots dans le dico ! C'est plus marrant !

Voila, avec ce TD vous avez vraiment approfondi vos connaissances en C ! Maintenant il n'y a presque plus rien a apprendre des librairies standards. Si vous avez suivi tous les cours et TD jusqu'ici vous devriez avoir assez de points pour accéder a la partie jeux vidéo ! et a la partie C pour les winers ! Je vous invite a aller suivre les cours concernant les programmes/jeux vidéo et ensuite la partie des concepts avancés du C. Si vous ne pouvez pas accéder a ces parties, contactez moi.


 
Revenir en haut
Contenu Sponsorisé






Posté le: Aujourd’hui à 23:20 (2016)    Sujet du message: TP général

 
Revenir en haut
Montrer les messages depuis:   
bg bd
Poster un nouveau sujet   Répondre au sujet    Bac Tunisie Algorithmique et programmation : BAC INFORMATIQUE En Tunisie forum informatique Tunisie Index du Forum -> Espace étudiants -> (¯`·._.·[Series TD & TP']·._.·´¯) Toutes les heures sont au format GMT + 1 Heure
 
Page 1 sur 1

 
Sauter vers:  
Index | créer forum gratuit | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation