Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Programme répondant au sujet de devoir: Mots mélés
- Ne pas compiler avec le -ansi
- */
- /* ce qu'il reste à faire :
- fichier:
- charger une grille
- graphique
- ecire rejouer et abandon dans les cases BOF
- detecter les clics sur ces cases FAIT
- placer les mots à droite du plateau FAIT
- surligner les mots quand ils sont trouvés BUG
- quand tous les mots sont trouvés, afficher msg de fin FAIT
- avec possibilité de rejouer PEUT ETRE EASY
- main: arranger un peu tout ça snif
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <MLV/MLV_all.h>
- /**************************************
- ******* STRUCTURES
- ***************************************/
- /* Cette structure permet de retrouver la taille du plateau
- ainsi que la grille toute entière
- */
- typedef struct {
- int taille;
- char plateau[20][20];
- } InfoGrille;
- /* Cette structure permet de retrouver tout ce qui est lié
- à un mot de l'utilisateur */
- typedef struct {
- char mot[15]; // Le mot en lui même
- int taille; // La taille du mot
- int xDebut; // Les coordonnées (x,y) de sa première lettre
- int yDebut;
- int xFin; // Les coordonnées (x,y) de sa dernière lettre
- int yFin;
- int dx; // L'orientation du mot
- int dy;
- int dejaClique;
- } Mot ;
- /* Cette structure est l'endroit où on retrouve la totalité des mots */
- typedef struct {
- // On impose une taille maximale au mot
- // (souvent la taille de la grille)
- int tailleMax;
- // Le nombre de mots à saisir
- int nbMots;
- int nbMotsTrouves;
- // Ainsi qu'une liste où on stocke les mots choisis
- Mot listeMots[15];
- } InfoMots;
- typedef struct {
- int longueur;
- int largeur;
- int tailleGrille;
- int tailleCase;
- } Graph ;
- /* Cette structure rassemble toutes les informations précédemment collectées */
- typedef struct {
- InfoGrille grille;
- InfoMots mots;
- Graph graph;
- } Tableaux; // Les variables du type Tableaux seront donc les éléments essentiels
- /**************************************
- ******* PROTOTYPES
- ***************************************/
- int main( int argc, char const *argv[] ) ;
- // Initialisation du plateau
- void propJeu( Tableaux * jeu );
- int demandeTaille();
- int estDansIntervalle( int point, int min, int max );
- void initPlateau( Tableaux * jeu );
- void affichePlateau( Tableaux jeu );
- // Placement des mots dans le plateau
- void gestionPlacement( Tableaux *jeu );
- void afficheReglesDirection();
- // Choix des mots dans la grille
- void demandeLesMots( Tableaux * jeu );
- void choixDesMots( Tableaux * jeu );
- void saisirMot( Tableaux * jeu, int numMot );
- int verifieMotCorrect( int tailleMot, char mot[tailleMot] );
- void afficheLesMots( Tableaux jeu );
- // diverses vérifications pour avoir le droit de placer un mot
- void demandeCoordonnes( Tableaux * jeu, int numMot, int *x, int *y );
- void demandeDirection ( Tableaux *jeu, int numMot, int *dx, int *dy );
- int verifieDirCorrecte( int direction, int *dx, int *dy );
- int verifieInterference( Tableaux jeu, int numMot );
- int calculeDerniereCoord( Tableaux * jeu, int numMot );
- void placerMot( Tableaux * jeu, int numMot );
- // Une fois qu'on a placé tous les mots, on complete aléatoirement la grille
- void completeGrille( Tableaux * jeu );
- // C'est le moment où le joueur joue enfin
- void reglesPhaseDeJeu();
- int phaseDeJeu( Tableaux jeu );
- int coupleEgal( int numMot, int a, int b, Tableaux jeu );
- // Gestion des fichiers
- int menuFichier( int argc, const char ** argv );
- void metMotsDansFichier( FILE * fichier, Tableaux jeu );
- void metGrilleDansFichier( FILE * fichier, Tableaux jeu );
- void metCoordDansFichier( FILE * fichier, Tableaux jeu );
- void affichePlateauGraph( Tableaux jeu );
- void placerLettresGraph( Tableaux jeu );
- void afficheLesMotsGraph( Tableaux jeu );
- void motEnCouleur ( Tableaux jeu );
- void boutonsGraph( Tableaux jeu );
- int afficheConsigne( Tableaux jeu, int motChoisi, int numMot );
- int clicDansCase( Tableaux jeu, int x, int y, int numMot );
- int clicSurBoutons( Tableaux jeu, int x );
- int clicDansFenetre( Tableaux jeu );
- void dessineTout( Tableaux jeu );
- void modeGraphique( Tableaux * jeu );
- /**************************************
- ******* FONCTIONS
- ** - Dans toutes les fonctions, le paramètre "jeu"
- ** contient toutes les informations nécéssaires.
- ** - Les noms de variables sont sans équivoque.
- ** - Le parametre numMot indique le numéro du mot dont on parle.
- ** - La plupart des fonctions de vérification renvoient 0 pour indiquer
- ** que le test doit être refait
- ***************************************/
- /**************************************
- ******* Initialisation du jeu
- ***************************************/
- /* Fonction demandant la taille de diverses choses, renvoie une taille sécurisée*
- *sécurisée: dans l'intervalle souhaité par le codeur
- */
- int demandeTaille( int max ){
- int n;
- do {
- scanf( "%d", &n ) ;
- } while ( estDansIntervalle( n, 1, max ) == 0 );
- return n;
- }
- /* Fonction initialisant les principales caractéristiques des tableaux
- la taille de la grille,
- le nombre maximum de mots à placer,
- la taille max que peuvent avoir les mots.
- */
- void propJeu( Tableaux * jeu ){
- // on fait attention à bien sécuriser les saisies
- printf( "De quelle taille voulez vous le plateau ( max 15 ) ?\n" );
- jeu -> grille.taille = demandeTaille( 15 );
- // On ne peut entrer qu'un nombre de mots inférieur à la taille de la grille
- printf( "Combien de mots voulez vous entrer (max %d) ?\n", jeu -> grille.taille );
- jeu -> mots.nbMots = demandeTaille( jeu -> grille.taille );
- // La taille max est définie par la longueur d'une grille
- // Pour être sûr de ne pas se retrouver avec un mot implaçable dans la grille
- jeu -> mots.tailleMax = jeu -> grille.taille;
- jeu -> graph.longueur = 800;
- jeu -> graph.largeur = 640;
- jeu -> graph.tailleGrille = 500;
- jeu -> graph.tailleCase = ( jeu -> graph.tailleGrille ) / ( jeu -> grille.taille ) ;
- }
- /* Fonction remplissant la grille d'espaces jusqu'à la taille demandée */
- void initPlateau( Tableaux * jeu ){
- for ( size_t i = 0; i < jeu -> grille.taille; i++ ) {
- for ( size_t j = 0; j < jeu -> grille.taille; j++ ) {
- jeu -> grille.plateau[i][j] = ' ';
- }
- }
- }
- /* Fonction affichant la grille sur le terminal */
- void affichePlateau( Tableaux jeu ){
- int i;
- int j;
- // Affiche 0,1,2...n en haut de la grille pour se repérer avec les colonnes
- for ( i = 0; i < jeu.grille.taille; i++ ) {
- printf( "|%d", i + 1 );
- }
- printf( "\n\n" );
- // Affiche case par case la grille avec le caractere à l'intérieur
- for ( i = 0; i < jeu.grille.taille; i++ ) {
- for ( j = 0; j < jeu.grille.taille; j++ ) {
- printf( "|%c", jeu.grille.plateau[i][j] );
- }
- // Affiche les mots à droite de la grille (nbMots toujours <= à grille.taille)
- if ( i < jeu.mots.nbMots ){
- printf( "| %d \t\t%d:%s", i + 1, i, jeu.mots.listeMots[i].mot );
- }
- printf( "| %d\n", i + 1 );
- }
- printf( "%d %d \n", jeu.mots.listeMots[0].xFin, jeu.mots.listeMots[0].yFin );
- }
- /* Fonction renvoyant 0 si un point appartient à un intervalle fermé, 1 sinon
- :param point: peut correspondre à un nombre ou une lettre dont on veut
- vérifier l'appartenance à un intervalle ([min, max] ou ['A', 'Z'] par exemple)
- :param min, max: peuvent être des lettres ou entiers puisque
- le type char est inclu dans le type int
- */
- int estDansIntervalle( int point, int min, int max ){
- return ( ( point >= min ) && ( point <= max) );
- }
- /**************************************
- ******* GESTIONS DES MOTS
- ***************************************/
- /* Fonction principale pour la saisie des mots,
- faisant la liaison avec tout le reste
- On y demande l'ensemble des mots, on les stocke dans la structure listeMots[]
- et on affiche ceux-ci
- */
- void choixDesMots( Tableaux * jeu ){
- printf( "Veuillez saisir %d mots\n", jeu -> mots.nbMots );
- demandeLesMots( &* jeu );
- afficheLesMots( * jeu );
- }
- /* Fonction secondaire pour la saisie des mots,
- On demande nbMots* à l'utilisateur
- *nbMots: nombre de mots précédemment demandé à l'utilsateur
- */
- void demandeLesMots( Tableaux * jeu ){
- for ( size_t i = 0; i < jeu -> mots.nbMots; i++ ) {
- saisirMot( jeu, i );
- }
- }
- /* Fonction secondaire pour la saisie des mots,
- On demande à l'utilisateur d'entrer un mot,
- on VERIFIE si le mot est bien un mot en majuscule de taille correcte
- puis on stocke le mot ainsi que sa taille dans la liste des mots.
- */
- void saisirMot( Tableaux * jeu, int numMot ){
- char mot [50]; // On essaie de prévoir si l'utilsateur fait des bêtises
- int tailleMot; // On aura besoin de comparer la taille du mot
- // avec la taille max autorisée
- do {
- // Sécurisation du procéssus,
- // tant que l'utilisateur fait des bêtises, on recommence
- printf( "Saisir le %de mot en majuscule de taille max %d\n",
- numMot + 1, jeu -> mots.tailleMax );
- scanf( "%s", mot );
- tailleMot = strlen( mot );
- // On a donc besoin de vérifier la taille et si le mot est en majuscule
- } while ( ( tailleMot >= jeu -> mots.tailleMax ) ||
- ( verifieMotCorrect( tailleMot, mot ) == 0 ) );
- // Une fois qu'on est sûr que l'utilsateur est conscient de ce qu'il fait
- // On peut ajouter le mot à la liste des mots
- strcpy( jeu -> mots.listeMots[numMot].mot, mot );
- jeu -> mots.listeMots[numMot].taille = strlen( mot );
- }
- /* Fonction découlant de la précédente,
- on vérifie si le mot est en majuscule, on renvoie 1 si c'est le cas, 0 sinon
- les paramètres ne sont pas Tableaux * jeu car on veut être sûr de ne pas
- ajouter des bêtises de l'utilisateur
- :param tailleMot: taille du mot saisi (la taille est vérifiée avant les majs)
- :param mot: le mot saisi par l'utilsateur
- */
- int verifieMotCorrect( int tailleMot, char mot[tailleMot] ){
- for ( size_t i = 0; i < tailleMot; i++ ) {
- // Parcours de l'ensemble des lettre du mot
- if ( estDansIntervalle( mot[i], 'A', 'Z' ) == 0 ){
- // Si une seule n'est pas en majuscule (ou n'est pas une lettre)
- // on renvoie 0 pour signifier qu'on recommence la saisie
- printf( "Le mot saisi n'est pas en majuscule\n" );
- return 0;
- }
- }
- // Si tout s'est bien passé jusqu'ici, on a un mot en majuscule, on renvoie 1
- return 1;
- }
- /* Fonction affichant les mots après les avoir saisis, rien de particulier
- */
- void afficheLesMots( Tableaux jeu ){
- printf( "Les mots séléctionnés sont: \n" );
- for ( size_t i = 0; i < jeu.mots.nbMots; i++ ) {
- printf( "%s\n", jeu.mots.listeMots[i].mot );
- }
- }
- /* Fonction affichant les règles pour la direction d'un mot
- DIFFERENCE AVEC L'ENNONCÉ:
- on trouvait plus pratique de s'orienter grâce au pavé numérique
- plutôt qu'avec le plateau donné
- */
- void afficheReglesDirection( ){
- printf( "Le pavé numérique correspond aux directions, donc:\n\
- 8 pour Nord\n\
- 9 pour Nord-Est\n\
- 6 pour Est\n\
- 3 pour Sud-Est\n\
- 2 pour Sud\n\
- 1 pour Sud-Ouest\n\
- 4 pour Ouest\n\
- 7 pour Nord-Ouest\n" );
- }
- /* Fonction s'executant après avoir obtenu tous les mots
- On demande, pour chaque mot, la coordonnées de la première lettre
- On vérifiera plus tard que deux mots ne peuvent pas se chevaucher
- sauf cas particulier (fonction interference).
- */
- void demandeCoordonnes( Tableaux * jeu, int numMot, int *x, int *y){
- // On attend de l'utilisateur qu'il essaie de rentrer des coordonnées
- // valables jusqu'à reussir, il peut le faire !!
- do {
- printf( "Veuillez saisir les coordonnées (x,y) pour la première lettre de %s\n",
- jeu -> mots.listeMots[numMot].mot );
- scanf( "%d%d", &*x, &*y ); // &*x est la même chose que x
- } while( ( estDansIntervalle( *x, 0, jeu -> grille.taille ) == 0 )
- || ( estDansIntervalle( *y, 0, jeu -> grille.taille ) == 0 ) );
- // Une fois qu'il a réussi, on stocke le couple (x,y) correspondant à
- // La première lettre.
- jeu -> mots.listeMots[numMot].xDebut = *x;
- jeu -> mots.listeMots[numMot].yDebut = *y;
- }
- /* Fonction palpitante transmettant par adresse l'orientation du mot choisi
- :param direction: voir afficheReglesDirection()
- :param *dx et *dy: sens en x et sens en y
- On renvoie 1 si l'utilisateur a entré une direction correcte,
- 0 s'il n'est pas doué. (dans ce cas on recommence)
- */
- int verifieDirCorrecte( int direction, int *dx, int *dy ){
- switch ( direction ) {
- // Adaptation selon le modèle N NE E SE S SO O NO
- case 8:
- *dx = -1; *dy = 0; break;
- case 9:
- *dx = -1; *dy = 1; break;
- case 6:
- *dx = 0; *dy = 1; break;
- case 3:
- *dx = 1; *dy = 1; break;
- case 2:
- *dx = 1; *dy = 0; break;
- case 1:
- *dx = 1; *dy = -1; break;
- case 4:
- *dx = 0; *dy = -1; break;
- case 7:
- *dx = -1; *dy = -1; break;
- default: return 0;
- }
- return 1;
- }
- /* Fonction récupérant la direction du mot en vérifiant encore que l'utilisateur
- entre une direction correcte.
- Une fois qu'il est intelligent, on ajoute dans jeu l'orientation choisie
- */
- void demandeDirection ( Tableaux *jeu, int numMot, int *dx, int *dy ){
- int direction;
- int mauvaiseValeur = 0;
- do {
- printf( "Veuillez saisir la direction pour placer %s\n",
- jeu -> mots.listeMots[numMot].mot );
- scanf( "%d", &direction );
- // On teste si l'utilisateur donne une direction correcte au cas où
- mauvaiseValeur = verifieDirCorrecte( direction, &*dx, &*dy );
- } while ( mauvaiseValeur == 0);
- jeu -> mots.listeMots[numMot].dx = * dx;
- jeu -> mots.listeMots[numMot].dy = * dy;
- }
- /* Fonction assez importante, vérifie si -- après saisie des coordonnées
- et direction -- le mot se situe toujours dans la grille ou pas
- renvoie 0 si non, 1 si oui
- */
- int calculeDerniereCoord( Tableaux * jeu, int numMot ){
- // Le calcul n'est pas palpitant par contre, on trouve par magie la dernière
- // coordonnée en x et en y et on compare après selon l'intervalle
- // [0, grille.taille]
- jeu -> mots.listeMots[numMot].xFin = jeu -> mots.listeMots[numMot].xDebut
- + jeu -> mots.listeMots[numMot].taille
- * jeu -> mots.listeMots[numMot].dx;
- jeu -> mots.listeMots[numMot].yFin = jeu -> mots.listeMots[numMot].yDebut
- + jeu -> mots.listeMots[numMot].taille
- * jeu -> mots.listeMots[numMot].dy;
- // Tout ça pour indiquer si on doit recommencer la saisie
- // des coords et de la direction ou pas
- return ( ( estDansIntervalle( jeu -> mots.listeMots[numMot].xFin, 0, jeu -> grille.taille ) )
- && ( estDansIntervalle( jeu -> mots.listeMots[numMot].yFin, 0, jeu -> grille.taille ) ) );
- }
- /* Fonction aussi importante, elle sert à ne pas écraser un mot placé
- dans la grille par les mots suivants sauf cas particulier*
- * cas particulier: une lettre est en commun avec plusieurs mots
- à une position précise
- Renvoie 1 si tout s'est bien passé, 0 si le mot est impossible à placer
- */
- int verifieInterference( Tableaux jeu, int numMot ){
- // On pourrait ne pas utliser 4 variables mais l'écriture serait trop lourde.
- int x = jeu.mots.listeMots[numMot].xDebut;
- int y = jeu.mots.listeMots[numMot].yDebut;
- int dx = jeu.mots.listeMots[numMot].dx;
- int dy = jeu.mots.listeMots[numMot].dy;
- // Le premier mot à être placé n'a par définition aucun autre mot qui le gène
- if ( numMot == 0 ) return 1;
- for ( size_t numLettre = 0; numLettre < jeu.mots.listeMots[numMot].taille; numLettre++ ) {
- // On parcours, case par case, selon les coords de la première
- // et de la direction choisie, la grille, et si on rencontre un problème
- // On renvoie 0, sinon on continue jusqu'à la fin et on renverra 1.
- if ( jeu.grille.plateau[ x + numLettre * dx ][y + numLettre * dy ] != ' ' ){
- if ( jeu.grille.plateau[x + numLettre * dx ][y + numLettre * dy]
- == jeu.mots.listeMots[numMot].mot[numLettre] ){
- continue;
- }
- else{ return 0; }
- }
- }
- return 1;
- }
- /* Fonction qui, après être sûr et certain que les mots ont le droit
- d'être placés, les place...
- les coordonnées (x,y) indiquant la position de la dernière lettre
- sont stockés avec le mot
- */
- void placerMot( Tableaux * jeu, int numMot ){
- // Pareil qu'au dessus
- int x = jeu -> mots.listeMots[numMot].xDebut;
- int y = jeu -> mots.listeMots[numMot].yDebut;
- int dx = jeu -> mots.listeMots[numMot].dx;
- int dy = jeu -> mots.listeMots[numMot].dy;
- int numLettre;
- for ( numLettre = 0 ; numLettre < (jeu -> mots.listeMots[numMot].taille); numLettre ++ ) {
- // Place lettre par lettre le mot dans la grille
- jeu -> grille.plateau[x + numLettre * dx ][y + numLettre * dy ]
- = jeu -> mots.listeMots[numMot].mot[numLettre];
- }
- // Stocke les coordonnées de dernière lettre
- jeu -> mots.listeMots[numMot].xFin = x + numLettre * dx;
- jeu -> mots.listeMots[numMot].yFin = y + numLettre * dy;
- }
- /* Fonction principale pour la gestion des mots, fait le liaison
- entre le main et toutes les fonctions gérant ça
- elle demande simplement pour chaque mots:
- les coordonnées
- la direction
- une fois qu'on a rentré ces deux infos correctes, il reste à vérifier:
- les interferences
- et une fois que tout ceci est vérifier, on place le mot
- et on re-affiche la grille pour rappeler à l'utilisateur où il en est.
- */
- void gestionPlacement( Tableaux * jeu ){
- afficheReglesDirection( );
- for ( size_t numMot = 0; numMot < jeu -> mots.nbMots ; numMot++ ) {
- // "booleens" servant à la vérification des bonnes saisies
- int coordValable = 0;
- int interferenceValable = 0;
- // variables temporaires avant d'avoir les vrais stockés dans la structure
- int x;
- int y;
- int dx = 0;
- int dy = 0;
- do { // Il faut que les 3 conditions soient correctes
- do { // Mais on doit d'abord vérifier les deux premières,
- // la 3e n'a aucun sens sinon
- demandeCoordonnes( jeu, numMot, &x, &y );
- demandeDirection( jeu, numMot, &dx, &dy );
- coordValable = calculeDerniereCoord( jeu, numMot );
- } while ( coordValable == 0 );
- interferenceValable = verifieInterference( * jeu, numMot );
- } while ( interferenceValable == 0 );
- // On place le mot et on re-affiche le plateau
- placerMot( jeu, numMot );
- affichePlateau( * jeu );
- jeu -> mots.listeMots[numMot].dejaClique = 0;
- }
- }
- /* Fonction complétant aléatoirement par des lettres minuscules la grille
- Pas grand chose de spécial ici
- */
- void completeGrille( Tableaux * jeu ){
- char lettre;
- srand( time( NULL ) );
- for ( size_t i = 0; i < jeu -> grille.taille; i++ ) {
- for ( size_t j = 0; j < jeu -> grille.taille; j++ ) {
- if ( jeu -> grille.plateau[i][j] == ' ' ){
- lettre = rand( ) % ('z' - 'a' + 1) + 'a';
- jeu -> grille.plateau[i][j] = lettre;
- }
- }
- }
- }
- /**************************************
- ******* RETROUVER LES MOTS
- ***************************************/
- /* Fonction donnant 1 si (a,b) == (c,d) ou (a,b) == (e,f), 0 sinon
- elle permet de comparer si l'utilsateur entre des coords correctes
- au moment où il doit retrouver un mot
- */
- int coupleEgal( int numMot, int a, int b, Tableaux jeu ){
- int c = jeu.mots.listeMots[numMot].xDebut;
- int d = jeu.mots.listeMots[numMot].yDebut;
- int e = jeu.mots.listeMots[numMot].xFin;
- int f = jeu.mots.listeMots[numMot].yFin;
- return ( a == c && b == d ) || ( a == e && b == f );
- }
- /* Dernière partie du déroulement du jeu, c'est ici que l'utilsateur va
- devoir retrouver les mots cachés dans la grille
- L'utilisateur a le droit de rentrer les coords du debut OU de la fin du mot
- cependant, s'il veut tricher et rentrer deux fois les mêmes coords,
- c'est impossible
- L'utilisateur entre le numéro du mot qu'il pense avoir trouvé
- (indiqué à droite de la grille), puis les coordonnées.
- renvoie 1 s'il a gagné, 0 sinon
- */
- int phaseDeJeu( Tableaux jeu ){
- // Nombre de mots déjà trouvés par l'utilsateur
- int motsTrouves = 0;
- //
- int numMot; // Numéro du mot que l'utilsateur saisira
- int x,y; // coordonnées x, y que l'utilsateur saisira
- int tmpx, tmpy; // coordonnées x et y pour avoir une trace au cas où
- // l'user essaie de tricher
- do {
- // Les seuls moyens de sortir de la boucle sont de gagner ou abandonner
- printf( "Quel numéro de mot pensez vous avoir trouvé ?\n" );
- scanf( "%d", &numMot );
- // Abandon du joueur, comme précisé dans les règles
- if ( numMot == -1 ) return 0;
- printf( "Indiquez les coordonnées du début du mot.\n" );
- scanf( "%d%d", &x, &y );
- if ( coupleEgal( numMot, x, y, jeu ) == 1 ){
- tmpx = x;
- tmpy = y;
- printf( "Entre les coordonnées de la fin du mot\n" );
- scanf( "%d%d", &x, &y );
- // Vérification si l'user n'essaie pas de tricher
- if ( ( tmpx != x || tmpy != y ) && ( coupleEgal(numMot, x, y, jeu) == 1 ) ){
- printf( "FELICITATIONS vous avez trouvé le mot %s\n",
- jeu.mots.listeMots[numMot].mot );
- // Si l'utilisateur trouve les coords de la première et dernière lettre
- motsTrouves += 1; // On augmente le nombre de mots trouvés
- }
- else{
- printf( "Non, le mot ne se termine pas ici, recommencez\n" );
- }
- }
- } while( motsTrouves < jeu.mots.nbMots );
- // L'utilisateur a trouvé tous les mots qu'il fallait, il a gagné
- printf("Bravo, vous avez gagné\n");
- return 1;
- }
- void reglesPhaseDeJeu( ){
- printf( "Vous entrez désormais dans la phase de jeu.\n\
- Le but est de trouver les mots affichés à droite du tableau\n\
- Pour y parvenir, vous devez simplement entrer le numéro du mot ainsi que \n\
- les coordonnées (x, y) de la première et de la dernière du mot que vous voulez trouver.\n\
- Les mots trouvés apparaîtront en minuscule.\n\
- Ecrivez -1 pour abandonner\n" );
- }
- /**************************************
- ******* FICHIERS: Ecriture
- ***************************************/
- /* Valeurs de renvoi:
- 0: mode ascii sans fichier
- 1: mode graphique avec sauvegarde dans fichier
- 2: mode ascii avec sauvegarde dans fichier
- 3: mode graphique en chargeant un fichier
- 4: mode ascii en chargeant un fichier
- */
- int menuFichier( int argc, const char ** argv ){
- if ( argc == 3 ){
- if ( (argv[1][0] != '-' ) && (argv[2][0] == '-') ){
- if (argv[2][1] == 'c'){
- if ( argv[2][2] == 'g' ) return 1;
- printf("La grille que aller créer sera enregistrée dans %s\n", argv[1]);
- return 2;
- }
- else if ( argv[2][1] == 'r'){
- if ( argv[2][2] == 'g' ) return 3;
- printf("La grille du fichier %s sera lue si elle existe\n", argv[1]);
- return 4;
- }
- }
- }
- return 0;
- }
- void metGrilleDansFichier( FILE * fichier, Tableaux jeu ){
- int i;
- int j;
- for ( i = 0; i < jeu.grille.taille; i++ ){
- for ( j = 0; j < jeu.grille.taille; ++j ){
- fprintf( fichier, "%c", jeu.grille.plateau[i][j] );
- }
- fputs( "\n", fichier );
- }
- }
- void metMotsDansFichier( FILE * fichier, Tableaux jeu ){
- int numMot;
- for ( numMot = 0; numMot < jeu.mots.nbMots; numMot++ ){
- fprintf( fichier, "%s;\n", jeu.mots.listeMots[numMot].mot );
- }
- }
- void metCoordDansFichier( FILE * fichier, Tableaux jeu ){
- int i;
- for ( i = 0; i < jeu.mots.nbMots; i++ ){
- fprintf( fichier, "%2d", jeu.mots.listeMots[i].xDebut );
- fprintf( fichier, "%2d", jeu.mots.listeMots[i].yDebut );
- fprintf( fichier, "%2d", jeu.mots.listeMots[i].xFin );
- fprintf( fichier, "%2d", jeu.mots.listeMots[i].yFin );
- }
- fputs( "\n", fichier );
- }
- void reglesFichier(){
- printf("Le mode par défaut est le mode ASCII.\n\
- Aucun fichier n'est utlisé par défaut.\n\
- Pour utiliser un fichier, veuillez re-executer\
- en suivant les instructions suivantes:\n\
- ./nomFichier -ca fichier.txt pour\
- créer un fichier, le stocker et jouer en ASCII\n\
- ./nomFichier -cg fichier.txt pour\
- créer un fichier, le stocker et jouer en mode graphique\n\
- ./nomFichier -ra fichier.txt pour\
- charger un fichier et le jouer en ASCII\n\
- ./nomFichier -rg fichier.txt pour\
- charger un fichier et le jouer en graphique\n\n\
- Si vous faites une erreur (charger un fichier qui n'existe pas)\
- Le mode par défaut sera executé\n ");
- }
- /**************************************
- ******* Graphique
- ******* note: les fonctions s'adaptent
- ******* parfaitement à n'importe quelle grille
- ***************************************/
- /* Cette fonction affiche les cases d'une grille,
- le nord ouest de la grille commence à (40,40)
- le sud est se fini à (jeu.graph.tailleGrille (540 par défaut ))
- */
- void messageFin( Tableaux jeu ){
- MLV_clear_window( MLV_COLOR_WHITE );
- MLV_draw_text( jeu.graph.longueur / 3,
- jeu.graph.largeur / 2,
- "FELICITATIONS ! Vous avez gagné !",
- MLV_COLOR_GREY );
- MLV_actualise_window();
- }
- void affichePlateauGraph( Tableaux jeu ){
- int i;
- int j;
- for ( i = 40 ; i < jeu.graph.tailleGrille ; i += jeu.graph.tailleCase ){
- for ( j = 40 ; j < jeu.graph.tailleGrille ; j += jeu.graph.tailleCase ){
- MLV_draw_rectangle( i, j, jeu.graph.tailleCase,
- jeu.graph.tailleCase, MLV_COLOR_GREY );
- MLV_actualise_window();
- }
- }
- }
- /* Cette fonction, sur le modèle de la précédente, affiche une par une
- les lettres de la grille, mêmes calculs à peu près
- */
- void placerLettresGraph( Tableaux jeu ){
- int tailleCase = jeu.graph.tailleCase;
- char copieLettre[2];
- int i,j;
- for ( i = 0; i < jeu.grille.taille; i++ ){
- for ( j = 0; j < jeu.grille.taille ; j++ ){
- copieLettre[0] = jeu.grille.plateau[i][j];
- copieLettre[1] = '\0';
- MLV_draw_text( 35 + tailleCase * ( 0.5 + j ),
- 35 + tailleCase * ( 0.5 + i ),
- copieLettre , MLV_COLOR_GREY );
- MLV_actualise_window();
- }
- }
- }
- void afficheLesMotsGraph( Tableaux jeu ){
- int i;
- int tailleMot;
- for ( i = 0; i < jeu.mots.nbMots; i++){
- tailleMot = jeu.mots.listeMots[i].taille;
- jeu.mots.listeMots[i].mot[tailleMot + 1] = '\0';
- MLV_draw_text( 35 + jeu.graph.tailleGrille + jeu.graph.tailleCase,
- (i + 1.5 ) * jeu.graph.tailleCase ,
- jeu.mots.listeMots[i].mot,
- MLV_COLOR_GREY );
- MLV_actualise_window();
- }
- }
- /* Cette fonction met un mot que l'on a trouvé en couleur
- le calcul pour placer le mot est un peu plus compliqué mais pas intéressant
- on a besoin d'écrire lettre par lettre le mot
- voir verifieInterference() pour un peu plus de détails sur dx et dy
- */
- /*
- void motEnCouleur ( Tableaux jeu, int numMot ){
- int lettre;
- char copieLettre[2];
- int tailleCase = jeu.graph.tailleCase;
- dessineTout( jeu );
- int id;
- for ( id = 0; id < jeu.mots.listeMots[id].taille; id++ ){
- if ( jeu.mots.listeMots[id].dejaClique == 1){
- printf("ET ICI ON A %d\n", id );
- for (lettre = 0; lettre < jeu.mots.listeMots[id].taille ; lettre++ ){
- copieLettre[0] = jeu.mots.listeMots[id].mot[lettre];
- copieLettre[1] = '\0';
- MLV_draw_text( 35 + tailleCase *
- ( 0.5 + jeu.mots.listeMots[id].dy * lettre),
- 35 + tailleCase * (0.5 + jeu.mots.listeMots[id].dx * lettre),
- copieLettre , MLV_COLOR_RED );
- MLV_actualise_window();
- }
- }
- }
- }
- */
- void motEnCouleur( Tableaux jeu ){
- int lettre, numMot;
- char copieLettre[2];
- for (size_t numMot = 0; numMot < jeu.mots.nbMots; numMot++) {
- if ( jeu.mots.listeMots[numMot].dejaClique == 1 ){
- for (size_t lettre = 0; lettre < jeu.mots.listeMots[mot].taille; lettre++) {
- copieLettre[0] = jeu.mots.listeMots[numMot].mot[lettre];
- copieLettre[1] = '\0';
- MLV_draw_text( 35 + tailleCase *
- ( 0.5 + jeu.mots.listeMots[id].dy * lettre),
- 35 + tailleCase * (0.5 + jeu.mots.listeMots[id].dx * lettre),
- copieLettre , MLV_COLOR_RED );
- MLV_actualise_window();
- }
- }
- }
- }
- /* Fonction affichant des boutons en bas de la grille
- Boutons Quitter à gauche, rejouer à droite de quitter
- Pas spécialement intéréssant
- */
- void boutonsGraph( Tableaux jeu ){
- // Boutons Quitter et Rejouer en bas de la grille
- MLV_draw_rectangle( 40 + jeu.graph.tailleGrille / 10,
- 60 + jeu.graph.tailleGrille,
- 0.4 * jeu.graph.tailleGrille, 40, MLV_COLOR_GREY );
- MLV_actualise_window();
- MLV_draw_rectangle( 40 + 0.4*jeu.graph.tailleGrille + jeu.graph.tailleGrille / 10,
- 60 + jeu.graph.tailleGrille,
- 0.4 * jeu.graph.tailleGrille, 40, MLV_COLOR_GREY );
- MLV_actualise_window();
- }
- /* Fonction affichant un texte en bas de l'écran dans un cas particulier *
- *cas particulier: le joueur a selectionné un mot
- mais s'est trompé sur son emplacement
- si le joueur a en fait trouvé le mot, il sera affiché en rouge:
- renvoie 0 ou 1, 0: le joueur n'a pas trouvé de mot,
- 1: il l'a fait donc ça fait un mot de plus
- */
- int afficheConsigne( Tableaux jeu, int motChoisi, int numMot ){
- if ( motChoisi == 0 ){
- MLV_draw_text( 40 + jeu.graph.tailleCase,
- 2 * jeu.graph.tailleCase + jeu.graph.tailleGrille,
- "La case ne correspond à aucun mot, cliquez à nouveau sur un mot.",
- MLV_COLOR_GREY);
- MLV_actualise_window();
- }
- else {
- printf("MARCHE STP\n");
- jeu.mots.listeMots[numMot].dejaClique = 1;
- motEnCouleur( jeu );
- }
- return motChoisi;
- }
- /* Fonction assez importante traitant celle du dessus,
- elle détecte sur quelle case on a cliqué et agit en conséquence
- et renvoie la valeur trouvée au dessus (voir le commentaire)
- */
- int clicDansCase( Tableaux jeu, int x, int y, int numMot ){
- int i, j;
- int tailleCase = jeu.graph.tailleCase;
- for ( i = 40 ; i < jeu.graph.tailleGrille ; i += jeu.graph.tailleCase ){
- for ( j = 40 ; j < jeu.graph.tailleGrille ; j += jeu.graph.tailleCase ){
- if ( ( estDansIntervalle( y, i, i + tailleCase ) != 0 ) &&
- ( estDansIntervalle( x, j, j + tailleCase ) != 0 ) ) {
- return afficheConsigne( jeu,
- ( coupleEgal ( numMot, i / 40 - 1, j / 40 - 1, jeu ) != 0 ),
- numMot );
- }
- }
- }
- }
- /* Fonction donnant un signal pour fermer la fenetre si l'utilisateur
- veut abandonner, ou relance une partie si l'utilisateur veut rejouer
- */
- /*
- void convertitClicEnCoord( int x, int y, * i, * j ){
- float a = ( x / jeu.graph.tailleCase);
- float b = ( y / jeu.graph.tailleCase);
- *i = int (a);
- *j = int (b);
- }
- */
- int clicSurMots( Tableaux jeu, int x, int y ){
- float a = ( y / jeu.graph.tailleCase ) ;
- return (int) a ;
- }
- int clicSurBoutons( Tableaux jeu, int x ){
- // Le joueur clique sur quitter
- if ( x < jeu.graph.tailleGrille / 2 ) return -100;
- // Le joueur clique sur rejouer
- return 100;
- }
- /* Fonction sans doute la plus importante du mode graphique
- Elle trouve dans quelle zone de la fenetre le joueur a cliqué
- et renvoie les valeurs de retour expliquées plus haut
- les calculs ne sont pas intéréssants
- */
- int clicDansFenetre( Tableaux jeu ){
- int x, y;
- MLV_wait_mouse( &x, &y );
- int numMot = clicSurMots( jeu, x, y ) - 1;
- printf("LE NUMERO DU MOT EST %d\n", numMot);
- // On vérifie d'abord si le joueur a cliqué dans la grille
- if ( ( estDansIntervalle( x, 40, jeu.graph.tailleGrille ) ) &&
- ( estDansIntervalle( y, 40, jeu.graph.tailleGrille ) ) ){
- return clicDansCase( jeu, x, y, numMot );
- }
- // Si c'est pas le cas, il a peut-êtr cliqué sur un bouton
- else if ( ( estDansIntervalle( x, 40 + jeu.graph.tailleCase,
- 40 + jeu.graph.tailleCase + 0.4 * jeu.graph.tailleGrille ) ) &&
- ( estDansIntervalle( y, jeu.graph.tailleCase + jeu.graph.tailleGrille,
- jeu.graph.tailleCase + jeu.graph.tailleGrille + 40 ) ) ){
- //return clicSurBoutons()
- }
- return 0;
- }
- /* Fonction appelant les fonctions de dessin */
- void dessineTout( Tableaux jeu ){
- MLV_clear_window( MLV_COLOR_WHITE );
- affichePlateauGraph( jeu );
- placerLettresGraph( jeu );
- afficheLesMotsGraph( jeu );
- boutonsGraph( jeu );
- }
- /* Fonction principale du mode graphique, c'est ici que le jeu va se dérouler
- elle est très semblable à la fonction phaseDeJeu()
- On commence par créer une fenetre, on initialise le nombre de mots trouvés à 0
- on dessine tout à chaque nouveau clic et les valeurs de retour de
- clicDansFenetre() sont: {-100: abandon, 0: mot non trouvé, 1, mot trouvé,
- 100, rejouer }
- une fois que c'est fini, par une victoire, un abandon ou après avoir rejoué
- on ferme la fenetre et le programme se fini
- */
- void modeGraphique( Tableaux * jeu ){
- MLV_create_window( "Mots Mélés", "Partie Graphique",
- jeu -> graph.longueur, jeu -> graph.largeur );
- jeu -> mots.nbMotsTrouves = 0;
- do {
- dessineTout( * jeu );
- jeu -> mots.nbMotsTrouves += clicDansFenetre( * jeu );
- if ( jeu -> mots.nbMotsTrouves < 0 ||
- jeu -> mots.nbMotsTrouves > 30 ) break;
- } while ( jeu -> mots.nbMotsTrouves < jeu -> mots.nbMots );
- MLV_wait_seconds( 2 );
- messageFin( * jeu );
- MLV_wait_seconds( 6 );
- MLV_free_window();
- }
- /**************************************
- ******* main
- ***************************************/
- /* Fonction en plusieurs temps
- D'abord on initialise les constituants principaux d'une partie
- Puis on initialise le plateau
- on demande les mots à l'utilisateur, on les place
- on complète aléatoirement la grille
- et enfin on joue
- TODO: rajouter les fichiers et le mode graphique
- */
- int main( int argc, char const *argv[] ) {
- FILE * fichier = NULL;
- int mode = 1;
- Tableaux jeu;
- propJeu( &jeu );
- initPlateau ( &jeu);
- choixDesMots( &jeu );
- gestionPlacement( &jeu );
- completeGrille( &jeu );
- //affichePlateau( jeu );
- if (mode == 1){
- fichier = fopen(argv[1], "w");
- if (NULL != fichier){
- metMotsDansFichier(fichier, jeu );
- metGrilleDansFichier( fichier, jeu );
- metCoordDansFichier( fichier, jeu );
- }
- }
- affichePlateau( jeu );
- modeGraphique( &jeu );
- //reglesPhaseDeJeu( );
- //phaseDeJeu( jeu );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement