besoin d'aide pour faire un puissance 4 avec structures

besoin d'aide pour faire un puissance 4 avec structures - C++ - Programmation

Marsh Posté le 02-05-2006 à 17:11:24    

Bonjour a tous,  
voila pour la fac je dois faire un puissance 4, j'ai commencé à créer certains trucs mais là je bloque pour faire faire la fonction qui test si 4 pions sont alignés diagnonalement :( , voici ce que j'ai dejà fait :  

Code :
  1. // Puissance4.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "stdio.h"
  5. #include "iostream.h"
  6. #include "stdlib.h"
  7. struct puiss4
  8. {
  9. int donnees[6][7]; // tableau à 2 valeurs correspondantes aux lignes et colonnes de la grille : [lignes][colonnes].
  10. int nb[7];         // tableau qui correspond aux colonnes de la grille et prend comme valeurs le nombres de cases remplies selon la colonne.
  11. };
  12. void initialise(struct puiss4 &P)  // initialise la grille en affectant 0 à chaque case.
  13. {
  14. int l, c;
  15. for (l=0;l<6;l++)
  16. {
  17.  for (c=0;c<7;c++)
  18.  {
  19.   P.donnees[l][c]=0;
  20.   P.nb[c]=0;
  21.  }
  22. }
  23. }
  24. void affiche(struct puiss4 P)   // affiche la grille contenant des 0 ou des 1.
  25. {
  26. int l, c;
  27. for (l=0;l<6;l++)
  28. {
  29.  for (c=0;c<7;c++)
  30.  {
  31.   cout<<P.donnees[l][c]<<";";
  32.  }
  33.  cout<<endl;
  34. }
  35. }
  36. void remplir_grille(struct puiss4 &P, int m)  // remplie la grille de la valeur affectée à m.
  37. {
  38. int c;
  39. cout<<"Joueur "<<m<<" : entrez la colonne que vous souahitez remplir : ";
  40. cin>>c;
  41. c=c-1;          // c devient c-1 pour correspondre avec le tableau.
  42. P.nb[c]=P.nb[c]+1;       // le nombre de cases remplies dans la colonne augmente.
  43. P.donnees[6-P.nb[c]][c]=m;     // on remplie ensuite la case de la valeur de m (m=1<=>joueur 1, m=2<=>joueur 2 par exemple).
  44. }
  45. int test_horizontal(struct puiss4 P,int c, int J)  // effectue un test horizontal (retourne 1 si le test est vérifié, 0 sinon) sur la ligne correpondante au dernier pion mis pour verifier si 4 valeurs alignées horizontalement vont etre égales, J correspond au joueur, exemple J=1 : la fonction test s'il y a 4 valeurs égales alignées.
  46. {
  47. int l=6-P.nb[c];        // l correspond à la ligne du dernier pion mis.
  48. for (int col=0;col<4;col++)      // col va de 0 à 4 pour ensuite testé 4 valeurs alignées.
  49. {
  50.  if (P.donnees[l][col]==J && P.donnees[l][col+1]==J && P.donnees[l][col+2]==J && P.donnees[l][col+3]==J)  // test les 4 valeurs alignées de la ligne du dernier pion mis, puis incrémente le col pour effectuer le test sur la ligne complète.
  51.  {
  52.   return 1;
  53.  }
  54. }
  55. return 0;
  56. }
  57. int test_vertical(struct puiss4 P, int c, int J)   // même test mais cette fois ci verticalement
  58. {
  59. int l=6-P.nb[c];
  60. int h=P.nb[c];     // h la hauteur de la colonne ou le joueur vient de mettre le pion (la colonne c).
  61. for (l=1;l<4;l++)
  62. {
  63.  if (P.donnees[l][c]==J && P.donnees[l+1][c]==J && P.donnees[l+2][c]==J && P.donnees[l+3][c]==J)  // test s'il y a 4 valeurs égales à la suite dans la colonne où le joueur vien de mettre le pion.
  64.  {
  65.   return 1;
  66.  }
  67. }
  68. return 0;
  69. }
  70. void main(void)
  71. {
  72. }


 
aidez moi SVP car ca fait un bon moment que je bloque :'(
merci d'avance :)

Reply

Marsh Posté le 02-05-2006 à 17:11:24   

Reply

Marsh Posté le 02-05-2006 à 19:08:34    

UP

Reply

Marsh Posté le 03-05-2006 à 13:26:21    

Salut,
Je pense qu'il faut faire une fonction pour tester les diagonales bas-gauche -> haut-droite et une pour haut-gauche -> bas-droite (ou équivalent : par ex : haut->droite -> bas-gauche et bas-droite -> haut gauche) pour bas-gauche -> haut-droite ça fera un truc du genre :

Code :
  1. int test_diag_bg_hd(struct puiss4 P, int J)
  2. {
  3.    int i = 0, j = 0;
  4.    for (i = 0; i < 3; i++)
  5.    {
  6.        for (j = 0; j < 4; j++)
  7.        {
  8.             if (P.donnees[i][j]==J && P.donnees[i+1][j+1]==J && ...)
  9.                    return 1;
  10.        }
  11.    }
  12.    return 0;
  13. }


 
Et un truc du même genre pour l'autre.

Reply

Marsh Posté le 03-05-2006 à 13:40:49    

grostony a écrit :

Salut,
Je pense qu'il faut faire une fonction pour tester les diagonales bas-gauche -> haut-droite et une pour haut-gauche -> bas-droite (ou équivalent : par ex : haut->droite -> bas-gauche et bas-droite -> haut gauche) pour bas-gauche -> haut-droite ça fera un truc du genre :

Code :
  1. int test_diag_bg_hd(struct puiss4 P, int J)
  2. {
  3.    int i = 0, j = 0;
  4.    for (i = 0; i < 3; i++)
  5.    {
  6.        for (j = 0; j < 4; j++)
  7.        {
  8.             if (P.donnees[i][j]==J && P.donnees[i+1][j+1]==J && ...)
  9.                    return 1;
  10.        }
  11.    }
  12.    return 0;
  13. }


 
Et un truc du même genre pour l'autre.


merci bien pour ta réponse,  
j'ai essayer un truc je ne sais pas si ca marche je vais tester ca...

Code :
  1. int test_diagonale_croiss(struct puiss4 P, int c, int J) // test l'alignement de 4 pions du joueur J selon la diagonale croissante.
  2. {
  3. int col_depart=0;    // entier correspondant à la colonne de départ de la diagonale.
  4. int ligne_depart=5;    // entier correspondant à la ligne de départ de la diagonale.  
  5. col_depart=c+1-P.nb[c];   // calcul permettant de trouver la colonne de départ.
  6. ligne_depart=col_depart+5;  // calcul permettant de trouver la ligne de depart de la diagonale.
  7. if (col_depart<0)    // affecte 0 à la colonne de départ si le calcul ci-dessus est négatif (cad si la diagonale part de la 1ère colonne et d'une ligne supérieure ou égale à 1.
  8. {
  9.  col_depart=0;
  10. }
  11. if (col_depart>3 || ligne_depart<3)
  12. {
  13.  return 0;     // retourn faux si la colonne de depart est sup ou égale à 4 ou si la ligne de départ est inf ou égal à 3 car dans ce cas là, la taille de la diagonale (croissante) ne pourra excéder 4.  
  14. }
  15. else
  16. {
  17.  for (int i=col_depart;i<4;i++)
  18.  {
  19.   for (int j=ligne_depart;j>2;j--)
  20.   {
  21.    if (P.donnees[i][j]==J && P.donnees[i+][j-1]==J && P.donnees[i+2][j-2]==J && P.donnees[i+3][j-3]==J)
  22.    {
  23.     return 1;
  24.    }
  25.   }
  26.  }
  27. }
  28. return 0;
  29. }


Bon le j-- c'est parck les lignes de ma grille vont de 0 à 5 de haut en bas.
Merci encore :)

Reply

Sujets relatifs:

Leave a Replay

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