gilou Modérateur Modzilla | 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 :
- #include <iostream>
- #include <cstdio>
- #include <iomanip>
- #include <windows.h>
- using namespace std;
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Emulation de procédures de dev-C++ (pas portables) sous windows
- int getx(void) {
- CONSOLE_SCREEN_BUFFER_INFO window;
- GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &window);
- return window.dwCursorPosition.X;
- }
- int gety(void) {
- CONSOLE_SCREEN_BUFFER_INFO window;
- GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &window);
- return window.dwCursorPosition.Y;
- }
- void setx(int x) {
- COORD pos;
- pos.X = x;
- pos.Y = gety();
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
- }
- void sety(int y) {
- COORD pos;
- pos.X = getx();
- pos.Y = y;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
- }
- void gotoxy(int x,int y) {
- setx(x);
- sety(y);
- }
- void clrscr()
- {
- COORD pos;
- COORD cs = { 0, 0 };
- DWORD written;
- CONSOLE_SCREEN_BUFFER_INFO window;
- pos.X = 0;
- pos.Y = 0;
- GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &window);
- FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), TEXT(' '), window.dwSize.X * window.dwSize.Y, cs, &written);
- gotoxy(0,0);
- }
- WORD _getch() {
- HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
- DWORD events;
- INPUT_RECORD buffer;
- do {
- ReadConsoleInput(handle, &buffer, 1, &events); // attend de manière bloquante un évènement clavier, menu, focus, souris...
- } while (buffer.EventType != KEY_EVENT || !buffer.Event.KeyEvent.bKeyDown);
- return buffer.Event.KeyEvent.wVirtualKeyCode;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- const int NB_LIG = 8;
- const int NB_COL = 12;
- const int cell_width = 4;
- const int cell_height = 2;
- const int cell_top_margin = 3;
- const int cell_left_margin = 11;
- const int cell_margin = 1;
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // 0 == Normal(Pierre blanche), 1 == $$$$ caché, 2 == $$$$ visible, 3 == Pierre grise, 4 == Mur Noir
- void PaintCell(int li, int co, int mode) {
- char color;
- switch(mode) {
- case 0:
- case 1:
- color = 178;
- break;
- case 2:
- color = '$';
- break;
- case 3:
- color = 176;
- break;
- case 4:
- color = ' ';
- break;
- default:
- color = ' ';
- break;
- }
- for (int k = 0; k < cell_height; ++k) {
- gotoxy(cell_left_margin + co * (cell_width + cell_margin), k + cell_top_margin + li *(cell_height + cell_margin));
- for (int l = 0; l < cell_width; ++l) {
- cout << color;
- }
- }
- }
- void PaintCursor(int li, int co) {
- gotoxy(cell_left_margin + co * (cell_width + cell_margin), cell_top_margin + li *(cell_height + cell_margin));
- // cablé sur une largeur de 4
- cout << (char) 201 << (char) 203 << (char) 203 << (char) 187;
- // puis cell_height - 2 lignes a remplir si la hauteur n'est pas 2, puis
- gotoxy(cell_left_margin + co * (cell_width + cell_margin), (cell_height - 1) + cell_top_margin + li *(cell_height + cell_margin));
- // cablé sur une largeur de 4
- cout << (char) 200 << (char) 202 << (char) 202 << (char) 188;
- }
- //positionne juste après la fin du tableau affiché
- void EndPos() {
- gotoxy(cell_width + cell_left_margin + ((NB_COL - 1) * (cell_width + cell_margin)),
- (cell_height - 1) + cell_top_margin + ((NB_LIG - 1) * (cell_height + cell_margin)));
- }
- recalcule la couleur et éventuellement met a jour le score
- int recalc(int color, int *score) {
- switch (color) {
- case 0:
- color = 3;
- break;
- case 1:
- color = 2;
- break;
- case 2:
- color = 3;
- ++*score;
- break;
- case 3:
- color = 4;
- break;
- case 4:
- default:
- break;
- }
- return color;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- int main()
- {
- int i=0, j=0, Lig=0, Col=0, Points=0;
- // Matrice composant le damier du jeu :
- // 0==Normal(Pierre blanche), 1==$$$$ caché, 2==$$$$ visible, 3==Pierre grise, 4==Mur Noir
- int Mat[NB_LIG][NB_COL]= { { 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1},
- { 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 0, 4},
- { 0, 0, 4, 1, 4, 0, 0, 0, 0, 0, 4, 1},
- { 0, 0, 4, 1, 4, 0, 0, 4, 4, 0, 4, 1},
- { 1, 0, 4, 4, 4, 1, 4, 0, 4, 0, 4, 0},
- { 1, 0, 1, 1, 0, 1, 4, 1, 4, 0, 4, 0},
- { 1, 0, 1, 0, 0, 0, 4, 4, 4, 0, 4, 0},
- { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
- };
- WORD Touche;
- bool TValide = false;
- bool DValide = false;
- bool quit = false;
- clrscr();
- cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;
- for (i=0; i<NB_LIG; i++) {
- for (j=0; j<NB_COL; j++) {
- PaintCell(i, j, Mat[i][j]);
- }
- }
- // Pour la position initiale
- PaintCursor(Lig, Col);
- // a toi de voir si tu veut le faire ou pas pour la position de départ
- Mat[Lig][Col] = recalc(Mat[Lig][Col], &Points);
- // Boucle principale du jeu
- // On boucle jusqu'à ce que le score soit bon ou qu'on quitte
- do {
- DValide = false;
- // On boucle jusqu'a avoir un déplacement valide
- do {
- TValide = false;
- // On boucle jusqu'a avoir une touche valide
- do {
- switch (Touche = _getch()) {
- case VK_DOWN:
- case VK_UP:
- case VK_RIGHT:
- case VK_LEFT:
- case VK_PRIOR:
- case VK_NEXT:
- case VK_END:
- case VK_HOME:
- case VK_ESCAPE:
- TValide = true;
- break;
- default:
- TValide = false;
- break;
- }
- } while(!TValide);
- // On a une touche valide, on regarde si le déplacement est valide
- // sinon on reboucle
- switch(Touche) {
- case VK_DOWN:
- DValide = ((Lig < NB_LIG - 1) && (Mat[Lig+1][Col] != 4));
- break;
- case VK_UP:
- DValide = ((Lig > 0) && (Mat[Lig-1][Col]!=4));
- break;
- case VK_RIGHT:
- DValide = ((Col < NB_COL - 1) && (Mat[Lig][Col+1] != 4));
- break;
- case VK_LEFT:
- DValide = ((Col > 0) && (Mat[Lig][Col-1] != 4));
- break;
- case VK_PRIOR:
- DValide = ((Col < NB_COL - 1) && (Lig > 0) && (Mat[Lig-1][Col+1]!=4));
- break;
- case VK_NEXT:
- DValide = ((Lig < NB_LIG - 1) && (Col < NB_COL - 1) && (Mat[Lig+1][Col+1] != 4));
- break;
- case VK_END:
- DValide = ((Lig < NB_LIG - 1) && (Col > 0) && (Mat[Lig+1][Col-1] != 4));
- break;
- case VK_HOME:
- DValide = ((Lig > 0) && (Col > 0) && (Mat[Lig-1][Col-1] != 4));
- break;
- case VK_ESCAPE:
- DValide = true;
- break;
- }
- } while (!DValide);
- // On va changer de position on repaint la case ou l'on était, que le curseur quitte
- gotoxy(0,0);
- cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;
- PaintCell(Lig, Col, Mat[Lig][Col]);
- // on a eu un déplacement valide, on effectue le changement de position
- switch(Touche) {
- case VK_DOWN:
- ++Lig;
- break;
- case VK_UP:
- --Lig;
- break;
- case VK_RIGHT:
- ++Col;
- break;
- case VK_LEFT:
- --Col;
- break;
- case VK_PRIOR:
- --Lig;
- ++Col;
- break;
- case VK_NEXT:
- ++Lig;
- ++Col;
- break;
- case VK_END:
- ++Lig;
- --Col;
- break;
- case VK_HOME:
- --Lig;
- --Col;
- break;
- case VK_ESCAPE:
- quit = true;
- break;
- }
- // On paint le curseur à la position courante
- PaintCursor(Lig, Col);
- // Pas certain que ce soit le moment adéquat
- // a toi de voir quand le score doit être recalculé
- Mat[Lig][Col] = recalc(Mat[Lig][Col], &Points);
- } while (Points < 15 && !quit);
- // Pour que la console reprenne bien positionnée après l'écran de jeu
- EndPos();
- printf("\n" ); // le prompt juste sous le tableau c'est moche
- return 0;
- }
|
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é! --
|