infini_puissance_5/grille.c

139 lines
2.4 KiB
C
Raw Normal View History

#include <stdio.h> // à enlever après
#include <stdlib.h>
#include <stdbool.h>
#define Y_BLOCK_SIZE 10
typedef enum jeton {
VIDE = 0,
BLEU = 1,
ROUGE = 2
} jeton;
typedef struct colonne {
int hauteur_max;
jeton* jetons;
} colonne;
void print_tab(jeton *tab, int n)
{
for (int i=0; i<n; i++)
printf("%p --> %x (%d)\n", &tab[i], tab[i], tab[i]);
printf("\n");
}
void print_colonne(colonne *col)
{
print_tab(col->jetons, col->hauteur_max);
}
void init_zeros(jeton* ptr, int count)
{
for (int i=0; i<count; i++)
{
printf("%p = 0\n", &ptr[i]);
ptr[i] = 0;
}
}
colonne *creer_colonne(int hauteur_max)
{
colonne *col = malloc(sizeof(colonne));
col->jetons = malloc(hauteur_max*sizeof(jeton));
init_zeros(col->jetons, hauteur_max);
col->hauteur_max = hauteur_max;
return col;
}
bool agrandir_colonne(int diff_taille, colonne *col)
{
printf("J'appelle realloc.\n");
jeton* jetons_nouv = realloc(col->jetons, col->hauteur_max + diff_taille);
if (jetons_nouv == NULL)
return false; // allocation impossible, on garde col->jetons tel quel
// on met des zéros dans la partie nouvellement attribuée
init_zeros(jetons_nouv + col->hauteur_max, diff_taille);
printf("vérif travail init_zeros\n");
print_tab(jetons_nouv, col->hauteur_max + diff_taille);
// free est appelé par realloc et les éléments sont copiés par realloc
col->hauteur_max += diff_taille;
col->jetons = jetons_nouv;
//print_colonne(col);
return true;
}
int hauteur_colonne(colonne *col)
{
int h = 0;
while (h < col->hauteur_max
&& col->jetons[h] != VIDE)
h++;
return h;
}
bool ajouter_jeton(jeton j, colonne *col)
{
int hauteur = hauteur_colonne(col);
printf("%d", hauteur);
if (hauteur >= col->hauteur_max)
{
if (!agrandir_colonne(Y_BLOCK_SIZE, col))
return false;
}
col->jetons[hauteur] = j;
return true;
}
void detruire_colonne(colonne *col)
{
free(col->jetons);
free(col);
}
typedef struct grille {
int n_positifs;
colonne* positifs;
int n_negatifs;
colonne* negatifs;
} grille;
// =========================================== TEST =================================================
int main()
{
colonne *col = creer_colonne(Y_BLOCK_SIZE);
print_colonne(col);
for (int i=0; i<15; i++)
{
if (ajouter_jeton((i%2==0) ? ROUGE : BLEU, col))
printf("Jeton ajouté.\n");
else
fprintf(stderr, "Erreur dans l'ajout d'un jeton.\n");
}
print_colonne(col);
detruire_colonne(col);
return 0;
}