Quelques remarques rapides (version actuelle du code).
Au vu des macros {HAUTEUR,LARGEUR}_DAMIER
, ton damier est 5x5 ? Il me semblait qu’un damier de puissance 4 est plus large que haut (genre 7x5, à vérifier).
Je n’aime pas la structure case_damier
:
-
tu stockes une position et un contenu ensemble, ça n’a pas de sens, il faudrait pouvoir manipuler les positions comme des valeurs à part entière et avoir des fonctions pour lire ou écrire le contenu d’un plateau à une position donnée
-
je ne comprends pas le rôle du champ index
Au lieu d’avoir une énumération de directions, tu pourrais représenter chaque direction unitaire par un vecteur: (0, -1) pour le SUD, (1, -1) pour SUD_EST, etc. Aujourd’hui ta fonction assigne_curseur est assez compliquée à lire.
Globalement la gestion des "curseurs" avec des pointeurs partout me semble baroque et compliquée, et la façon dont tu gères un tableau de dimension 2 dans un tableau de dimension 1 est compliquée et génère des risques d’erreurs. Faire simple!
struct position;
struct direction;
struct place;
typedef plateau;
bool valide(plateau, struct position);
struct position deplace(struct position, struct direction);
struct place *place(plateau, struct position);
Écrire un symbole dans le plateau, à une position pos
:
if (!valide(plateau, pos)) { }
else { place(plateau, pos)->contenu = symbole; }
Autre exemple de truc trop compliqué:
for (unsigned i = 0
if (DRAPEAUX & ((unsigned) 1 << i)) {
TACHE = (unsigned) 1 << i
DRAPEAUX ^= (unsigned) 1 << i
break
}
}
(Bon et les non-constantes en majuscules je trouve ça bizarre, mais les goûts et les couleurs…)
Tu définis une constante DERNIER_DRAPEAU
(LAST_FLAG
pour les gens qui évitent le franglais), et tu fais juste
for (int drapeau = 1; drapeau <<= 1; drapeau <= DERNIER_DRAPEAU)
{
if (drapeau & drapeaux == 0) continue;
switch (drapeau) {
...
}
}