guy68 Overclocking : boxinwood Electronique : KneXos Le salon de discussion : bbtoff, 2 utilisateurs anonymes et 21 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Retour du puissance 4

n°4959
Falco171
Posté le 14-02-2005 à 16:58:43  profilanswer
 

Moi aussi je dois préparer un puissance 4, je me suis pas mal cassé la tête pour trouver la logique de vérification des lignes, colonnes, diagonales...
Mais en voyant la version de C4H8O3 dont je me suis largement inspiré (http://soj.mesdiscussions.net/forum2.php?config=overclex.inc&post=83&cat=14&cache=&sondage=0&owntopic=0&p=1&trash=0&subcat=0) j'ai compris que je devais pas me casser la tête et utiliser un petit tableau...
 
Car je voulais faire un puissance 4 avec x lignes/colonnes définis par l'utilisateur, il me restait alors à créer une fonction permettant de vérifier à chaque coup et peut importe la taille du tableau, si un joueur avait gagné ou pas...
Mais comme je le disais, c'est bien plus dur ça vu qu'il ne faut pas vérifier 3 cases avant ou 3 cases après celle que l'on vient de jouer uniquement mais aussi 2 avant, 1 après, etc. etc.
 
Enfin pour pouvoir faire mon puissance 4 bien complet, je voulais d'abord commencer par épurer la version de C4H8O3 et ensuite l'améliorer, là je viens de finir de l'épurer mais maintenant à la compilation par d'erreur mais à l'exécution ça plante dés le début, il m'est donc impossible de trouver facilement l'erreur...
 
Dans les principaux changements par rapports à C4H8O3, j'ai renommé quelques trucs pour que ce soit plus simple pour moi, supprimé 2~3 fonctions qui n'étaient jamais utilisées :p, pour la fonction afficher il utilisait un entier n à la place de tailletab, je l'ai retiré et mis tailletab, plus quelques autres petites modifes je pense...
 
Voilà tout est dit, si on pouvait m'aider à trouver l'erreur ;)
 
Correction :  
- define en majuscule  
- do while en while quand cest possible vu quil y a un if qui vérifie avant, merci pour "l'astuce"  
- define après include  
- void main() en int main (void) + return 0;
- matrice_debut en matrice_init
- tourjoueur = tourjoueur++; en tourjoueur++;
- col = col--; en col--;
- lots of corrections lol
 

Code :
  1. /** Puissance 4 **/
  2. /** Le but du jeu est d'aligner 4 pions que ce soit de façon vertical, horizontal ou en diagonale **/
  3. /** Labo xx **/
  4. /** xxxxxxxxxxx **/
  5. /* Biblios */
  6. #include <stdio.h>
  7. #include <conio.h>
  8. #include <stdlib.h>
  9. /* Constante */
  10. #define TAILLETABL 6 // define lignes
  11. #define TAILLETABC 7 // define colonnes
  12. /* Modules */
  13. void afficher(int vecteur_puissance[][TAILLETABC]);
  14. int matrice_fin(int vecteur_puissance[][TAILLETABC]);
  15. void place_pion(int vecteur_puissance[][TAILLETABC], int coupjoueur, int col);
  16. int coupgagne(int vecteur_puissance[][TAILLETABC], int coupjoueur);
  17. /* Mod main */
  18. int main (void)
  19. {
  20.   /* Variables */
  21.   int puissance_4[TAILLETABL][TAILLETABC];
  22.   int coupjoueur,col,colb;
  23.   int tourjoueur=0;
  24.   char restart;
  25.   /* Mise en place de la matrice */
  26.   int n,m;
  27.   for (n=0;n<TAILLETABL;n++) // Ligne
  28.   {
  29.     for (m=0;m<TAILLETABC;m++) // Colonne
  30.     {
  31.       puissance_4[n][m]=0; // =0
  32.     }
  33.   }
  34.   /* Présenation du jeu */
  35.   puts("\n\n#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#\n\n" );
  36.   puts("Bienvenue dans le jeu Puissance 4 !\nCe jeu se joue a deux, le joueur 1 etant represente par les pions 1, de meme pour le joueur 2." );
  37.   puts("\nLes joueurs jouent de facon alternee, le gagnant est celui qui reussi en premier a aligner quatres de ses pions de facon horizontal, vertical ou en diagonal." );
  38.   puts("\n\n#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#" );
  39.   getch();
  40.   system("cls" );
  41.   /* Fin de la présentation */
  42.   /* Jeu -> do while -> jusque plein */
  43.   do
  44.   {
  45.     if(tourjoueur%2==0)coupjoueur=1; // Joueur 1
  46.     if(tourjoueur%2==1)coupjoueur=2; // Joueur 2
  47.     tourjoueur++; // Alterne les joueurs
  48.     printf("\n\n\nC\'est au %d joueur de placer son pion.\n", coupjoueur); // Qui joue ?
  49.     afficher(puissance_4); // Porpose la matrice
  50.     /* Choix colonne + confirmation */
  51.     do
  52.     {
  53.       fflush(stdin);
  54.       printf("\nChoisissez dans quelle colonne vous desirez mettre votre pion (de 1 a %d) : ", TAILLETABC); // Choix de la colonne
  55.       scanf("%d",&col); // Enregistrement du choix
  56.       fflush(stdin);
  57.       printf("\n\nVotre choix est %d pour le confirmer appuyez sur Enter ou appuyez sur R pour recommencer ", col); // Confirmation
  58.       scanf("%c",&restart); // Enregistrement de la confirmation
  59.       col--; // Adaptation tab pc
  60.     } while (col<0||col>TAILLETABC-1||restart=='r'||restart=='R'); // Colonne existe? + Confirmation
  61.     /* Fib choix */
  62.     /* Colonne pleine - vérification */
  63.     if (puissance_4[0][col]!=0) // Colonne pleine ?
  64.     {
  65.       colb=col;
  66.       while (col<0||col>TAILLETABC-1||puissance_4[0][col]!=0||restart=='r'||restart=='R') // Colonne existe? + Colonne tjs pleine? + Confirmation
  67.         {
  68.           if (restart=='r'||restart=='R')col=colb; // Si recommence on prend la valeur de la colonne donnée précédemment et non la dernière enregistrée
  69.           if (col<0||col>TAILLETABC-1)
  70.           {
  71.             col++; // Adaptation tab pc
  72.             fflush(stdin);
  73.             printf("\nLa colonne choise : %d n\'existe pas, veuillez en choisir une autre : ",col); // N'existe pas
  74.             scanf("%d",&col); // Enregistrement du choix
  75.             col--; // Adaptation tab pc
  76.           }
  77.           if (puissance_4[0][col]!=0)
  78.           {
  79.             col++; // Adaptation tab pc
  80.             fflush(stdin);
  81.             printf("\nLa colonne choise : %d est pleine, veuillez en choisir une autre.",col); // Pleine
  82.             printf("\n\nChoix de la colonne : " ); // Choix de la colonne
  83.             scanf("%d",&col); // Enregistrement du choix
  84.             col--; // Adaptation tab pc
  85.           }
  86.           col++; // Adaptation tab pc
  87.           fflush(stdin);
  88.           printf("\n\nVotre choix est %d pour le confirmer appuyez sur Enter ou appuyez sur R pour recommencer\n", col); // Confirmation
  89.           scanf("%c",&restart);
  90.           col--; // Adaptation tab pc
  91.         }
  92.     }
  93.     /* Fin vérif colonne */
  94.     /* Place le pion */
  95.     place_pion(puissance_4,coupjoueur,col);
  96.   } while (coupgagne(puissance_4,coupjoueur)==0); // Boucle du jeu
  97.   //matrice_fin(puissance_4)!=TAILLETAB*TAILLETAB ||
  98.   /* Partie finie */
  99.   system("cls" ); // Vide écran
  100.   printf("Partie terminee ! Le vainqueur est le %d joueur.", coupjoueur); // Phrase pour vainqueur
  101.   puts("\nOu alors personne n\'a fait de puissance 4 ;)" ); // Phrase pour personne
  102.   afficher(puissance_4); // Afficher la matrice
  103.   getch();
  104.   /* Aurevoir ;) */
  105.   return 0;
  106. }
  107. /* Fin mod main */
  108. /* Mod afficher */
  109. void afficher(int vecteur_puissance[][TAILLETABC])
  110. {
  111.   int i,j,k;
  112.   printf("\n    " );
  113.   for (k=0;k<TAILLETABC;k++) // Légende colonnes
  114.   {
  115.     k++;// Adaptation tab pc
  116.     printf("C.%d  ",k);
  117.     k--;// Adaptation tab pc
  118.   }
  119.   printf("\n" );
  120.   for (i=0;i<TAILLETABL;i++) // Ligne
  121.   {
  122.     i++; // Adaptation tab pc
  123.     printf("\nL.%d  ",i);// Légende lignes
  124.     i--; // Adaptation tab pc
  125.     for (j=0;j<TAILLETABC;j++)// Colonne
  126.     {
  127.       printf("%d    ", vecteur_puissance[i][j]); // Affiche la valeur de la cellule
  128.     }
  129.     printf("\n" );
  130.   }
  131. }
  132. /* Fin mod afficher */
  133. /* Mod coupgagne */
  134. int coupgagne(int vecteur_puissance[][TAILLETABC], int coupjoueur)
  135. {
  136.   int i,j;
  137.   for (i=TAILLETABL-1;i>(-1);i--) // Test les lignes
  138.   {
  139.     for (j=0;j<TAILLETABC-3;j++)
  140.     {
  141.       if(vecteur_puissance[i][j] == vecteur_puissance[i][j+1] && vecteur_puissance[i][j+1] == vecteur_puissance[i][j+2] && vecteur_puissance[i][j+2] == vecteur_puissance[i][j+3] && vecteur_puissance[i][j+3] == coupjoueur)
  142.       {
  143.         vecteur_puissance[i][j]=4;
  144.         vecteur_puissance[i][j+1]=4;
  145.         vecteur_puissance[i][j+2]=4;
  146.         vecteur_puissance[i][j+3]=4;
  147.         return coupjoueur; // Retourne gagne
  148.       }
  149.     }
  150.   } // Fin test lignes
  151.   for (j=0;j<TAILLETABC;j++) // Test les colonnes
  152.   {
  153.     for (i=TAILLETABL-1;i>2;i--)
  154.     {
  155.       if(vecteur_puissance[i][j] == vecteur_puissance[i-1][j] && vecteur_puissance[i-1][j] == vecteur_puissance[i-2][j] && vecteur_puissance[i-2][j] == vecteur_puissance[i-3][j] && vecteur_puissance[i-3][j] == coupjoueur)
  156.       {
  157.         vecteur_puissance[i][j]=4;
  158.         vecteur_puissance[i-1][j]=4;
  159.         vecteur_puissance[i-2][j]=4;
  160.         vecteur_puissance[i-3][j]=4;
  161.         return coupjoueur; // Retourne gagne
  162.       }
  163.     }
  164.   } // Fin test colonnes
  165.   for (i=TAILLETABL-1;i>2;i--) // Test les diagonales A
  166.   {
  167.     for (j=0;j<TAILLETABC-3;j++)
  168.     {
  169.       if(vecteur_puissance[i][j] == vecteur_puissance[i-1][j+1] && vecteur_puissance[i-1][j+1] == vecteur_puissance[i-2][j+2] && vecteur_puissance[i-2][j+2] == vecteur_puissance[i-3][j+3] && vecteur_puissance[i-3][j+3] == coupjoueur)
  170.       {
  171.         vecteur_puissance[i][j]=4;
  172.         vecteur_puissance[i-1][j+1]=4;
  173.         vecteur_puissance[i-2][j+2]=4;
  174.         vecteur_puissance[i-3][j+3]=4;
  175.         return coupjoueur; // Retourne gagne
  176.       }
  177.     }
  178.   } // Fin test diagonales A
  179.   for (i=TAILLETABL-1;i>2;i--) // Test les diagonales B
  180.   {
  181.     for (j=TAILLETABC-1;j>2;j--)
  182.     {
  183.       if(vecteur_puissance[i][j] == vecteur_puissance[i-1][j-1] && vecteur_puissance[i-1][j-1] == vecteur_puissance[i-2][j-2] && vecteur_puissance[i-2][j-2] == vecteur_puissance[i-3][j-3] && vecteur_puissance[i-3][j-3] == coupjoueur)
  184.       {
  185.         vecteur_puissance[i][j]=4;
  186.         vecteur_puissance[i-1][j-1]=4;
  187.         vecteur_puissance[i-2][j-2]=4;
  188.         vecteur_puissance[i-3][j-3]=4;
  189.         return coupjoueur; // Retourne gagne
  190.       }
  191.     }
  192.   } // Fin test diagonales B
  193.   return 0; // Retourne pas gagnant
  194. }
  195. /* Fin mod coupgagne */
  196. /* Mod place_pion */
  197. void place_pion(int vecteur_puissance[][TAILLETABC],int coupjoueur, int col)
  198. {
  199.   int ligne_temp,n;
  200.   ligne_temp = TAILLETABL-1; // Aller le plus bas possible
  201.   n=0;
  202.   do
  203.   {
  204.     if (vecteur_puissance[ligne_temp][col]==0) // Si rien
  205.     {
  206.       vecteur_puissance[ligne_temp][col]=coupjoueur; // Alors mettre
  207.       n=1;
  208.     } else ligne_temp = ligne_temp-1; // Si quelque chose
  209.   } while (n==0); // Recommencer tant que rien
  210. }
  211. /* Fin mod place_pion */
  212. /* Mod matrice_fin */
  213. int matrice_fin(int vecteur_puissance[][TAILLETABC])
  214. {
  215.   int total=0; // Compte total de cellules pleines
  216.   int i,j;
  217.   for (i=TAILLETABL-1;i>(-1);i--) // Lignes
  218.   {
  219.     for (j=0;j<TAILLETABC;j++) // Colonnes
  220.     {
  221.       if (vecteur_puissance[i][j]!=0) total=total+1; // Compteur de cellules pleines
  222.     }
  223.   }
  224.   return total; // Retourne total de cellules pleines
  225. }
  226. /* Fin mod matrice_fin */


Message édité par Falco171 le 16-02-2005 à 18:13:53
mood
Google
Posté le 14-02-2005 à 16:58:43  profilanswer
 

n°4960
Falco171
Posté le 14-02-2005 à 17:00:11  profilanswer
 

Là je gagne 100 lignes par rapport à la version de C4H8O3

n°4964
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 18:18:14  profilanswer
 

deja au lieu de faire des "if do while" tu pourrai faire des "while" (ligne 50) ca serrai un peu plus lisible ^^  
Ah et les #define sont en majuscule normalment (c'est plus clair :p)
 
(je continue ma lecture lol)


Message édité par CryoGen le 14-02-2005 à 18:20:07

---------------
I am the bone of my sword...
n°4966
Falco171
Posté le 14-02-2005 à 18:23:33  profilanswer
 

Merci pour le conseil, je suis a mes débuts aussi en c :p
 
on m'a tjs appris à faire des do {} while et non des while {} car le do while à l'avantage que si la condition est fausse avant le script, pendant que le script est lu pour la première fois il est possible de faire en sorte que la condition devienne vrai, ainsi que la boucle continue et non ne s'arrête...enfin me trompe peut-être ;)
 
edit1: ok donc dans tout le script, faut modifier le tailletab par TAILLETAB vais faire ça


Message édité par Falco171 le 14-02-2005 à 18:26:34
n°4967
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 18:27:00  profilanswer
 

ben là tu as un "if" qui controle une 1ere fois la condition , puis ca rentre dans le "do while" jusqu'a ce que la condition soit fausse...
 
autant faire un while() ^^  
le while va tester si la condition est vrai et si elle est vrai on rentre dans le while (donc c'est le role de ton "if" sauf que lui te faie rentrer dans le "do while" )


---------------
I am the bone of my sword...
n°4968
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 18:30:22  profilanswer
 

tu as fait ton code pour une matrice carrée de taille TAILLETAB
 
pourquoi tu as ca

Code :
  1. # void afficher(int vecteur_puissance[][tailletab]);
  2. # void matrice_debut(int vecteur_puissance[][tailletab]);
  3. ...


 
pk pas plutot "int matrice[][]" ou meme plutot "int** matrice" ?
 
C'est mieux comme ca ^^ les pointeurs c'est genials :p


Message édité par CryoGen le 14-02-2005 à 18:32:13

---------------
I am the bone of my sword...
n°4969
Deadog
Dain Bramaged
Posté le 14-02-2005 à 18:32:06  profilanswer
 

falco171 a écrit :

Merci pour le conseil, je suis a mes débuts aussi en c :p
 
on m'a tjs appris à faire des do {} while et non des while {} car le do while à l'avantage que si la condition est fausse avant le script, pendant que le script est lu pour la première fois il est possible de faire en sorte que la condition devienne vrai, ainsi que la boucle continue et non ne s'arrête...enfin me trompe peut-être ;)
 
edit1: ok donc dans tout le script, faut modifier le tailletab par TAILLETAB vais faire ça


 
 
cette avantage ne s'utilise que quand on en a besoin
la plus part du temps on en a pas besoin donc on fait un while ;)
 
j'ai aussi constaté que bcp de "prof" enseigné cette stupidité
c'est domage, qu'ils disent clairement que "while" et "do while" sont 2 choses différentes

n°4970
Deadog
Dain Bramaged
Posté le 14-02-2005 à 18:37:11  profilanswer
 

  • on fais les define après les includes, comme ça pas de risque qu'une librairie écrase un de tes define

en effet, les .h des librairies sont fait de tel manière que quand il rencontre un define à eux déjà défini, il l'écrase sans te prévenir
 
donc en mettant tes define après les includes, c'est toi qui veras que tu es en train (ou non) d'écraser un define ;)
 

  • la fonction main s'écrit : "int main (void)" et non "void main ()" (tout de moins quand on a pas besoin des arguments, sinon y'a un 2ème prototype)

ce qui t'oblige aussi à faire un "return 0;" à la fin du main

n°4972
Deadog
Dain Bramaged
Posté le 14-02-2005 à 18:44:05  profilanswer
 

  • matrice_debut --> matrice_init ou matrice_reset, c'est plus parlant


  • tourjoueur = tourjoueur++; ---> tourjoueur++;


  • Code :
    1. for (i=0;i<TAILLETAB;i++) // Ligne
    2.    {
    3.      printf("\n%d",i++); // Légende lignes
    4.      for (j=0;j<TAILLETAB;j++)// Colonne
    5.      {
    6.        printf("%d ", vecteur_puissance[i][j]); // Affiche la valeur de la cellule
    7.      }
    8.    }

aie ! c'est bien ce que je pensais, tu n'as pas compris la notation "i++;"
i++; incrémente la valeur de i, il ne fais pas que tu donner la valeur de i+1.
 
i = 2;
// i vaut 2
i++;
// maintenant i vaut 3
 
donc dans ton printf("\n%d",i++); tu fais incrémenter i en plus de l'incrémentation effectue dans ton for
tu dois sans doute louper des lignes :/

n°4973
Deadog
Dain Bramaged
Posté le 14-02-2005 à 18:49:58  profilanswer
 

  • fflush(stdin);

NON NON NON
on ne fait pas ça !
stdin est un flux entrant, tu n'as pas à y toucher mis à part par l'intermédiaire des fonctions de lecture du flux entrant (scanf, getchar, etc ...)
tu dois repenser ton système de lecture d'entrée, car il est mauvais  

  • col = col--; ---> col--;

pareil que la notation i++;
 

  • break; // Casse la boucle puisque vainqueur

les break dans les boucle sont tout à fais possible
mais très peu recommandé
en effet, on préfer qu'une boucle s'arrête par sa condition d'arrêt
utiliser des break dans les boucles donnes un code dit "spagheti"
c'est un peu comme utiliser des goto
repense t'as boucle ;) pê qu'avec un while ça te seras plus facile ;)
 
 
bon, essaye déjà de corriger tout ça, on veras pour la suite ;)

n°4976
Falco171
Posté le 14-02-2005 à 20:16:18  profilanswer
 

Mouarf jsuis pas malin, je viens de me rendre compte que je devais travailler sur un rectangle 6*7 vais pouvoir  
 
refaire une bonne partie...
 
CryoGen : j'ai corrigé le "do while" en "while" car comme tu me l'as indiqué le if vérifie déjà la condition.
mettre "int matrice[][]" à la place de "int matrice[][define]" on peut ? j'ai tjs appris à faire comme ça aussi..
pour ce qui est des pointeurs tu as raison, je vais d'ailleur devoir faire une version avec pointeur :p
 
Deadog :  
- "int main (void)" + "return 0;" à la fin de la fonction main j'avais jamais vu ça, on m'a tjs dit d'utiliser "void main()"
- matrice_debut modifié en matrice_init en effet ça fait mieux ;)
- tourjoueur corrigé
- euuh si j'ai bien compris le principe d'incrémentation par ++ mais je ne pensais que que le ++ dans le printf allait changer quelque chose...je fais ça pour éviter au joueur d'être perturbé par la ligne 0 ;) je rajoute donc i--; directement en-dessous du printf
- col-- corrigé, même chose qu'avec le i-- ci-dessus sauf que j'avais pas oublié de l'ajouter cette fois ;)
- fflush(stdin); je dois tous les retirer alors ? on m'a appris à toujours mettre ça avant un scanf, ça servait à effacer ce qu'il y avait en mémoire avant...
- pour le break; je vais regarder ça :)
 
je viens de le passer à la moulinette pour voir si ça allait encore planter et c'est tjs le cas, compilation ok execution ça plante...mais bon normal j'ai encore rien changé de très important, à mon avis ça doit être une de mes boucles ou conditions qui est mal pensée...


Message édité par Falco171 le 14-02-2005 à 20:23:11
n°4978
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 20:29:02  profilanswer
 

Tes profs sont vraiment horrible ^^
 
int matrice[][] c'est pareil que int** matrice >> pointeur ;)
 
pour faire passer une matrice sans pointeur je crois qu'on doit faire int matrice[taille][taille] , mais ca ne va pas modifier la matrice qui est dans le main()... va falloir faire un return matrice lol c'est trop laid ^^ passe directement au pointeur je crois ca sera plus nette :)


---------------
I am the bone of my sword...
n°4979
Deadog
Dain Bramaged
Posté le 14-02-2005 à 20:30:21  profilanswer
 

dans quel école es-tu ?
pke ils vous apprennent n'importe quoi :pfff:
je peux te l'assurer ;)
 
si tu tiens à bien apprendre le C, je te conseil d'apprendre par internet, par les forums, etc ...
style sur hfr tu pourras déjà en apprendre pas mal ;)
 
mais la, "void main()", "fflush(stdin)" et autre, c'est vraiment mal
je te donne un indice pour te passer de fflush(stdin) :
le problème c'est qu'il te reste le "\n" dans le flux d'entré
pour y pallier, après chaque entré au scanf on fait un getchar(); ;)

n°4982
Falco171
Posté le 14-02-2005 à 20:42:21  profilanswer
 

Mmmm merci bien pour toutes ces bonnes infos :) je vais passer un peu de temps dessus et je mets la nouvelle version dés que je l'ai...et qui fonctionnera je l'espère :p
 
je sais que ce serait mieux de passer aux pointeurs directement mais je termine d'abord la façon avec indices...:p
 
pour le getchar(); le prof en a rapidement parlé mais ne s'en sert jamais :(
 
par contre comme vous le dite c'est pas génial comme école, pourtant c'est une des plus réputée en belgique :( et c'est pas la première fois que j'ai ce genre de problème...pour tout dire je voudrais devenir développeur web mais il n'y a pas d'études pour ça, alors je fais de l'informatique de gestion, ce qui s'en rapproche le plus...mais bon coder en c c'est pas ce que je préfère, j'aimerais bien mieux voir le php :)
alors en plus que ça me plait pas trop, les profs font du n'importe quoi !! un autre exemple tiens : puts ("" ); j'ai lu que c'était mieux d'utiliser ça que printf quand on mettait une phrase sans appelet de constante, j'ai jamais vu ça au cours...
ou bien j'ai une prof étrangère (jai rien de mal contre eux) qui nous donne cours d'analyse, mais bon comme elle parle pas bien français, pour elle habiter a "paris" ET "lyon" c'est possible alors qu'on ne peut habiter que a "paris" OU "lyon" mais pour elle en français ça semblait normal...enfin je m'arrête là car il y en a encore des biens bonnes...
 
ca m'énerve d'étudier pour avoir un bout de papier alors que je me rend compte que ce que l'on m'apprend, je l'apprendrais mieux par moi même...
 
ps: dernière question pour remettre l'écran à zéro (effacer tout) j'utilise system("cls" ); mais il existe aussi clrscr(); ou quelque chose de semblable, laquelle est-il préférable d'utiliser ?

n°4983
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 20:51:04  profilanswer
 

Alors deja tu peux tres bien utiliser les indices avec les pointeurs ^^  
 
exemple avec tes matrices  
 

Code :
  1. void matrice_mouhahah(int** matrice)
  2. {
  3. //je veux le contenu de la case 1,0
  4. int result = matrice[1][0];
  5. }


 
la fonction system() execute la commande passer en argument
 
si tu ouvre une fentre DOS et que tu tapes "cls" , tu vas effacer la fenetre ;)


---------------
I am the bone of my sword...
n°4985
Falco171
Posté le 14-02-2005 à 21:04:44  profilanswer
 

Vi c'est juste je pourrais utiliser les indices avec les pointeurs en plus mais je dois faire une version avec rien que des indices et une version avec des pointeurs pour tout ce qui est possible...
 
pour effacer la fenêtre en fait system('cls'); ça tourne sous visual c 6 et borland c++builderx
tandis que clrsrc(); ça tourne que sous la version de bordland pas sous visual, ça donne une erreur à la compilation :( et vu que j'utilise visual à l'école...
mais vu que ça a évolué maintenant, je me demande ce qui est le mieux d'utiliser ?
 
j'avance avec le script en mettant en commentaire les fonctions afficher, matrice_init et place_pion j'ai pu compiler et exécuter...je me rapproche de l'erreur :p edit: je dirais même que ça vient de matrice_init...
 
j'ai bien difficile de trouver l'erreur dans le code de la matrice_init qui me semble bien simple pourtant...

Code :
  1. void matrice_init(int vecteur_puissance[][TAILLETAB]) // on déclare la fonction
  2. {
  3.   int i,j; // on déclare les variables
  4.   for (i=0;i<TAILLETAB;i++) // Ligne // on passe les lignes de 0 à 6 ce qui en fait 7 au total = TAILLETAB
  5.   {
  6.     for (j=0;i<TAILLETAB;j++) // Colonne // même chose que pour les lignes
  7.     {
  8.       vecteur_puissance[i][j]=0; // =0 // on met 0 dans la cellule où on est
  9.     }
  10.   }
  11. }
  12. /* Fin mod matrice_init */


Message édité par Falco171 le 14-02-2005 à 21:17:04
n°4986
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 21:29:50  profilanswer
 

Ils sont fou tes profs ^^ faire une version seulement avec des pointeurs sans utiliser les indice , ca veut dire comprendre les pointeurs à fond et aussi à quoi correspond un tableau en memoire ainsi qu'une matrice...  
 
Pour effacer l'ecran utilise la version que tu veux (et surtout celle qui amrche pour toi ;))
 
 
Le probleme avec ta fonction c'est que ca ne modofie la matrice que en local... donc il n'y a pas 36 solutions
 
Soi tu declare la matrice en global (et du coup tu ne la passes pas en parametre ;)) mais c'est pas propre du tout :D
 
Soit tu fais un return matrice (int [][] matice_init(...)) mais ca te fait utiliser les pointeurs...
 
Soit tu utilises les pointeurs


Message édité par CryoGen le 14-02-2005 à 21:32:17

---------------
I am the bone of my sword...
n°4987
Deadog
Dain Bramaged
Posté le 14-02-2005 à 21:49:29  profilanswer
 

il modifie le pointeur qu'on lui passe en paramètre
donc à moins que mon cerveau soit enfumé ce soir, je pense que c'est bon

n°4993
CryoGen
Powered by kitkat©
Posté le 14-02-2005 à 23:16:49  profilanswer
 

Deadog a écrit :

il modifie le pointeur qu'on lui passe en paramètre
donc à moins que mon cerveau soit enfumé ce soir, je pense que c'est bon


 
faut dire que je trouve bizarre le fait de specifier une des taille de la matrice et pas l'autre... ca me fait penser à un semi-pointeur [:grut]


---------------
I am the bone of my sword...
n°4994
Falco171
Posté le 14-02-2005 à 23:26:32  profilanswer
 

j'ai fais ça de façon pas très propre mais ça fonctionne :)
dans la fonctione main j'ai mis ceci :
 

Code :
  1. /* Mise en place de la matrice */
  2.   int n,m; // on déclare les variables
  3.   for (n=0;n<TAILLETAB;n++) // Ligne // on passe les lignes de 0 à 6 ce qui en fait 7 au total = TAILLETAB
  4.   {
  5.     for (m=0;m<TAILLETAB;m++) // Colonne // même chose que pour les lignes
  6.     {
  7.       puissance_4[n][m]=0; // =0 // on met 0 dans la cellule où on est
  8.     }
  9.   }


 
 
une petite pikure de rappel, "vecteur_puissance[][TAILLETAB]" dans on parle dans les posts plus haut, que je peux remplacer par "vecteur_puissance[][]" je peux faire ça quand je déclare les fonctions en début de script ? je pense que oui. dans la fonctin main ? je pense que non. dans les fonctions, lorsque je les ouvre "void xxx (vecteur_puissance[][]" ? je pense que oui.
TAILLETAB n'est donc utile que comme référence dans tout le script et comme indication pour la création du tableau dans le main
 
vais devoir virer le break kar il me pose problème, il empêche l'affichage de la personne qui a gagné...j'ai modifié ça, suffit de regarder mon premier post pour comprendre ce qui a changé...
mais j'ai un ptit problème avec le script, dans la fonction coupgagne il y a plusieurs balisent for qui renvois un return mais celui-ci est modifié en fin de fonction car si aucun des balises for n'est exécutée il faut quand même avoir un return. la solution serait un if mais celui-ci serait énorme vu toutes les conditions testées par les for.
 
edit: impossible de supprime le define dans aucune des matrice pour avoir "matrice [][]" autrement erreur à la compilation


Message édité par Falco171 le 15-02-2005 à 00:11:41
n°4999
Falco171
Posté le 15-02-2005 à 16:19:33  profilanswer
 

J'avance petit à petit, je debug et j'améliore en même temps...
Voici ce qu'il me reste à faire :
- corriger le problème de break (joueur gagnant)
- nombre de lignes utilisées en define (6)
 
Je viens de corriger l'affichage du nombre de la ligne/colonne pour qu'il se base sur le define.
J'ai voulu ajouter une demande de confirmation pour la colonne où mettre le pion et je me suis rendu compte avec ça que mon do while dans la fonction main était "trop" complet il y a tellement de conditions dans tous les sens que ça foire, je vais donc le découper en if + while :)
 
------------------------------------
 
edit: nouvelle version du script, cette fois j'ai fais disparaître le gros "do while" du main, maintenant il en reste un petit "do while" + un "if" qui contient un "while" qui contient quatres "if" et ça fonctionne parfaitement comme ça :) la confirmation aussi ;)
 
maintenant je m'attaque au "joueur gagnant" puis au "6*7"
 
pour le moment avec "joueur gagnant" je galère pas mal, impossible de sortir de la boucle "do while" de mon main, comme si la fonction coupgagne ne me retrounait rien...
j'avance, je pense que vu que j'appelle dans le "do while" la fonction "coupgagne(puissance_4,coupjoueur)" et que je la rappelle dans la condition du "do while", la condition ne peut être vérifiée vu que la première fois que la fonction a été appelée elle a modifié le tableau...
je met donc en commentaire l'appel de ce fonction dans le "do while" pour qu'il n'apparaisse plus que dans la fonction. Parfait maintenant quand un joueur gagne ça s'arrête...mais le programme se coupe à la place d'exécuter ce qu'il y a apparait le "do while"
 
------------------------
 
edit again : JE SUIS DESOLE DE VOUS ASSOMER AVEC TOUTES CES QUESTIONS ET TOUT CES POTS... voilà comme ça c'est dit :p car je comprend que ça doit en énerve plus d'un ;)
voici à quoi ressemble la fin de ma fonction main maintenant :

Code :
  1. /* Place le pion */
  2.     place_pion(puissance_4,coupjoueur,col);
  3.     /* Coup gagnant ? */
  4.     //coupgagne(puissance_4,coupjoueur);
  5.   } while (coupgagne(puissance_4,coupjoueur)==0); // Boucle du jeu
  6.   //matrice_fin(puissance_4)!=TAILLETAB*TAILLETAB ||
  7.   /* Vérification */
  8.   system("cls" ); // Vide écran
  9.   printf("Partie terminee ! Le vainqueur est le %d joueur.)", coupjoueur); // Phrase pour vainqueur
  10.   puts("\nOu alors personne n\'a fait de puissance 4 ;)" ); // Phrase pour personne
  11.   afficher(puissance_4); // Afficher la matrice


 
malgré ça, lorsque un joueur est gagnant ça plante :( je suis donc allé regarder à fond cette fonction coupgagne et je me pose la question suivant : la fonction s'arrête dés le premier return trouvé ou bien va-t-elle jusqu'à la fin de la fonction ? car si c'est le cas, j'ai lorsque un joueur gagne un "return=coupjoueur" puis à la fin de la fonction j'ai un "return 0" ce serait alors pitetre bien ça qui fait que le prog se coupe, car il reçoit un premier return qui lui dit de sortir puis un second return qui lui dit de recommencer...


Message édité par Falco171 le 15-02-2005 à 18:12:24
n°5001
CryoGen
Powered by kitkat©
Posté le 15-02-2005 à 18:56:35  profilanswer
 

Ben des que le prog rencontre un return , il return ^^ (logique ;)) et donc l'execution de la fonction s'arrette


Message édité par CryoGen le 15-02-2005 à 18:57:14

---------------
I am the bone of my sword...
n°5002
Falco171
Posté le 15-02-2005 à 22:30:39  profilanswer
 

Mmmmmm foutu c alors :p j'espérais qu'il ne s'arrête pas après un return ;) vais devoir chercher ailleur...
 
Bizarre quand même que le prog s'arrête après ma boucle "do while" et non à la fin de la fonction main :(
 
---------------
 
 
edit: mais que je suis con lol ;) je pensais que le code après mon "do while" ne s'exécutait pas, mais en fait il s'exécutait...mais le programme ne fesait que l'afficher sans attendre que l'utilisateur appuye sur une touche du clavier pour le faire disparaîte, un "getch();" a résolu le problème :)
 
 
---------------
 
Je viens de mettre à jour le script dans mon premier post, désormais il fonctionne parfaitement ce qui était loin d'être le cas dans les premières versions de ce script... :sol:
 
Mais bon le script est monté à 250 lignes mais bon c'est pour tout le blabla que j'ai rajouté ;) (Présentation du script et confirmation de chaque action)
 
Il ne me reste plus que à modifier le script en 6 lignes/7 colonnes.
Pour ça je vais créer un nouveau define, ensuite je vérifierais de mettre le bon define au bon endroit...après ça je vire dans les conditions etc. l'utilisation des chiffres pour faire désormais référence aux defines (autrement ça servirait à rien de faire des defines ;)).
 
Après ça je look exactement comment est faite la vérification des lignes, colonnes, diagonales pour voir si on pourrait joueur sur un tableau 50*50 ;)
 
Et puis pour m'amuser regarder ce qu'il est possible de faire en ai  :bounce:


Message édité par Falco171 le 15-02-2005 à 23:04:33
n°5011
Falco171
Posté le 16-02-2005 à 18:18:30  profilanswer
 

Ben je pense avoir bien avancé là :)
 
Le puissance 4 fonctionne correctement maintenant, on peut modifier le nombre de lignes/colonnes grâce aux defines sans que ça n'influence la stabilité du script ;) on peut se faire un 51*52 mdr
 
Le puissance 4 est muni d'une confirmation, pour éviter de jouer trop vite et de mettre le pion dans la mauvaise case.
 
La puissance 4 est muni d'un petit texte de présentation au début du jeu.
 
La puissance 4 renvoit un message sépcial si un joueur gagne/personne n'a pu gagner.
 
On pourrait encore faire mieux ?
 
Me reste à en faire une version avec pointeurs et ce sera parfait :D
 
ps: new script dans mon premier post ;)

n°5013
CryoGen
Powered by kitkat©
Posté le 17-02-2005 à 22:54:49  profilanswer
 

tu utilise deja les pointeurs...
 
int matrice[][taille] c'est pareil que int* matrice[taille]


---------------
I am the bone of my sword...
n°5014
Falco171
Posté le 18-02-2005 à 00:38:28  profilanswer
 

en effet  :D  
 
par contre ça devient int *mt juste ou je me trompe ? on doit po préciser de ligne ou colonne vu que c'est un pointeur...
 
voir même int * pour la création des fonctions
 
par contre quon on appelle dans le main une fonction ce serra nomfonction(matrice[][taile])


Message édité par Falco171 le 18-02-2005 à 00:40:12
n°5015
nicodache
marmotte en chocolat concept ©
Posté le 18-02-2005 à 12:46:14  profilanswer
 

Falco171 a écrit :

par contre quon on appelle dans le main une fonction ce serra nomfonction(matrice[][taile])


je crois que si tu fais ma_fonction(&matrice[taille]); ca ira aussi ;)


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5016
Falco171
Posté le 18-02-2005 à 15:00:56  profilanswer
 

oula oui c'est bien ça :p devais être un peu trop fatigué hier soir ;)

n°5039
Deadog
Dain Bramaged
Posté le 25-02-2005 à 14:19:35  profilanswer
 

c'est casse geule vos trucs la ...

n°5040
Falco171
Posté le 25-02-2005 à 14:59:44  profilanswer
 

Tant que ça fonctionne ;)

n°5041
Deadog
Dain Bramaged
Posté le 25-02-2005 à 15:30:16  profilanswer
 

Falco171 a écrit :

Tant que ça fonctionne ;)


 
 
surement pas !
c'est pas pke ça fonctionne que c'est une bonne façon
 
c'est la meilleur manière de prendre des mauvaises habitudes, et le jour ou se seras pas le même contexte ça va pas marcher et on va se demander pkoi

n°5042
Falco171
Posté le 25-02-2005 à 17:31:22  profilanswer
 

je n'ai pas dis que c'était la meilleure façon de faire un puissance 4 mais que veux-tu on m'a OBLIGE à faire comme ça :(

mood
Google
Posté le 25-02-2005 à 17:31:22  profilanswer
 


Aller à :
Ajouter une réponse
 

Hit Parade