#include #include #include #include #include #include #include /* * conversion d'un entier positif (<62) en caractere [0-9A-Za-z] */ char onechar(int value){ if (value >= 0) { if (value < 10) return (char) ('0'+value); else if (value < 36) return (char) ('A'+value-10); else if (value < 62) return (char) ('a'+value-36); } fprintf(stderr,"* triomino avec valeur invalide\n"); exit(1); return '\0'; } /* * structure triomino et plateau */ typedef struct triomino_t { int a; int b; int c; } triomino; typedef struct plateau_t { int largeur; triomino *** triominos; /* acces à des references de triominos par * "triominos[i][j]" avec * 0 <= i < largeur et * 0 <= j < 2*i+1 */ } plateau; /* * creation d'un plateau */ plateau * cree_plateau(int largeur) { plateau * p = (plateau *) malloc(sizeof(plateau)); p->largeur = largeur; p->triominos = (triomino ***) malloc(sizeof(triomino **) * largeur); { int i = 0; for(i=0 ; itriominos[i] = (triomino **) malloc(sizeof(triomino *) * (2*i+1)); memset((void *)(p->triominos[i]),0,sizeof(triomino *) * (2*i+1)); } } return p; } /* * creation d'un jeu de triominos aleatoire */ triomino ** cree_triominos(int largeur,int base) { int i; triomino ** tab = (triomino **) malloc(sizeof(triomino *) * largeur * largeur); assert(tab); for(i=0; i< largeur * largeur;i++){ tab[i] = malloc(sizeof(triomino)); assert(tab[i]); tab[i]->a = random()%base; tab[i]->b = random()%base; tab[i]->c = random()%base; } return tab; } /* * affichage du jeu de triominos */ void affiche_triominos(triomino ** tab,int largeur){ int i; for(i=0; ic),onechar(tab[j2]->b)); printf("\n"); for(j3 = i ; j3 < largeur*largeur && j3 < i+12 ; j3++) printf(" /_%c_\\",onechar(tab[j3]->a)); printf("\n\n"); } } /* * affiche un plateau, meme partiellement rempli. */ void affiche_plateau_mini(plateau * p) { int i; for (i = 0 ; i < p->largeur ; i++) { int j,l; for (l=0; l<3; l++) { int k; for(k=0 ; klargeur-i;k++) printf(" "); if (l%2) printf(" "); for (j=0 ; j <= 2*i ; j++ ){ triomino * t = p->triominos[i][j]; switch (l) { case 0: /* top line */ if (j%2) printf(" %c",t?onechar(t->a):'*'); else printf(" ^ "); break; case 1: /* middle line */ if (j%2) printf("%c %c",t?onechar(t->b):'*', t?onechar(t->c):'*'); else printf("%c %c",t?onechar(t->c):'*', t?onechar(t->b):'*'); break; case 2: /* bottom line */ if (j%2) printf(" "); else printf("/_%c_\\",t?onechar(t->a):'*'); } } printf("\n"); } } } int main() { int base,size; /*==================* * Quelques tests * *==================*/ /* 0) choix d'une base et d'une taille de plateau*/ srandom((int)time(NULL)^(int)getpid()); base = 2 + random()%15; size = 1 + random()%6; /* 1) creation des triominos et du plateau de jeu vide */ triomino ** t = cree_triominos(size,base); plateau * p = cree_plateau(size); affiche_triominos(t,size); /* 2) placer les triominos sur le plateau. * on ne résoud pas le problème ici */ { int i, k = 0; for ( i = 0; i < size; i++ ) { int j; for ( j = 0; j < 2*i+1; j++ ) { p->triominos[i][j] = t[k]; k++; } } } /* 3) affichage du plateau ainsi rempli */ affiche_plateau_mini(p); return 0; }