[C] Puissance 4 arbres de possibilité

Puissance 4 arbres de possibilité [C] - C - Programmation

Marsh Posté le 09-11-2011 à 17:18:04    

Bonjour, j'ai un projet a réaliser en C.
C'est un puissance 4, 7 colonnes, 6 lignes.
 
La première partie a été faite, c'est a dire en joueur contre joueur.
La deuxième partie doit utiliser des arbres pour calculer toutes les possibilités.
 
Le premier fichier correspond au jeu en JvsJ, le deuxième fichier va contenir toute les procédures et fonction pour calculer l'arbre, évaluer les possibilités, parcourir l'arbre, et devra retourner juste le numéro de la colonne a jouer pour l'ordi.
 
J'aimerais avoir de l'aide sur toute la deuxième partie, je bloque depuis 2 jours sur ces points la.
 
 
Voici le code de la première partie :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //#include "p4IA.c"
  4. //constante
  5. #define N 50
  6. //variable
  7. /*ce tableau à deux dimensions représente la structure du support de jeu*/
  8. char tab_p4[6][7];
  9. /*ce tableau représente la capacité en pion d'une colonne*/
  10. int remplircol[7];
  11. /*Cette variable représente un booléen 0=perdu, 1=gagné*/
  12. int win;
  13. /******************************************************************************************************/
  14. //prototype
  15. int jouable(int colonnes);
  16. int saisie();
  17. void afficher_tab_p4();
  18. int tab_p4_rempli();
  19. int pion_cote(int col, int lign,int dirVer, int dirHor);
  20. void gagner(int c,int l);
  21. void jouer(int *cpt,char c,char nom[N]);
  22. void jeu1j();
  23. void jeu2j();
  24. int choix();
  25. void jouer_ordi(int *cpt,char c,char nom[N]);
  26. /******************************************************************************************************/
  27. //corps
  28. void main (){
  29.       choix();
  30. }
  31. /******************************************************************************************************/
  32. int choix(){
  33. int reponse=0;
  34. printf("Choisissez un mode de jeux\n\n" );
  35. printf("1-Mode joueur contre joueur\n" );
  36. printf("2-Mode joueur contre ordinateur\n" );
  37. scanf("%d",&reponse);
  38. do{
  39.       switch (reponse) {
  40.       case 1:
  41.            jeu2j();
  42.            break;
  43.       case 2:
  44.            jeu1j();
  45.           break;
  46.        }
  47. }while(reponse!=1||reponse!=2);
  48. }
  49. /******************************************************************************************************/
  50. void jeu1j(){
  51. int i,j,joueur=0,compt1=0;
  52. char nom1[N],nom2[N]="Ordinateur",recom;
  53. win=0;// 1 gagné // 0 perdu
  54. printf("\t\t\t\t\t\t **********Puissance4********** \n\n" );
  55. printf("\n\n\t\t\t\t\t\t *****Partie contre l'ordinateur***** \n\n\n\n\n\n" );
  56. printf("Nom du joueur!!\n" );
  57. scanf("%s",&nom1[N]);
  58. afficher_tab_p4();
  59. do{
  60.      for (i=0;i<6;i++)
  61.      {
  62.            for (j=0;j<7;j++)
  63.      {
  64.       tab_p4[i][j]=' '; //Déclare le caractère de la fonction afficher_tab_p4 pour organiser le tableau
  65.     }
  66. }
  67.         for(j=0;j<7;j++){
  68.                       /* Iniatilisation de la fonction remplircol à zéro*/
  69.             remplircol[j]=0;
  70.         }
  71.         do{
  72.                  //Gestion des pions du joueur 1
  73.                  if (joueur%2==0){
  74.                  jouer(&compt1,'O',nom1);
  75.         }
  76.          //Gestion des pions de l'ordinateur
  77.          if(joueur%2!=0){
  78.                  jouer_ordi(&compt1,'X',nom2);
  79.          }
  80.          // joueur incrémenté
  81.          joueur=joueur+1;
  82.          // répéter tant que la grille n’est pas remplie ou que la partie n’est pas gagnée
  83.          } while(( !tab_p4_rempli() && win==0 ) );
  84.        do{
  85.              fflush(stdin);//vide le tampon des scanf effectuer
  86.              printf("\t\tSouhaitez-vous recommencer la partie ? (o/n) : " );
  87.              scanf("%c",&recom);
  88.        }while(recom!='o' && recom!='n');
  89. printf("\n" );
  90. }while (recom=='o');
  91. }
  92. /******************************************************************************************************/
  93. void jeu2j(){
  94. int i,j,joueur=0,compt1=0;
  95. char nom1[N],nom2[N],recom;
  96. win=0;// 1 gagné // 0 perdu
  97. printf("\t\t\t\t\t\t **********Puissance4********** \n\n" );
  98. printf("\n\n\t\t\t\t\t\t *****Partie à deux joueurs***** \n\n\n\n\n\n" );
  99. printf("Nom du premier joueur!!\n" );
  100. scanf("%s",&nom1[N]);
  101. printf("Nom du deuxième joueur\n" );
  102. scanf("%s",&nom2[N]);
  103. afficher_tab_p4();
  104. do{
  105.       for (i=0;i<6;i++)
  106.       {
  107.            for (j=0;j<7;j++)
  108.            {
  109.                   tab_p4[i][j]=' '; //Déclare le caractère de la fonction afficher_tab_p4 pour organiser le tableau
  110.            }
  111.       }
  112.       for(j=0;j<7;j++){
  113.                  /* Iniatilisation de la fonction remplircol à zéro*/
  114.                remplircol[j]=0;
  115.        }
  116. do{
  117.         //Gestion des pions du joueur 1
  118.         if (joueur%2==0){
  119.                  jouer(&compt1,'O',nom1);
  120.         }
  121.         //Gestion des pions du joueur 2
  122.         if(joueur%2!=0){
  123.                 jouer(&compt1,'X',nom2);
  124.          }
  125.          // joueur incrémenté
  126.          joueur=joueur+1;
  127.          // répéter tant que la grille n’est pas remplie ou que la partie n’est pas gagnée
  128. } while(( !tab_p4_rempli() && win==0 ) );
  129. do{
  130.          fflush(stdin);//vide le tampon des scanf effectuer
  131.          printf("\t\tSouhaitez-vous recommencer la partie ? (o/n) : " );
  132.          scanf("%c",&recom);
  133. }while(recom!='o' && recom!='n');
  134. printf("\n" );
  135. }while (recom=='o');
  136. }
  137. /**********************************************************************************************************/
  138. /* fonction qui renvoie vrai s'il est possible de poser un pion dans la colonne colonnes*/
  139. int jouable(int colonnes){
  140.            if ((colonnes>=0) && (colonnes<7) && (remplircol[colonnes]>=0) && (remplircol[colonnes]<6)) return 1;
  141.            else return 0;
  142. }
  143. /**********************************************************************************************************/
  144. /*fonction de saisie d'un coup fait par le joueur*/
  145. int saisie(){
  146. int x; /* x est la colonne */
  147. do{
  148.         printf("\t Veuillez entrer un chiffre entre 0 et 6:\n\t Attention aux colonnes déjà remplies!\n" );
  149.         scanf("%d",&x);
  150.         if (jouable(x)==1) return x;
  151. }while(jouable(x)!=1);
  152. return 0;
  153. }
  154. /**********************************************************************************************************/
  155. void afficher_tab_p4() //Procédure qui permet d'afficher une grille de jeu Puissance4
  156. {
  157. int i,j;
  158. printf("\t\t\t\t\t\t **********Puissance4********** \n\n" );
  159.           for (i=0;i<6;i++)
  160.           {
  161.                 printf("\t\t\t\t\t\t ø-ø-ø-ø-ø-ø-ø-ø \n" );
  162.                 printf("\t\t\t\t\t\t" );
  163.                 for (j=0;j<7;j++)
  164.                 {
  165.                        printf("|%c",tab_p4[5-i][j]); //Le %c permet de declarer un espace vide pour un caractère non déclaré pour le moment
  166.                 }
  167.            printf("| %d\n",i); //Indice de la grille afficher horizontalement
  168.            }
  169. printf("\t\t\t\t\t\t ø-ø-ø-ø-ø-ø-ø-ø \n" );
  170. printf("\t\t\t\t\t\t" );
  171.          
  172.            for(j=0;j<=6;j++)
  173.            {
  174.                     printf(" %d",j); //Indice de la grille afficher verticalement
  175.            }
  176. printf("\n\n\t\t" );
  177. }
  178. /******************************************************************************************************/
  179. int tab_p4_rempli(){
  180. int colon,complet=0;
  181. /* la fonction cherche quel sont les cases de la grille qui sont remplies */
  182.            for(colon=0;colon<=6;colon++){
  183.                       if(jouable(colon)){
  184.                                  complet=complet+1;
  185.                       }
  186.            }
  187. //Après avoir incrémenté chaque colonne, la fonction renvoie si la grille est complete (return 1) ou non (return 0) */
  188.            if (complet==0) return 1;
  189.            else return 0;
  190. }
  191. /******************************************************************************************************/
  192. /*La fonction pion_cote permet de verifier pour chaque direction, par rapport a un pion donné, si le pion mitoyen est de meme symbole.
  193. Cela permet, grâce à un compteur, de compter le nombre de pions cote à cote*/
  194. int pion_cote(int col, int lign,int dirVer, int dirHor)
  195. {
  196. int n=0;
  197. if(dirVer==-1){
  198. if(dirHor==0){
  199.            while((tab_p4[lign][col])==(tab_p4[lign-1][col])&&(tab_p4[lign][col]!=' ')){
  200.                       n++;
  201.                       lign--;
  202.            }
  203. }
  204. else if(dirHor==-1){
  205.            while((tab_p4[lign][col])==(tab_p4[lign-1][col-1])&&(tab_p4[lign][col]!=' ')){
  206.                       n++;
  207.                       col--;
  208.                       lign--;
  209.             }
  210. }
  211. else if(dirHor==1){
  212.            while((tab_p4[lign][col])==(tab_p4[lign-1][col+1])&&(tab_p4[lign][col]!=' ')){
  213.                       n++;
  214.                       col++;
  215.                       lign--;
  216.            }
  217. }
  218. }
  219. if(dirVer==0){
  220.            if(dirHor==1){
  221.                       while((tab_p4[lign][col])==(tab_p4[lign][col+1])&&(tab_p4[lign][col]!=' ')){
  222.                                  n++;
  223.                                  col++;
  224.                       }
  225.            }
  226. else if(dirHor==-1){
  227.            while((tab_p4[lign][col])==(tab_p4[lign][col-1])&&(tab_p4[lign][col]!=' ')){
  228.                       n++;
  229.                       col--;
  230.            }
  231. }
  232. }
  233. return(n);
  234. }
  235. /******************************************************************************************************/
  236. void gagner(int c,int l){
  237. /*Appele la fonction pion_cote, et teste dans tout les sens par rapport au pion donné*/
  238. if ((pion_cote(c,l,0,1) +pion_cote(c,l,0,-1)) >=3 ||
  239. ( pion_cote(c,l,1,0) +pion_cote(c,l,-1,0)) >=3 ||
  240. ( pion_cote(c,l,1,1) +pion_cote(c,l,-1,-1))>=3 ||
  241. ( pion_cote(c,l,1,-1)+pion_cote(c,l,-1,1) >=3))
  242. win=1;
  243. else win=0;
  244. }
  245. /*******************************************************************************************************/
  246. //procedure permettant au joueur de jouer // // problème lors de l'execution //
  247. void jouer(int *cpt,char c,char nom[N]){
  248.            int l,col;
  249.            // on rentre son nommax
  250.            printf("%s, posez votre pion\n",&nom[N]);
  251.            col=saisie();
  252.            //la fonction remplircol définit les lignes de la colonne
  253.            l=remplircol[col];
  254.            tab_p4[l][col]=c;
  255.            remplircol[col]=remplircol[col]+1;
  256.            (*cpt)++;
  257.            afficher_tab_p4();
  258.            gagner(col,l);
  259.            // si la partie est gagnée
  260.            if( win==1){
  261.                       printf("%s gagne au %deme coup\n",&nom[N],(*cpt)/2+1);
  262.            }
  263. }
  264. /*******************************************************************************************************/
  265. void jouer_ordi(int *cpt,char c,char nom[N]){
  266.            int l,col;
  267.            int profondeur;
  268.            col=getCol();
  269.            //la fonction remplircol définit les lignes de la colonne
  270.            l=remplircol[col];
  271.            tab_p4[l][col]=c;
  272.            remplircol[col]=remplircol[col]+1;
  273.            (*cpt)++;
  274.            afficher_tab_p4();
  275.            gagner(col,l);
  276.            // si la partie est gagnée
  277.            if( win==1){
  278.                       printf("%s gagne au %deme coup\n",&nom[N],(*cpt)/2+1);
  279.            }
  280. }


 
 
Merci


Message édité par zulfine le 10-11-2011 à 16:23:00
Reply

Marsh Posté le 09-11-2011 à 17:18:04   

Reply

Marsh Posté le 10-11-2011 à 13:24:05    

Salut,
Peux-tu indenter ton code? C'est assez illisible.
Du coup je n'ai pas tout lu, mais... tu as testé ça:

Code :
  1. scanf("%d",&reponse);
  2. do{
  3.   switch (reponse) {
  4.   case 1:
  5.     jeu2j();
  6.     break;
  7.   case 2:
  8.     jeu1j();
  9.     break;
  10.   }
  11. }while(reponse!=1||reponse!=2);


?

 


Si tu bloques sur la deuxième partie, c'est plutôt ce code là qu'il fallait donner. Sur quoi bloques-tu?

 


edit: Après un rapide copier-coller et en enlevant ce qui concerne le joueur ordinateur, je vois pas mal de choses dans l'affichage qui trahissent des problèmes de dépassement de chaînes et autres mauvais usages de pointeurs. Tu devrais refaire une vérif.


Message édité par ptitchep le 10-11-2011 à 14:26:32

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 10-11-2011 à 16:31:59    

La totalité du programme fonctionne et à déjà été tester pour la partie 2 joueur.
 
C'est vraiment la partie de l'ia qui pose problème avec la fonction min max que j'arrive pas à codé.
 
Je doit avoir l'arbre complet (avec toutes les possibilités) déjà construit et ensuite l'algo minmax permet de ressortir la meilleur position pour que l'ordi place sa piece
 
voilà
 

Reply

Marsh Posté le 10-11-2011 à 16:41:11    

Tu devrais d'abord corriger les erreurs de ton code avant d'attaquer la partie IA. Ce n'est pas parce que ça fonctionne et que ça a été testé que le code est juste. Quoi que, quand ton programme plantera, tu pourras toujours dire 'it's not a bug ! it's a feature !'. ;)
 
Pour l'algo minimax le but n'est pas de stocker l'arbre et de piocher la réponse dans la table, mais d'explorer l'arbre pour vérifier les possibilités. Note qu'avec un minimax basique, tu ne pourras pas explorer grand chose, ce sera trop long, c'est pour ça qu'il y a pas mal d'optimisations liées à ça (mais tu n'en es pas encore là....).

Reply

Marsh Posté le 10-11-2011 à 18:23:10    

zulfine a écrit :

La totalité du programme fonctionne et à déjà été tester pour la partie 2 joueur.

Vu les scanf, elle n'a manifestement été testée qu'en supposant qu'il n'y aura pas de faute de frappe en entrée.
Cette lecture est recommandée: http://home.datacomm.ch/t_wolf/tw/c/getting_input.html
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-11-2011 à 14:02:15    

zulfine a écrit :

La totalité du programme fonctionne et àa déjà été testerée pour la partie 2 joueurs.

Non. Tester ne veut pas dire essayer le cas où tout va bien.
 

zulfine a écrit :

C'est vraiment la partie de l'ia qui pose problème avec la fonction min max que jje n'arrive pas à codéer.


Où en es-tu?

zulfine a écrit :


Je doits avoir l'arbre complet (avec toutes les possibilités) déjà construit et ensuite l'algo minmax permet de ressortir la meilleur position pour que l'ordi place sa pieèce.
 
voilà
 



---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed