Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1671 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Puissance 4 arbres de possibilité

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Puissance 4 arbres de possibilité

n°2110586
zulfine
Posté le 09-11-2011 à 17:18:04  profilanswer
 

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
mood
Publicité
Posté le 09-11-2011 à 17:18:04  profilanswer
 

n°2110752
ptitchep
Posté le 10-11-2011 à 13:24:05  profilanswer
 

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
n°2110800
zulfine
Posté le 10-11-2011 à 16:31:59  profilanswer
 

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à
 

n°2110803
Pouet_fore​ver
Trance forever :)
Posté le 10-11-2011 à 16:41:11  profilanswer
 

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à....).

n°2110843
gilou
Modérateur
Modzilla
Posté le 10-11-2011 à 18:23:10  profilanswer
 

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é!  --
n°2111297
ptitchep
Posté le 14-11-2011 à 14:02:15  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Puissance 4 arbres de possibilité

 

Sujets relatifs
[C][Gnu] info utilisation memoire, processeur et swap [résolu]fonctionnement getchar en C
colorer une carte geographique creé par openGL C++[ Divers / C ] Ecrire pour un afficheur LCD
[C] Modifier un tableau existant ... pour bouger un pion ![C# / .Net] Migration OS 32Bits vers OS 64Bits. Quid des Perfs?
[C#] FormView, edit/insert mode[C] programme cherche les racines des polynomes
[C] trouver la longueur de la plus longue suite decroissante en C 
Plus de sujets relatifs à : [C] Puissance 4 arbres de possibilité


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR