jsmmjr
-
Modifié le 29 juin 2023 à 15:57
[Dal]
Messages postés6203Date d'inscriptionmercredi 15 septembre 2004StatutContributeurDernière intervention29 janvier 2025
-
28 juin 2023 à 10:52
Bonjour,
J'ai commencer à coder en C un jeu de mots mêlés où l'on trouve des mots (appartenant à un thème) dans une grille. On peut choisir le thème que l'on veut et la taille de la grille.
On peut également se déplacer dans la grille grâce aux touches 2 (pour aller en bas), 4 (gauche), 6 (droite), et 8 (en haut). Néanmoins je suis bloquée à la sélection des mots, qui doit se poursuivre de cette manière :
Lorsque le joueur trouve un mot :
Positionne le curseur sur la première lettre du mot, appuie sur la touche espace,
Puis se déplace jusqu'à la dernière lettre du mot
Appuie à nouveau sur espace.
Lors de la sélection, dès qu'une lettre est sélectionnée elle est mise en évidence (en changeant de couleur par exemple).
Si le mot est correct il prend une nouvelle couleur qu'il conservera jusqu'à la fin de la partie.
Si le mot est incorrect les lettres retrouvent leurs couleurs d'origine.
Lorsque le joueur a trouvé tous les mots, un message de félicitations s'affiche, il peut ensuite retourner au menu.
Voici mon code:
Merci de m'aider.
#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<windows.h>#include<conio.h>#include<stdbool.h>#define taille_mot 20// Taille maximale d'un mot#define MAX_MOTS_TROUVES 25char motsTrouves[MAX_MOTS_TROUVES][taille_mot];int nbMotsTrouves =0;int taille_ligne =22;// Nombre de lignes de la grilleint taille_colonne =22;// Nombre de colonnes de la grilleint curseur_ligne =0;int curseur_colonne =0;// Déclaration de la variable 'mot'char mot[taille_mot];//création d'une procédure couleur pour changer la couleur du texte dans la console (feuille cours fonctions particulière)voidColor(int couleurDuTexte,int couleurDeFond){HANDLEH =GetStdHandle(STD_OUTPUT_HANDLE);//handle = identifiant unique attribué par le système de gestion des fenêtres //GetStdHandle = récupere le handle //Std_output.. = périphérique de sortie standardSetConsoleTextAttribute(H, couleurDeFond *16+ couleurDuTexte);}intcollisionMot(char grille[taille_ligne][taille_colonne],char mot[],int i,int j,int direction){int longueurMot =strlen(mot);//calcul de la longueur du mot pour la placer dans la variable longueurMotif(direction ==0){// si le Placement est horizontalfor(int l =0; l < longueurMot; l++){//on parcourt chaque caractère du mot grâce à lif(grille[i][j + l]!=' '&& grille[i][j + l]!= mot[l]){// si à cette position (i, j + l) il y a un espace vide ou lettre différente, alors y a une collision et on renvoit 1return1;}}}elseif(direction ==1){// Verticalfor(int l =0; l < longueurMot; l++){//idemif(grille[i + l][j]!=' '&& grille[i + l][j]!= mot[l]){return1;}}}elseif(direction ==4){// Diagonale descendantefor(int l =0; l < longueurMot; l++){if(grille[i + l][j + l]!=' '&& grille[i + l][j + l]!= mot[l]){return1;}}}elseif(direction ==5){// Diagonale montantefor(int l =0; l < longueurMot; l++){if(grille[i - l][j + l]!=' '&& grille[i - l][j + l]!= mot[l]){return1;}}}return0;}voidGrillegenere(char grille[taille_ligne][taille_colonne],char mots[][taille_mot],int nbMots){int i, j, k;int longueurMot;int direction;int collision;// Initialisation du générateur pour les nombres aléatoiressrand(time(NULL));// Initialisation de la grille avec des espaces videsfor(i =0; i < taille_ligne; i++){for(j =0; j < taille_colonne; j++){
grille[i][j]=' ';}}// Placement des mots dans la grillefor(k =0; k < nbMots; k++){
longueurMot =strlen(mots[k]);
direction =rand()%4;// pour les 4 directions possibles)
collision =0;if(direction ==0){// de gauche à droite)do{
i =rand()% taille_ligne;// la variable i va = à une position aléatoire dans la ligne (nombre aléatoire entre 0 et taille_ligne - 1)
j =rand()%(taille_colonne - longueurMot +1);// la variable j va = à une position aléatoire dans la colonne
collision =collisionMot(grille, mots[k], i, j, direction);// on appele la fonction collisionMot pour vérifier s'il y a une collision}while(collision);// la boucle continue tant qu'il y a une collisionfor(int l =0; l < longueurMot; l++){// en prcourant chaque caractère du mot,
grille[i][j + l]= mots[k][l];//}}elseif(direction ==1){// idem de (haut en bas)do{
i =rand()%(taille_ligne - longueurMot +1);
j =rand()% taille_colonne;
collision =collisionMot(grille, mots[k], i, j, direction);}while(collision);for(int l =0; l < longueurMot; l++){
grille[i + l][j]= mots[k][l];}}elseif(direction ==2){// idem droite à gauchedo{
i =rand()% taille_ligne;
j =rand()%(taille_colonne - longueurMot +1);
collision =collisionMot(grille, mots[k], i, j, direction);}while(collision);for(int l =0; l < longueurMot; l++){
grille[i][j + l]= mots[k][longueurMot -1- l];}}elseif(direction ==3){// odem de bas en hautdo{
i =rand()%(taille_ligne - longueurMot +1);
j =rand()% taille_colonne;
collision =collisionMot(grille, mots[k], i, j, direction);}while(collision);for(int l =0; l < longueurMot; l++){
grille[i + l][j]= mots[k][longueurMot -1- l];}}elseif(direction ==4){// Diagonale descendantedo{
i =rand()%(taille_ligne - longueurMot +1);
j =rand()%(taille_colonne - longueurMot +1);
collision =collisionMot(grille, mots[k], i, j, direction);}while(collision);for(int l =0; l < longueurMot; l++){
grille[i + l][j + l]= mots[k][l];}}elseif(direction ==5){// Diagonale montantedo{
i =rand()%(taille_ligne - longueurMot +1)+ longueurMot -1;
j =rand()%(taille_colonne - longueurMot +1);
collision =collisionMot(grille, mots[k], i, j, direction);}while(collision);for(int l =0; l < longueurMot; l++){
grille[i - l][j + l]= mots[k][l];}}}// Génération des lettres aléatoires pour les cases vides de la grillefor(i =0; i < taille_ligne; i++){for(j =0; j < taille_colonne; j++){if(grille[i][j]==' '){//si la case est vide on génére une lettr e majuscule
grille[i][j]='a'+rand()%26;}}}}voidafficherMotsTheme(char mots[][taille_mot],int nbMots){int motsParColonne =(nbMots +2)/4;// Calcul du nombre de mots par colonneprintf("\nMots à rechercher dans la grille:\n");for(int i =0; i < motsParColonne; i++){printf("%-20s", mots[i]);// Affichage du mot de la première colonneint index2 = i + motsParColonne;if(index2 < nbMots){printf("%-20s", mots[index2]);// Affichage du mot de la deuxième colonne}int index3 = i + motsParColonne *2;if(index3 < nbMots){printf("%-20s", mots[index3]);// Affichage du mot de la troisième colonne}int index4 = i + motsParColonne *3;if(index4 < nbMots){printf("%s", mots[index4]);}printf("\n");}printf("\n");}voidafficherGrille(char grille[taille_ligne][taille_colonne]){int i, j;// Affichage de la grillefor(i =0; i < taille_ligne; i++){for(j =0; j < taille_colonne; j++){if((i + j)%2==0){//pour le pair/impair et avoir 2 couleursColor(0,7);//1er nombre (0) pour le texte et 2e nombre (7,14) pour le fond}else{Color(0,14);}printf("%c", grille[i][j]);printf(" ");Color(15,0);// après la grille on remet les couleur avec fond noir}printf("\n");}}// Variable pour suivre l'état de la touche "Entrée"bool entreeAppuyee =false;bool copieMotEnCours =false;int debutMot;voidafficherGrilleAvecCurseur(char grille[taille_ligne][taille_colonne]){int i, j;// Affichage de la grille avec le curseurfor(i =0; i < taille_ligne; i++){for(j =0; j < taille_colonne; j++){if(i == curseur_ligne && j == curseur_colonne){Color(15,4);// Curseur en couleur blanche sur fond rougeif(entreeAppuyee){// Marquer les cases visitées après avoir appuyé sur la touche "Entrée"Color(0,9);}}elseif((i + j)%2==0){// Pour le pair/impair et avoir 2 couleursColor(0,7);// 1er nombre (0) pour le texte et 2e nombre (7,14) pour le fond}else{Color(0,14);}printf("%c", grille[i][j]);printf(" ");Color(15,0);// Après la grille, on remet les couleurs avec fond noir}printf("\n");}}// Fonction de déplacement du curseurvoiddeplacerCurseur(char direction,char grille[taille_ligne][taille_colonne],char mots[][taille_mot],int nbMots){switch(direction){case'8':// Hautif(curseur_ligne >0)
curseur_ligne--;break;case'4':// Gaucheif(curseur_colonne >0)
curseur_colonne--;break;case'2':// Basif(curseur_ligne < taille_ligne -1)
curseur_ligne++;break;case'6':// Droiteif(curseur_colonne < taille_colonne -1)
curseur_colonne++;break;case' ':// Touche "Espace"if(!entreeAppuyee){
entreeAppuyee =true;
debutMot = curseur_ligne * taille_colonne + curseur_colonne;}else{
entreeAppuyee =false;int finMot = curseur_ligne * taille_colonne + curseur_colonne;// Extraire le mot entre 'debutMot' et 'finMot' de la grilleint indice =0;int start =min(debutMot, finMot);int end =max(debutMot, finMot);for(int i = start; i <= end; i++){int ligne = i / taille_colonne;int colonne = i % taille_colonne;
mot[indice]= grille[ligne][colonne];
indice++;}
mot[indice]='\0';// Terminer la chaîne de caractères// Vérifier si le mot est présent dans la liste des mots à rechercherbool motCorrect =false;for(int i =0; i < nbMots; i++){if(strcmp(mot, mots[i])==0){
motCorrect =true;break;}}if(motCorrect){// Vérifier si le mot a déjà été trouvébool dejaTrouve =false;for(int i =0; i < nbMotsTrouves; i++){if(strcmp(mot, motsTrouves[i])==0){
dejaTrouve =true;break;}}if(!dejaTrouve){strcpy(motsTrouves[nbMotsTrouves], mot);
nbMotsTrouves++;}if(dejaTrouve){printf("Mot déjà trouvé.\n");}else{printf("Mot correct !\n");}}else{printf("Mot incorrect.\n");}}break;}}voidafficherMotsTrouves(){printf("Mots déjà trouvés :\n");for(int i =0; i < nbMotsTrouves; i++){printf("%s\n", motsTrouves[i]);}printf("\n");}//structure pour représenter un thème et ses mots :typedefstruct{char theme[taille_mot];char mots[25][taille_mot];int nbMots;} Theme;Themethemes[10];int nbThemes =0;voidcreerTheme(){if(nbThemes >=10){printf("Nombre de thèmes maximum atteint.\n");return;}Themetheme;printf("Entrez le thème : ");scanf("%s", theme.theme);printf("Combien de mots ? (maximum 25) ");scanf("%d",&theme.nbMots);if(theme.nbMots >25){printf("Nombre de mots invalide.\n");return;}printf("Entrez les mots :\n");for(int i =0; i < theme.nbMots; i++){printf("Mot %d : ", i +1);scanf("%s", theme.mots[i]);}
themes[nbThemes]= theme;
nbThemes++;printf("Thème ajouté avec succès.\n");}voidthemesDefinis(){Themetheme1;strcpy(theme1.theme,"Animaux");// strcpy pour copier la chaîne de caractères d'une source vers une destinationstrcpy(theme1.mots[0],"chien");strcpy(theme1.mots[1],"chat");strcpy(theme1.mots[2],"kangourou");strcpy(theme1.mots[3],"grenouille");strcpy(theme1.mots[4],"gazelle");strcpy(theme1.mots[5],"chevre");strcpy(theme1.mots[6],"renard");strcpy(theme1.mots[7],"serpent");strcpy(theme1.mots[8],"abeille");strcpy(theme1.mots[9],"araignee");strcpy(theme1.mots[10],"lapin");strcpy(theme1.mots[11],"zebre");strcpy(theme1.mots[12],"phoque");strcpy(theme1.mots[13],"poirson");strcpy(theme1.mots[14],"poulet");strcpy(theme1.mots[15],"cheval");strcpy(theme1.mots[16],"chameau");strcpy(theme1.mots[17],"cafard");strcpy(theme1.mots[18],"poussin");strcpy(theme1.mots[19],"truie");strcpy(theme1.mots[20],"furet");strcpy(theme1.mots[21],"aigle");strcpy(theme1.mots[22],"leopard");
theme1.nbMots =23;
themes[nbThemes]= theme1;
nbThemes++;Themetheme2;strcpy(theme2.theme,"Fruits");strcpy(theme2.mots[0],"fraise");strcpy(theme2.mots[1],"pomme");strcpy(theme2.mots[2],"pamplemousse");strcpy(theme2.mots[3],"poire");strcpy(theme2.mots[4],"banane");strcpy(theme2.mots[5],"framboise");strcpy(theme2.mots[6],"cerise");strcpy(theme2.mots[7],"ananas");strcpy(theme2.mots[8],"citron");strcpy(theme2.mots[9],"clementine");strcpy(theme2.mots[10],"melon");strcpy(theme2.mots[11],"peche");strcpy(theme2.mots[12],"nectarine");strcpy(theme2.mots[13],"myrtille");strcpy(theme2.mots[14],"noix");strcpy(theme2.mots[15],"figue");strcpy(theme2.mots[16],"tomate");strcpy(theme2.mots[17],"mandarine");strcpy(theme2.mots[18],"prume");strcpy(theme2.mots[19],"chataigne");strcpy(theme2.mots[20],"groiselle");strcpy(theme2.mots[21],"abricot");strcpy(theme2.mots[22],"kiwi");
theme2.nbMots =23;
themes[nbThemes]= theme2;
nbThemes++;Themetheme3;strcpy(theme3.theme,"Villes de France");strcpy(theme3.mots[0],"paris");strcpy(theme3.mots[1],"marseille");strcpy(theme3.mots[2],"nice");strcpy(theme3.mots[3],"toulouse");strcpy(theme3.mots[4],"bordeaux");strcpy(theme3.mots[5],"lyon");strcpy(theme3.mots[6],"lille");strcpy(theme3.mots[7],"nantes");strcpy(theme3.mots[8],"montpellier");strcpy(theme3.mots[9],"strasbourg");strcpy(theme3.mots[10],"besancon");strcpy(theme3.mots[11],"rennes");strcpy(theme3.mots[12],"angers");strcpy(theme3.mots[13],"dijon");strcpy(theme3.mots[14],"versailles");strcpy(theme3.mots[15],"orleans");strcpy(theme3.mots[16],"amiens");strcpy(theme3.mots[17],"rouen");strcpy(theme3.mots[18],"roubaix");strcpy(theme3.mots[19],"perpignan");strcpy(theme3.mots[20],"mulhouse");strcpy(theme3.mots[21],"poitiers");strcpy(theme3.mots[22],"tourcoing");
theme3.nbMots =23;
themes[nbThemes]= theme3;
nbThemes++;}intgenererThemeAleatoire(){returnrand()% nbThemes;}voidchangerTailleGrille(){printf("Veuillez entrer la nouvelle taille de la grille (nombre de lignes et de colonnes) :\n");printf("Nombre de lignes : ");scanf("%d",&taille_ligne);printf("Nombre de colonnes : ");scanf("%d",&taille_colonne);}intmain(){char grille[taille_ligne][taille_colonne];char mots[20][taille_mot];int nbMots;int choixMenu =0;themesDefinis();char direction;int jeuTermine =0;while(choixMenu !=3){printf("MENU\n");printf("1. Ajouter une nouvelle liste de mots\n");printf("2. Jouer\n");printf("3. Choisir un theme\n");printf("4. Choisir la taille de la grille\n");printf("5. Quitter\n");printf("Choix : ");scanf("%d",&choixMenu);switch(choixMenu){case1:creerTheme(mots,&nbMots);if(nbMots >0){Grillegenere(grille, mots, nbMots);printf("Création avec succès.\n");}break;case2:system("cls");if(nbThemes >0){int themeAleatoire =genererThemeAleatoire();Themetheme = themes[themeAleatoire];Grillegenere(grille, theme.mots, theme.nbMots);while(!jeuTermine){system("cls");printf("Thème : %s\n", theme.theme);printf("Taille : %dx%d\n", taille_ligne, taille_colonne);afficherGrilleAvecCurseur(grille);afficherMotsTheme(theme.mots, theme.nbMots);afficherMotsTrouves();
direction =getch();deplacerCurseur(direction, grille,mots, nbMots);}}else{printf("Aucun thème disponible.\n");}system("cls");break;case3:system("cls");if(nbThemes >0){printf("Thèmes disponibles :\n");for(int i =0; i < nbThemes; i++){printf("%d. %s\n", i +1, themes[i].theme);}int choixTheme;printf("Choisissez un thème : ");scanf("%d",&choixTheme);system("cls");if(choixTheme >=1&& choixTheme <= nbThemes){Themetheme = themes[choixTheme -1];Grillegenere(grille, theme.mots, theme.nbMots);printf("Thème : %s\n", theme.theme);printf("Taille : %dx%d\n", taille_ligne, taille_colonne);while(!jeuTermine){system("cls");printf("Thème : %s\n", theme.theme);printf("Taille : %dx%d\n", taille_ligne, taille_colonne);//afficher avec le theme selectionneafficherGrilleAvecCurseur(grille);afficherMotsTheme(theme.mots, theme.nbMots);
direction =getch();deplacerCurseur(direction, grille,mots, nbMots);}}else{printf("Thème invalide.\n");}}else{printf("Aucun thème disponible.\n");}break;case4:changerTailleGrille();break;case5:printf("Au revoir.\n");break;default:printf("Impossible.\n");break;}printf("\n");}return0;}
[Dal]
Messages postés6203Date d'inscriptionmercredi 15 septembre 2004StatutContributeurDernière intervention29 janvier 20251 099 Modifié le 28 juin 2023 à 10:52
Salut jsmmjr,
L'API Windows que tu utilises déjà pour la coloration du texte, te permet aussi de déplacer le curseur de la console aux coordonnées de l'écran de ton choix.