Votre question

[C] Une fonction compliquée...

Tags :
  • Algorithme
  • Programmation
Dernière réponse : dans Programmation
6 Avril 2010 03:40:35

Bonsoir à tous, voilà je dois programmer un puissance 4 mais je ne sais comment parcourir le tableau de la bonne manière pour vérifier si la partie est gagnée :??: 
J'avais l'idée de faire un truc du genre :

  1. if(grille[i][j] == grille[i+1]|j] == grille[i+2]|j] == grille[i+3]|j] && */si leur valeur != de 0/*)
  2. {
  3. //La partie est gagnée
  4. }


J'aurais fait pareil avec j, j+1, j+2...

Enfin, j'ai essayé mais dans la pratique ça marche 'peu'... Pour la vérification diagonale je n'en parle pas. Si quelqu'un pouvait m'aider en accord avec mon code je lui serais éternellement reconnaissant.
Merci.
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. void afficherGrille(int grille[][7]);
  6. int modifierGrille(int choixColonne, int hauteurColonne[], int grille[][7], int tour);
  7. int menu();
  8. int definirJoueur(int tour);
  9. int verifierGagnant(int grille[][7]);
  10.  
  11. int main()
  12. {
  13. int grille[6][7] = {0}; //grille[i][j]
  14. int hauteurColonne[7];
  15. int i, j;
  16. int choixColonne = 0;
  17. int tour = 0;
  18.  
  19. for(i = 0; i!=7; i++)
  20. {
  21. hauteurColonne[i] = 5;
  22. }
  23.  
  24. while(1)
  25. {
  26. tour = definirJoueur(tour);
  27. afficherGrille(grille);
  28. choixColonne = menu();
  29. modifierGrille(choixColonne, hauteurColonne, grille, tour);
  30. hauteurColonne[choixColonne]--;
  31. verifierGagnant(grille);
  32. }
  33. return 0;
  34. }
  35.  
  36. int modifierGrille(int choixColonne, int hauteurColonne[], int grille[][7], int tour)
  37. {
  38. int i;
  39. int j;
  40.  
  41. for(i = 0; i!=6; i++)
  42. {
  43. for(j = 0; j!=7; j++)
  44. {
  45. if(choixColonne == j)
  46. {
  47. if(tour)
  48. {
  49. grille[hauteurColonne[j]][j] = 1;
  50. }
  51. else
  52. {
  53. grille[hauteurColonne[j]][j] = 2;
  54. }
  55. }
  56. }
  57. }
  58. }
  59.  
  60. int menu()
  61. {
  62. int choix;
  63. printf("\nDans quelle colonne souhaitez vous placer un pion ? ");
  64. scanf("%ld", &choix);
  65. if(choix > 7 || choix < 1)
  66. {
  67. return menu();
  68. }
  69. return choix-1;
  70. }
  71.  
  72. void afficherGrille(int grille[][7])
  73. {
  74. int i;
  75. int j;
  76.  
  77. for(i = 0; i!=6; i++)
  78. {
  79. printf(" ");
  80. for(j = 0; j!=7; j++)
  81. {
  82. switch(grille[i][j]) {
  83. case 1 : printf("X");
  84. break;
  85. case 2 : printf("O");
  86. break ;
  87. default : printf(".");
  88. break ;
  89. }
  90. }
  91. printf("\n");
  92. }
  93. }
  94.  
  95. int definirJoueur(int tour)
  96. {
  97. return (tour+1)%2;
  98. }
  99.  
  100.  
  101. int verifierGagnant(int grille[][7])
  102. {
  103. int i;
  104. int j;
  105.  
  106. for(i = 0; i<6; i++)
  107. {
  108.  
  109. for(j = 0; j<7; j++)
  110. {
  111. }
  112. }
  113. printf("\n");
  114. }

Autres pages sur : fonction compliquee

6 Avril 2010 19:07:00

Une solution serait de parcourir chaque case du tableau. Pour chaque position occupée, appliquer une fonction qui teste exhaustivement toutes les combinaisons possibles autour de cette position qui pourraient apporter la victoire.
Exemple: xxxX, xxXx, xXxx, Xxxx avec X la position courante: chaque pourrait être une boucle. La même chose en vertical et sur les diagonales.
Il faut vérifier également qu'on ne sort pas de la zone (si oui, on n'applique pas le test).
Tu peux par exemple passer à ta fonction la valeur de la case.
C'est faisable avec des boucles.
L'algorithme est assez peu efficace, et peut bien sûr être raffiné, mais il fait le boulot.
m
0
l
a b L Programmation
6 Avril 2010 20:33:42

Commencer par la victoire verticale, car c'est le plus simple (une seule possibilité), puis l'horizontale, et la diagonale.
m
0
l
Contenus similaires
7 Avril 2010 22:41:25

Coucou, c'est encore moi... Alors j'ai avancé, j'oserai pas vous dire en combien d'heures, mais j'ai avancé :D 

Voilà mon code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. void afficherGrille(int grille[][7]);
  6. int modifierGrille(int choixColonne, int hauteurColonne[], int grille[][7], int tour, int *pointeurTour);
  7. int menu();
  8. int definirJoueur(int tour);
  9. int tableauRempli(int hauteurColonne[], int *pointeurTour);
  10. int verifierGagnant( int grille[][7], int choixColonne, int hauteurColonne[], int valeurPositionActuelle);
  11. void menuPrincipal();
  12.  
  13.  
  14. int main()
  15. {
  16. int grille[6][7] = {0}; //grille[i][j]
  17. int i;
  18. int choixColonne = 0;
  19. int tour = 0;
  20. int *pointeurTour = &tour;
  21. int nbrPionsIdentiquesV;
  22. int nbrPionsIdentiquesH;
  23. int valeurPositionActuelle;
  24. int VICTOIRE = 0;
  25. int hauteurColonne[7];
  26. for(i = 0; i!=7; i++){
  27. hauteurColonne[i] = 5;}
  28.  
  29.  
  30. menuPrincipal();
  31.  
  32.  
  33. do{
  34. afficherGrille(grille);
  35. tour = definirJoueur(tour);
  36. choixColonne = menu();
  37. modifierGrille(choixColonne, hauteurColonne, grille, tour, &tour);
  38. if(hauteurColonne[choixColonne]>=0){
  39. hauteurColonne[choixColonne]--;}
  40. else{
  41. tour++;}
  42.  
  43.  
  44. VICTOIRE = verifierGagnant(grille, choixColonne, hauteurColonne, valeurPositionActuelle);
  45.  
  46.  
  47.  
  48. }
  49. while(!tableauRempli(hauteurColonne, &tour) && !VICTOIRE);
  50.  
  51. afficherGrille(grille);
  52.  
  53. if(!VICTOIRE){
  54. printf("\n VOUS AVEZ REMPLI LA GRILLE\n\n");
  55. }
  56. return main();
  57. }
  58.  
  59.  
  60. int modifierGrille(int choixColonne, int hauteurColonne[], int grille[][7], int tour, int *pointeurTour)
  61. {
  62. int i;
  63. int j;
  64.  
  65. for(i = 0; i!=6; i++)
  66. {
  67. for(j = 0; j!=7; j++)
  68. {
  69. if(choixColonne == j)
  70. {
  71. if(hauteurColonne[j] >= 0) //éviter le débordement de pions sur le haut [0][j]
  72. {
  73. if(tour) //boléen 1/0
  74. {
  75. grille[hauteurColonne[j]][j] = 1; //Pion ☺
  76. }
  77. else
  78. {
  79. grille[hauteurColonne[j]][j] = 2; //Pions ☻
  80. }
  81. }
  82. else{
  83. if(!i) //Pour implémenter une fois à l'intérieur de la boucle.
  84. {
  85. //on incrémente la variable associé au pointeur //FACULTATIF *ponteurTour+=1; en fonction des modif code;
  86. } //pour éviter le décalage du nombre de pion en cas de mauvaise saisie
  87. }}}}} //
  88.  
  89. int menu()
  90. {
  91. int choix;
  92. printf("\nDans quelle colonne souhaitez vous placer un pion ? ");
  93. scanf("%ld", &choix);
  94. if(choix > 7 || choix < 1)
  95. {
  96. printf("La valeur doit etre comprise entre 1 et 7.\n");
  97. return menu();
  98. }
  99. return choix-1; // 1 = 0 & Jmin = 0
  100. }
  101.  
  102. void afficherGrille(int grille[][7])
  103. {
  104. int i;
  105. int j;
  106.  
  107. for(i = 0; i!=6; i++)
  108. {
  109. printf(" ");
  110. for(j = 0; j!=7; j++)
  111. {
  112. switch(grille[i][j]) {
  113. case 2 : printf("%c", 1);
  114. break;
  115. case 1 : printf("%c", 2);
  116. break ;
  117. case 3 : printf("%c", 3);
  118. break ;
  119. case 4 : printf("%c", 4);
  120. break ;
  121. default : printf(".");
  122. break ;
  123. }
  124. }
  125. printf("\n");
  126. }
  127. }
  128.  
  129. int definirJoueur(int tour)
  130. {
  131. return (tour+1)%2; //renvoie 0 ou 1
  132. }
  133.  
  134. int tableauRempli(int hauteurColonne[], int *pointeurTour)
  135. {
  136. int resultat = 0;
  137. int i;
  138. const int limite = -1;
  139.  
  140.  
  141. for(i = 0; i<7; i++)
  142. {
  143. if(hauteurColonne[i] == limite && hauteurColonne[i+1] == limite && hauteurColonne[i+2] == limite && hauteurColonne[i+3] == limite && hauteurColonne[i+4] == limite && hauteurColonne[i+5] == limite && hauteurColonne[i+6] == limite)
  144. {
  145. resultat = 1;
  146.  
  147. }
  148. }
  149. printf("\n");
  150. return resultat;
  151.  
  152. }
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163. int verifierGagnant( int grille[][7], int choixColonne, int hauteurColonne[], int valeurPositionActuelle)
  164. {
  165.  
  166.  
  167. valeurPositionActuelle = grille[hauteurColonne[choixColonne]+1][choixColonne];
  168. int valeurPositionDroite = grille[hauteurColonne[choixColonne]+1][choixColonne+1];
  169. int valeurPositionGauche = grille[hauteurColonne[choixColonne]+1][choixColonne-1];
  170. int valeurPositionDroite2 = grille[hauteurColonne[choixColonne]+1][choixColonne+2];
  171. int valeurPositionGauche2 = grille[hauteurColonne[choixColonne]+1][choixColonne-2];
  172. int nbrPionsIdentiquesV = 1;
  173. int nbrPionsIdentiquesH = 1;
  174. int i;
  175. int VICTOIRE = 0;
  176.  
  177.  
  178.  
  179.  
  180.  
  181. for(i = 2; i<5; i++)
  182. {
  183. if(grille[hauteurColonne[choixColonne]+1][choixColonne] == grille[hauteurColonne[choixColonne]+i][choixColonne])
  184. {
  185. nbrPionsIdentiquesV+=1;
  186.  
  187. }
  188. }
  189.  
  190.  
  191.  
  192.  
  193. for(i = 1; i<4; i++)
  194. {
  195. if(grille[hauteurColonne[choixColonne]+1][choixColonne] == grille[hauteurColonne[choixColonne]+1][choixColonne+i] || grille[hauteurColonne[choixColonne]+1][choixColonne] == grille[hauteurColonne[choixColonne]+1][choixColonne-i])
  196. {
  197.  
  198. nbrPionsIdentiquesH +=1;
  199.  
  200. }
  201. else if( grille[hauteurColonne[choixColonne]+1][choixColonne] == valeurPositionDroite && grille[hauteurColonne[choixColonne]+1][choixColonne] == valeurPositionDroite2 && grille[hauteurColonne[choixColonne]+1][choixColonne] == valeurPositionGauche)
  202. {
  203. nbrPionsIdentiquesH = 4;
  204. }
  205. else if( grille[hauteurColonne[choixColonne]+1][choixColonne] == valeurPositionDroite && grille[hauteurColonne[choixColonne]+1][choixColonne] == valeurPositionGauche && grille[hauteurColonne[choixColonne]+1][choixColonne] == valeurPositionGauche2)
  206. {
  207. nbrPionsIdentiquesH = 4;
  208.  
  209. }
  210. }
  211.  
  212. if(nbrPionsIdentiquesH ==4 || nbrPionsIdentiquesV ==4)
  213. {
  214. VICTOIRE = 1;
  215. }
  216. return VICTOIRE;
  217. }
  218.  
  219.  
  220.  
  221. void menuPrincipal()
  222. {
  223. printf(" PUISSANCE 4\n\n");
  224. printf(" %c Joueur 1\n %c Joueur 2\n", 1, 2);
  225. }





Le problème se pose lors de la vérification horizontale, la fonction est vraie quand :
OXOXXOO
XOXOXOX
XXXOXOO


Quelqu'un saurait il améliorer ma fonction car je planche :'( 


Merci beaucoup.
m
0
l
a b L Programmation
7 Avril 2010 23:03:34

Je n'ai pas regardé le code, mais je crois savoir ce qui cloche.
Quand tu as le tableau en 2D en C:
OXOXXOO
XOXOXOX
XXXOXOO

En mémoire, c'est mis comme ceci: OXOXXOOXOXOXOXXXXOXOO
Donc, si tu fais du buffer overfow sur une ligne, tu passe sans t'en rendre compte à la ligne suivante. c'est à dire que Tab[0][7] == Tab[1][0]
Tu dois donc rajouter des tests pour être sûr que tu ne dépasses pas du tableau.

Autre astuce: faire un tableau plus grand (en ajoutant 3 colonnes sur les bords). ;) 
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS