[C] Afficher une grille

Discutez d'informatique ici !
Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 19 Mar 2014, 01:27

en fait
X0 + terrain_X - BORD : 52462 (????????????????)

ca correspond à 524
et la première bande à 62. (t'as oublié le retour à la ligne :lol3: )

Maintenant tu devrais pas avoir 524 mais 10+400-2 = 418
la raison c'est que dans terrain_X au lieu d'avoir 400 tu as...

2*BORD + CASE*X + TRAIT*(X-1) qui résolve as
4 + CASE*X + TRAIT*(X-1)

en particulier, CASE*X vaut...
CASE*N-2

qui te donne donc 500-2 au lieu de 50*(N-2)
conclusion quand tu utilises des macros, tu écriras
Code: Tout sélectionner
terrain_X = 2*(BORD) + (CASE)*(X) + (TRAIT)*((X)-1)
la vie est une fête :)



Vupen
Membre Relatif
Messages: 124
Enregistré le: 14 Jan 2014, 21:06

par Vupen » 19 Mar 2014, 01:30

YOUPI, ça marche ! (ou on ajoute tout simplement () au niveau des macros !)

C'était très subtile ...... Encore merci !

Vupen
Membre Relatif
Messages: 124
Enregistré le: 14 Jan 2014, 21:06

par Vupen » 19 Mar 2014, 02:43

Je reviens à la charge pour un tout petit pinaillement. Y a un pixel qui m'échappe après la dernière ligne (ça peut paraitre trop pointilleux mais comme le dméineur se fait par la position des clics, autant avoir la grille la plus parfaite qui soit pour éviter les erreurs ...)

Code: Tout sélectionner
#include
#define M 10 // lignes
#define N 10 // colonnes
#define Y (M-2) // lignes
#define X (N-2) // colonnes
#define CASE 50
#define TRAIT 2
#define BORD 4
#define X0 10
#define Y0 10
#define terrain_X 2*BORD + CASE*X + TRAIT*(X+1) // largeur
#define terrain_Y  2*BORD + CASE*Y + TRAIT*(Y+1) // hauteur
#define NBR_MINES 20
 
void afficher_terrain() {
        int i ;
   CINI_fill_rect(X0, Y0, terrain_X, BORD, "red") ;
   CINI_fill_rect(X0, Y0 + terrain_Y, terrain_X, BORD, "red") ;
   CINI_fill_rect(X0, Y0,BORD, terrain_Y, "red") ;
   CINI_fill_rect(X0 + terrain_X - BORD, Y0,BORD, terrain_Y, "red") ;   
   for (i=0 ; i < X + 2 ; i++) {
      CINI_fill_rect(X0 + BORD + i*(TRAIT + CASE), Y0 + BORD, TRAIT, terrain_Y - 2*BORD, "grey") ;
   for (i= 0 ; i < Y + 2 ; i++) {
      CINI_fill_rect(X0 + BORD, Y0 + BORD + i*(TRAIT + CASE), terrain_X-2*BORD, TRAIT, "grey") ;
   }
      
}   

int main() {
       
        CINI_open_window(2*BORD + CASE*X + TRAIT*(X+1) + 20, 2*BORD + CASE*Y + TRAIT*(Y+1) + 20, "Demineur") ;
        afficher_terrain() ;
        CINI_loop() ;
        return 0 ;
   }


Image

Vupen
Membre Relatif
Messages: 124
Enregistré le: 14 Jan 2014, 21:06

par Vupen » 19 Mar 2014, 06:00

En guise de test, j'aimerai que l'en me renvoie la ligne/colonne qui correspond au clic, avec la coordonnée = -1 si cela ne correspond à aucune ligne ou colonne de la grille.

Bon, ça c'est ok. Mon problème est que j'aimerai que cela m'affiche le couple à chaque fois que je clique. Or pour le moment, je suis obligé de cliquer sur la "X" de la fenetre graphique (elle ne se ferme pas) puis cliquer sur une case pour que le truc continue, j'aimerais pouvoir faire ça sans avoir à cliquer sur la "X", mais comment ? J'ai essayé avec une boucle do-while mais il faut que je clique deux fois sur la case après avoir (tjrs) cliqué sur "X" (ce qui est compréhensible puisque la condition n'est vérifiée qu'à la fin de la boucle)

CINI_loop_until_clic() met le programme en attente jusqu'à ce que l'utilisateur :
- ferme la fenetre, elle renvoie -1
- clique dans la fenetre, elle renvoie 0.
CINI_loop empeche le programme de se fermer tant que l'utilisateur n'a pas cliqué sur "X" de la fenetre.


Code: Tout sélectionner
#include
#define M 10 // lignes
#define N 12 // colonnes
#define Y (M-2) // lignes
#define X (N-2) // colonnes
#define CASE 50
#define TRAIT 2
#define BORD 4
#define X0 10
#define Y0 10
#define terrain_X 2*BORD + CASE*X + TRAIT*(X+1) // largeur
#define terrain_Y  2*BORD + CASE*Y + TRAIT*(Y+1) // hauteur
#define NBR_MINES 20

void init_terrain(int terrain[M][N]) {
   int i, j ;
   for (i = 0 ; i  Y0 + BORD + i*(TRAIT + CASE)) && (clic_Y  X0 + BORD + i*(TRAIT + CASE)) && (clic_X < X0 + BORD + (i+1)*(TRAIT + CASE))) {      
      return i+1 ;
      }      
   }
   return -1 ;
}

void afficher_terrain() {
   int i ;
   CINI_fill_rect(X0, Y0, terrain_X, BORD, "red") ;
   CINI_fill_rect(X0, Y0 + terrain_Y, terrain_X, BORD, "red") ;
   CINI_fill_rect(X0, Y0,BORD, terrain_Y, "red") ;
   CINI_fill_rect(X0 + terrain_X - BORD, Y0,BORD, terrain_Y, "red") ;   
   for (i=0 ; i < X + 2 ; i++) {
      CINI_fill_rect(X0 + BORD + i*(TRAIT + CASE), Y0 + BORD, TRAIT, terrain_Y - 2*BORD, "grey") ;      
   }   
   for (i= 0 ; i < Y + 2 ; i++) {
      CINI_fill_rect(X0 + BORD, Y0 + BORD + i*(TRAIT + CASE), terrain_X-2*BORD, TRAIT, "grey") ;
   }
}

int main() {
   int terrain[M][N]   
   init_terrain(terrain) ;   
   CINI_open_window(2*BORD + CASE*X + TRAIT*(X+1) + 20, 2*BORD + CASE*Y + TRAIT*(Y+1) + 20, "Demineur") ;
   afficher_terrain() ;
   while(CINI_loop_until_clic() != -1) {      
      printf("(%d, %d)\n", get_terrain_ligne(), get_terrain_colonne()) ;
      CINI_loop() ;   }    
   return 0 ;
}

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 19 Mar 2014, 08:44

Y a un pixel qui m'échappe(ça peut paraitre trop pointilleux mais comme le dméineur...)

rien de genant à vouloir etre pointilleux, spécialement si c'est un projet personnel :lol3:

pour le pixel qui disparait, il suffit de voir la symétrie, si ca marche pour les x, ca doit marcher pour les y
particulièrement en plus si ton rectangle est carré.
Code: Tout sélectionner
CINI_fill_rect(X0, Y0, terrain_X, BORD, "red") ;
//ci-dessous tu soustraits pas BORD
CINI_fill_rect(X0, Y0 + terrain_Y, terrain_X, BORD, "red") ;
CINI_fill_rect(X0, Y0,BORD, terrain_Y, "red") ;
//ci-dessous tu soustraits BORD
CINI_fill_rect(X0 + terrain_X - BORD, Y0,BORD, terrain_Y, "red") ;

donc ya très fortement une des deux lignes qui est fausse
Au passage
Code: Tout sélectionner
CINI_open_window(2*BORD + CASE*X + TRAIT*(X+1) + 20, 2*BORD + CASE*Y + TRAIT*(Y+1) + 20, "Demineur") ;


peut etre évidemment simplifiée par
Code: Tout sélectionner
CINI_open_window(terrain_X + 20, terrain_Y + 20, "Demineur") ;


En guise de test...

Que fait clic_X = CINI_clic_posx() ;
parce que si ca attend un click, c'est mort...
la vie est une fête :)

Vupen
Membre Relatif
Messages: 124
Enregistré le: 14 Jan 2014, 21:06

par Vupen » 19 Mar 2014, 18:11

Pour le pixel manquant, c'est ok.

Pour le deuxième problème, la fonction cini_clic_posx récupère juste la coordonnée x du clic, c'est CINI_loop_until_clic uqi met en attente le prog.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 19 Mar 2014, 21:45

ben tout ce que je peux te conseiller c'est d'afficher les valeurs de get_terrain_ligne que tu obtiens quand tu cliques, idem pour get_terrain_colonne, et t'assurer que tu retournes pas -1 quand tu cliques correctement...

ainsi que mettre un simple printf dans ton while avant ton printf qui appele get_terrain, pour etre sur que tu obtiens bien tous les clicks.

Le problème de ces librairies importées c'est que généralement quand elles sont fournies par le prof elles marchent pas très bien ou sont mal documentées... :mur:

également afficher clic_X et clic_Y...pour etre sur que ca renvoie bien la bonne position.

Et de manière plus générale encore, toujours afficher les valeurs quand tu bloques (ou même les vérifier à chaque fois que tu ajoutes qqch), et regarder si elles sont correctes ou pas
la vie est une fête :)

Vupen
Membre Relatif
Messages: 124
Enregistré le: 14 Jan 2014, 21:06

par Vupen » 19 Mar 2014, 21:50

Les valeurs affichées sont bonnes, mon problème se situe au niveau du "rafraichissement" du terminal où sont affichés les printf : je suis obligé de cliquer sur "X" pour que mon programme m'affiche mes clics, donc a fortiori, je vais etre oblié de cliquer à chaque fois sur "X" pour pouvoir jouer au démineur

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite