C++ : Jeu Damier (aide)

C++ : Jeu Damier (aide) - Programmation

Marsh Posté le 10-02-2012 à 02:31:28    

Bonjour,
Est-ce qu'il y a quelqu'un qui peut me dire quel est le problème dans mon code:  
 
Instructions:
Le jeu est composé d'un damier de 8 lignes et de 12 colonnes. L'objectif est en se déplaçant sur le damier, de découvrir 15 cases où il y a des $$$$ cachés, et bien sûr de ramasser ces $$$$. Le jeu se termine lorsqu'on a cumulé 15 point (ou si on ferme la fenêtre de jeu). Tout déplacement illégal sera signalé par un beep (tentative de déplacement hors du jeu ou sur une case de type mur noir).  
 
Chaque case du jeu est visible sous une des formes suivant:  
-pierre blanche;  
-pierre grise;  
-mur noir;  
-$$$$;  
 
Au début toutes les case forment un mur noir ou sont composées de pierre blanche. Lorsque vous quitterez une case pierre blanche, celle-ci deviendra pierre grise ou bien $$$$.  
Si on découvre une case $$$, retournez-y pour amasser votre fortune. En quittant la case $$$$, celle-ci devient pierre grise.  
Lorsqu'on quitte une case pierre grise elle devient mur noir et on ne peut plus passer par là.  
 
Diagramme d'action (avant première ébauche):
Afficher le jeu  
Tant que point < 15  
Lire ToucheValide (une touche valide étant une touche de déplacement)  
Valider le déplacement  
Calculer le nouvelle position courante (si le déplacement est valide)  
Modifier le code de la nouvelle case courante (si le déplacement est valide)  
Afficher le jeu (Si nécessaire)  
 

Code :
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <iomanip>
  4. using namespace std;
  5. void main(void)
  6. {
  7. const int BAS=80, HAUT=72, DROITE=77, GAUCHE=75, HD=73, HG=71, BG=79, BD=81;
  8. const int NB_LIG=8, NB_COL=12;
  9. int i=0, j=0, Lig=0, Col=0, Points=0;
  10. // Matrice composant le damier du jeu :  
  11. // 0==Normal(Pierre blanche), 1==$$$$ caché, 2==$$$$ visible, 3==Pierre grise, 4==Mur Noir  
  12. int Mat[NB_LIG][NB_COL]={ { 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1},
  13.        { 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 0, 4},
  14.        { 0, 0, 4, 1, 4, 0, 0, 0, 0, 0, 4, 1},
  15.        { 0, 0, 4, 1, 4, 0, 0, 4, 4, 0, 4, 1},
  16.        { 1, 0, 4, 4, 4, 1, 4, 0, 4, 0, 4, 0},
  17.        { 1, 0, 1, 1, 0, 1, 4, 1, 4, 0, 4, 0},
  18.        { 1, 0, 1, 0, 0, 0, 4, 4, 4, 0, 4, 0},
  19.        { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  20.       };
  21. char Touche;
  22. bool TValide = false;
  23. bool DValide = false;
  24. cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;
  25. while (Points<15)
  26. {
  27.  /* VALIDER LA TOUCHE */
  28.  do
  29.  {
  30.   Touche = _getch();
  31.   if (Touche==80 || Touche==72 || Touche==77 || Touche==75 || Touche==73 || Touche==71 || Touche==79 || Touche==81)
  32.   {
  33.    TValide = true;
  34.   }
  35.  } while(!TValide);
  36.  /* VALIDER LE DÉPLACEMENT ET SE DÉPLACER */
  37.  switch (Touche)
  38.  {
  39.  // Bas
  40.  case 80:
  41.   if (Lig==NB_LIG-1 || Mat[Lig+1][Col]==4)
  42.    DValide = false;
  43.   else
  44.   {
  45.    Lig++;
  46.    DValide = true;
  47.   }
  48.   break;
  49.  // Haut
  50.  case 72:
  51.   if (Lig==0 || Mat[Lig-1][Col]==4)
  52.    DValide = false;
  53.   else
  54.   {
  55.    Lig--;
  56.    DValide = true;
  57.   }
  58.   break;
  59.  // Droite
  60.  case 77:
  61.   if (Col==NB_COL-1 || Mat[Lig][Col+1]==4)
  62.    DValide = false;
  63.   else
  64.   {
  65.    Col++;
  66.    DValide = true;
  67.   }
  68.   break;
  69.  // Gauche
  70.  case 75:
  71.   if (Col==0 || Mat[Lig][Col-1]==4)
  72.    DValide = false;
  73.   else
  74.   {
  75.    Col--;
  76.    DValide = true;
  77.   }
  78.   break;
  79.  // Haut Droite
  80.  case 73:
  81.   if (Col==NB_COL-1 || Lig==0 || Mat[Lig-1][Col+1]==4)
  82.    DValide = false;
  83.   else
  84.   {
  85.    Lig--;
  86.    Col++;
  87.    DValide = true;
  88.   }
  89.   break;
  90.  // Haut Gauche
  91.  case 71:
  92.   if (Lig==0 || Col==0 || Mat[Lig-1][Col-1]==4)
  93.    DValide = false;
  94.   else
  95.   {
  96.    Lig--;
  97.    Col--;
  98.    DValide = true;
  99.   }
  100.   break;
  101.  // Bas Gauche
  102.  case 79:
  103.   if (Lig==NB_LIG-1 || Col==0 || Mat[Lig+1][Col-1]==4)
  104.    DValide = false;
  105.   else
  106.   {
  107.    Lig++;
  108.    Col--;
  109.    DValide = true;
  110.   }
  111.   break;
  112.  // Bas Droite
  113.  case 81:
  114.   if (Lig==NB_LIG-1 || Col==NB_COL-1 || Mat[Lig+1][Col+1]==4)
  115.    DValide = false;
  116.   else
  117.   {
  118.    Lig++;
  119.    Col++;
  120.    DValide = true;
  121.   }
  122.   break;
  123.  }
  124. // MODIFICATION DE LA MATRICE ET ACCUMULATION DE POINTS
  125. while (!DValide)
  126. {
  127.  if (Mat[Lig][Col]==0){
  128.   Mat[Lig][Col]=3;
  129.   DValide = true;}
  130.  if (Mat[Lig][Col]==1){
  131.   Mat[Lig][Col]=2;
  132.   DValide = true;}
  133.  /* CETTE PARTIE N'A PAS L'AIR DE FONCTIONNER--------------*/
  134.  if (Mat[Lig][Col]==2){
  135.   Mat[Lig][Col]=3;
  136.   Points++;
  137.   DValide = true;}
  138.  if (Mat[Lig][Col]==3){
  139.   Mat[Lig][Col]=4;
  140.   DValide = true;}
  141.  /*---------------------------------------------------------*/
  142. }
  143. //--------------------------------------------------------------------------
  144. /* AFFICHER LE JEU */
  145. for (i=0; i<NB_LIG; i++) // Pierre blanche + $$$$ cache
  146. {
  147.  for (j=0; j<NB_COL; j++)
  148.  {
  149.   if (Mat[i][j]==0 || Mat[i][j]==1)
  150.   {
  151.    gotoxy(j*5+11, i*3+3);
  152.    cout << (char) 178 << (char) 178 << (char) 178 << (char) 178;
  153.    gotoxy(j*5+11, i*3+4);
  154.    cout << (char) 178 << (char) 178 << (char) 178 << (char) 178;
  155.   }
  156.  }
  157. }
  158. for (i=0; i<NB_LIG; i++) // $$$$ visible
  159. {
  160.  for (j=0; j<NB_COL; j++)
  161.   {
  162.    if (Mat[i][j]==2)
  163.    {
  164.     gotoxy(j*5+11, i*3+3);
  165.     cout << "$$$$";
  166.     gotoxy(j*5+11, i*3+4);
  167.     cout << "$$$$";
  168.    }
  169.   }
  170. }
  171. for (i=0; i<NB_LIG; i++) // Pierre grise
  172. {
  173.  for (j=0; j<NB_COL; j++)
  174.   {
  175.    if (Mat[i][j]==3)
  176.    {
  177.     gotoxy(j*5+11, i*3+3);
  178.     cout << (char) 176 << (char) 176 << (char) 176 << (char) 176;
  179.     gotoxy(j*5+11, i*3+4);
  180.     cout << (char) 176 << (char) 176 << (char) 176 << (char) 176;
  181.    }
  182.   }
  183. }
  184. //-------------------------------------------------------------------------------------
  185. /* CURSEUR (POSITION INITIALE)*/
  186. gotoxy(Col*5+11, Lig*3+3);
  187. cout << (char) 201 << (char) 203 << (char) 203 << (char) 187;
  188. gotoxy(Col*5+11, Lig*3+4);
  189. cout << (char) 200 << (char) 202 << (char) 202 << (char) 188;
  190. } // Fin boucle while()
  191. _getch();
  192. }


 
Les problèmes:
1) Lorsque je clique 2x sur les extrémités (ex: je suis au coin de départ Mat[0][0], je descend d'une case pour ensuite appuyer sur "haut" "haut" ) l'empreinte du curseur reste à la case Mat[0][0] mais, mon curseur se déplace quand même. Si je clique 3x sur une touche (directionnant vers le hors-champ) lorsque je suis à une extrémité, mon curseur ne se déplace plus.  
 
http://i43.tinypic.com/2ryshoi.jpghttp://i40.tinypic.com/a242.jpg
 
2) Au départ, l'écran est noir avec seulement la ligne "cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;". Je dois appuyer sur une touche directionnelle pour afficher le jeu, alors que le jeu doit s'afficher immédiatement lorsque j'ouvre l'exécutable.
 
http://i41.tinypic.com/15f0wnc.jpg
 
3) Les cases sont toutes grises au départ (elles sont supposées d'être blanches) et aucun changement ne se fait lorsque je me déplace.  
 
http://i43.tinypic.com/2lmnhqt.jpg
 
4) Devrais-je plutôt mette la "MODIFICATION DE LA MATRICE ET ACCUMULATION DE POINTS" dans aucune boucle? Est-ce que le while est inutile?


Message édité par CH0622 le 10-02-2012 à 02:32:55
Reply

Marsh Posté le 10-02-2012 à 02:31:28   

Reply

Marsh Posté le 10-02-2012 à 15:34:04    

L'erreur de base, c'est déjà de tout mettre dans un main unique, ce qui ne te permet plus de comprendre pourquoi l'affichage n'est pas appelé (pour le 2) tellement ton code est monobloc.
 
A+,


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

Marsh Posté le 10-02-2012 à 18:04:49    

Pour l'affichage c'est facile : tu as une belle boucle while qui ne se termine qu'a l'appui d'une touche et elle se trouve avant le code d'affichage, donc forcément, tant que n'appuie pas sur une touche le code d'affichage n'est pas appelé.
 
Comme gilou te le conseille, commence par découper ton code avec des fonctions ou des classes, on dirait un vieux code non structuré.
 
Une classe 'Damier' qui contient ta matrice, des méthodes de déplacement qui font les vérifications de validité, une méthode d'affichage, et on verrait bcp plus clair.
 
Ensuite par exemple :

Code :
  1. while (!DValide)
  2. {
  3. if (Mat[Lig][Col]==0){
  4.   Mat[Lig][Col]=3;
  5.   DValide = true;}
  6. if (Mat[Lig][Col]==1){
  7.   Mat[Lig][Col]=2;
  8.   DValide = true;}
  9. /* CETTE PARTIE N'A PAS L'AIR DE FONCTIONNER--------------*/
  10. if (Mat[Lig][Col]==2){
  11.   Mat[Lig][Col]=3;
  12.   Points++;
  13.   DValide = true;}
  14. if (Mat[Lig][Col]==3){
  15.   Mat[Lig][Col]=4;
  16.   DValide = true;}


 
Si par hasard Mat[Lig][Col]==1 au début, tu le passes à 2 PUIS tu tests s'il est == 2 et tu le passes à 3 ET tu testes == 3 et tu le passes à 4...
En fait dans tous les cas tu va mettre 4 comme valeur pour Mat[Lig][Col]...
Quel intérêt de mettre un while ici ? Tu peut soit faire un switch/case soit utiliser if/else.
En plus tu testes  "while (!DValide)" donc:
- Si ton déplacement est invalide tu modifies les valeurs de ta case (en écrivant toujours 4)
- Si ton déplacement est valide tu ne change pas les valeurs

Reply

Marsh Posté le 10-02-2012 à 19:04:34    

Tout fonctionne.... MAIS à l'exception de...
 
J'ai un autre problème (que j'ai oublié de mentionner)... mon pointage ne s'accumule pas. Il est toujours à 0. Le problème c'est surement que je ne l'ai pas mis dans la grande boucle (while<15), mais je ne sais pas où exactement mettre la variable Points. Je l'ai mise à certaines place dans la boucle mais, lors de l'exécution, la ligne 27 "cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;" s'affiche un peu partout sur mon jeu mais le pointage s'accumule par contre. Je voudrais qu'elle reste au point (0,0).


Message édité par CH0622 le 10-02-2012 à 19:38:45
Reply

Marsh Posté le 10-02-2012 à 23:32:25    

C'est pas bien d'effacer son sujet alors que je tape une version qui passe sous code::blocks et ne necessite pas le bousin propriétaire et pas portable de conio.h  
 
Bon, c'est pas un modèle du genre, et si j'avais fait ça en C++, j'aurais fait autrement, mais partant de ton code, et grosso modo, en découpant un peu ça de manière plus logique, ça donne ceci:

Code :
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <iomanip>
  4. #include <windows.h>
  5. using namespace std;
  6. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  7. // Emulation de procédures de dev-C++ (pas portables) sous windows
  8. int getx(void) {
  9.     CONSOLE_SCREEN_BUFFER_INFO window;
  10.     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &window);
  11.     return window.dwCursorPosition.X;
  12. }
  13. int gety(void) {
  14.     CONSOLE_SCREEN_BUFFER_INFO window;
  15.     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &window);
  16.     return window.dwCursorPosition.Y;
  17. }
  18. void setx(int x) {
  19.     COORD pos;
  20.     pos.X = x;
  21.     pos.Y = gety();
  22.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
  23. }
  24. void sety(int y) {
  25.     COORD pos;
  26.     pos.X = getx();
  27.     pos.Y = y;
  28.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
  29. }
  30. void gotoxy(int x,int y) {
  31.     setx(x);
  32.     sety(y);
  33. }
  34. void clrscr()
  35. {
  36.     COORD pos;
  37.     COORD cs = { 0, 0 };
  38.     DWORD written;
  39.     CONSOLE_SCREEN_BUFFER_INFO window;
  40.     pos.X = 0;
  41.     pos.Y = 0;
  42.     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &window);
  43.     FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), TEXT(' '), window.dwSize.X * window.dwSize.Y, cs, &written);
  44.     gotoxy(0,0);
  45. }
  46. WORD _getch() {
  47.     HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
  48.     DWORD events;
  49.     INPUT_RECORD buffer;
  50.     do {
  51.         ReadConsoleInput(handle, &buffer, 1, &events); // attend de manière bloquante un évènement clavier, menu, focus, souris...
  52.     } while (buffer.EventType != KEY_EVENT || !buffer.Event.KeyEvent.bKeyDown);
  53.     return buffer.Event.KeyEvent.wVirtualKeyCode;
  54. }
  55. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. const int NB_LIG = 8;
  57. const int NB_COL = 12;
  58. const int cell_width  = 4;
  59. const int cell_height = 2;
  60. const int cell_top_margin = 3;
  61. const int cell_left_margin = 11;
  62. const int cell_margin = 1;
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. // 0 == Normal(Pierre blanche), 1 == $$$$ caché, 2 == $$$$ visible, 3 == Pierre grise, 4 == Mur Noir
  65. void PaintCell(int li, int co, int mode) {
  66.     char color;
  67.     switch(mode) {
  68.     case 0:
  69.     case 1:
  70.         color = 178;
  71.         break;
  72.     case 2:
  73.         color = '$';
  74.         break;
  75.     case 3:
  76.         color = 176;
  77.         break;
  78.     case 4:
  79.         color = ' ';
  80.         break;
  81.     default:
  82.         color = ' ';
  83.         break;
  84.     }
  85.     for (int k = 0; k < cell_height; ++k) {
  86.         gotoxy(cell_left_margin + co * (cell_width + cell_margin), k + cell_top_margin + li *(cell_height + cell_margin));
  87.         for (int l = 0; l < cell_width; ++l) {
  88.             cout << color;
  89.         }
  90.     }
  91. }
  92. void PaintCursor(int li, int co) {
  93.     gotoxy(cell_left_margin + co * (cell_width + cell_margin), cell_top_margin + li *(cell_height + cell_margin));
  94.     // cablé sur une largeur de 4
  95.     cout << (char) 201 << (char) 203 << (char) 203 << (char) 187;
  96.     // puis cell_height - 2 lignes a remplir si la hauteur n'est pas 2, puis
  97.     gotoxy(cell_left_margin + co * (cell_width + cell_margin), (cell_height - 1) + cell_top_margin + li *(cell_height + cell_margin));
  98.     // cablé sur une largeur de 4
  99.     cout << (char) 200 << (char) 202 << (char) 202 << (char) 188;
  100. }
  101. //positionne juste après la fin du tableau affiché
  102. void EndPos() {
  103.     gotoxy(cell_width + cell_left_margin + ((NB_COL - 1) * (cell_width  + cell_margin)),
  104.            (cell_height - 1) + cell_top_margin  + ((NB_LIG - 1) * (cell_height + cell_margin)));
  105. }
  106. recalcule la couleur et éventuellement met a jour le score
  107. int recalc(int color, int *score) {
  108.     switch (color) {
  109.     case 0:
  110.         color = 3;
  111.         break;
  112.     case 1:
  113.         color = 2;
  114.         break;
  115.     case 2:
  116.         color = 3;
  117.         ++*score;
  118.         break;
  119.     case 3:
  120.         color = 4;
  121.         break;
  122.     case 4:
  123.     default:
  124.         break;
  125.     }
  126.     return color;
  127. }
  128. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  129. int main()
  130. {
  131.     int i=0, j=0, Lig=0, Col=0, Points=0;
  132.     // Matrice composant le damier du jeu :
  133.     // 0==Normal(Pierre blanche), 1==$$$$ caché, 2==$$$$ visible, 3==Pierre grise, 4==Mur Noir
  134.     int Mat[NB_LIG][NB_COL]= { { 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1},
  135.         { 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 0, 4},
  136.         { 0, 0, 4, 1, 4, 0, 0, 0, 0, 0, 4, 1},
  137.         { 0, 0, 4, 1, 4, 0, 0, 4, 4, 0, 4, 1},
  138.         { 1, 0, 4, 4, 4, 1, 4, 0, 4, 0, 4, 0},
  139.         { 1, 0, 1, 1, 0, 1, 4, 1, 4, 0, 4, 0},
  140.         { 1, 0, 1, 0, 0, 0, 4, 4, 4, 0, 4, 0},
  141.         { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  142.     };
  143.     WORD Touche;
  144.     bool TValide = false;
  145.     bool DValide = false;
  146.     bool quit = false;
  147.     clrscr();
  148.     cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;
  149.     for (i=0; i<NB_LIG; i++) {
  150.         for (j=0; j<NB_COL; j++) {
  151.             PaintCell(i, j, Mat[i][j]);
  152.         }
  153.     }
  154.     // Pour la position initiale
  155.     PaintCursor(Lig, Col);
  156.     // a toi de voir si tu veut le faire ou pas pour la position de départ
  157.     Mat[Lig][Col] = recalc(Mat[Lig][Col], &Points);
  158.     // Boucle principale du jeu
  159.     // On boucle jusqu'à ce que le score soit bon ou qu'on quitte
  160.     do {
  161.         DValide = false;
  162.         // On boucle jusqu'a avoir un déplacement valide
  163.         do {
  164.             TValide = false;
  165.             // On boucle jusqu'a avoir une touche valide
  166.             do {
  167.                 switch (Touche = _getch()) {
  168.                 case VK_DOWN:
  169.                 case VK_UP:
  170.                 case VK_RIGHT:
  171.                 case VK_LEFT:
  172.                 case VK_PRIOR:
  173.                 case VK_NEXT:
  174.                 case VK_END:
  175.                 case VK_HOME:
  176.                 case VK_ESCAPE:
  177.                     TValide = true;
  178.                     break;
  179.                 default:
  180.                     TValide = false;
  181.                     break;
  182.                 }
  183.             } while(!TValide);
  184.             // On a une touche valide, on regarde si le déplacement est valide
  185.             // sinon on reboucle
  186.             switch(Touche) {
  187.             case VK_DOWN:
  188.                 DValide = ((Lig < NB_LIG - 1) && (Mat[Lig+1][Col] != 4));
  189.                 break;
  190.             case VK_UP:
  191.                 DValide = ((Lig > 0) && (Mat[Lig-1][Col]!=4));
  192.                 break;
  193.             case VK_RIGHT:
  194.                 DValide = ((Col < NB_COL - 1) && (Mat[Lig][Col+1] != 4));
  195.                 break;
  196.             case VK_LEFT:
  197.                 DValide = ((Col > 0) && (Mat[Lig][Col-1] != 4));
  198.                 break;
  199.             case VK_PRIOR:
  200.                 DValide = ((Col < NB_COL - 1) && (Lig > 0) && (Mat[Lig-1][Col+1]!=4));
  201.                 break;
  202.             case VK_NEXT:
  203.                 DValide = ((Lig < NB_LIG - 1) && (Col < NB_COL - 1) && (Mat[Lig+1][Col+1] != 4));
  204.                 break;
  205.             case VK_END:
  206.                 DValide = ((Lig < NB_LIG - 1) && (Col > 0) && (Mat[Lig+1][Col-1] != 4));
  207.                 break;
  208.             case VK_HOME:
  209.                 DValide = ((Lig > 0) && (Col > 0) && (Mat[Lig-1][Col-1] != 4));
  210.                 break;
  211.             case VK_ESCAPE:
  212.                 DValide = true;
  213.                 break;
  214.             }
  215.         } while (!DValide);
  216.         // On va changer de position on repaint la case ou l'on était, que le curseur quitte
  217.         gotoxy(0,0);
  218.         cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;
  219.         PaintCell(Lig, Col, Mat[Lig][Col]);
  220.         // on a eu un déplacement valide, on effectue le changement de position
  221.         switch(Touche) {
  222.         case VK_DOWN:
  223.             ++Lig;
  224.             break;
  225.         case VK_UP:
  226.             --Lig;
  227.             break;
  228.         case VK_RIGHT:
  229.             ++Col;
  230.             break;
  231.         case VK_LEFT:
  232.             --Col;
  233.             break;
  234.         case VK_PRIOR:
  235.             --Lig;
  236.             ++Col;
  237.             break;
  238.         case VK_NEXT:
  239.             ++Lig;
  240.             ++Col;
  241.             break;
  242.         case VK_END:
  243.             ++Lig;
  244.             --Col;
  245.             break;
  246.         case VK_HOME:
  247.             --Lig;
  248.             --Col;
  249.             break;
  250.         case VK_ESCAPE:
  251.             quit = true;
  252.             break;
  253.         }
  254.         // On paint le curseur à la position courante
  255.         PaintCursor(Lig, Col);
  256.         // Pas certain que ce soit le moment adéquat
  257.         // a toi de voir quand le score doit être recalculé
  258.         Mat[Lig][Col] = recalc(Mat[Lig][Col], &Points);
  259.     } while (Points < 15 && !quit);
  260.     // Pour que la console reprenne bien positionnée après l'écran de jeu
  261.     EndPos();
  262.     printf("\n" ); // le prompt juste sous le tableau c'est moche
  263.     return 0;
  264. }


J'espère que tu vois la qu'en découpant de manière logique ton switch en deux:
un pour la validité du déplacement et un pour le déplacement lui même, ça devient bien plus clair et simple comme code.
J'ai écrit des procédures assez génériques si tu modifies la taille des cases, mais celle d'affichage du curseur ne l'est pas.
A+,


Message édité par gilou le 12-02-2012 à 04:23:45

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

Sujets relatifs:

Leave a Replay

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