Attributs & méthodes

Accueil Remonter

La classe caseNB 

Cette classe est introduite pour gérer les données (attributs) et les actions (méthodes) associées à chaque case. 

Les attributs utilisés sont, en utilisant les types C++:

int current ;
int ligne ;
int colonne ;
int origine ;
int destination ;
int contrainte ;
int Index ;
bool free ;
int nborigine ;
int possibilites[8];

Dans le but de faciliter l'algorithme de recherche, les cases ne sont pas repérées par deux indices (ligne et colonne) mais par un seul indice "current". Les 3 premiers attributs de cette classe sont des entiers (int en C++, Integer en Basic). L'attribut "current" est l'indice de la case. Le numéro de ligne "ligne" et le numéro de colonne "colonne" s'obtiennent par les égalités suivantes :

  • colonne = current% 8  -     reste de la division entière.
  • ligne = (current - colonne) / 8 -     quotient de la division.

"ligne" et "colonne" sont compris entre 0 et 7. Ils ne sont pas utilisés par l'algorithme dans la version finale (cf évolution de l'algorithme).

"origine" et "destination" sont les indices de case compris entre 0 et 63. Pour une case donnée, "origine" est la position précédente et "destination" est la suivante (dans l'ordre de parcours).  

contrainte sert à mémoriser le chemin emprunté afin de ne pas reprendre le même lors d'une "marche arrière". Pour une case donnée, la liste des cases "destination" est établie statiquement c'est à dire une fois pour toute au début du programme. contrainte indique le numéro de la destination dans cette liste. En cas de marche arrière, la case destination essayée est indexée par "contrainte +1". 

Index mémorise le numéro de la case dans l'ordre de déplacement. pour la case de départ, Index = 1. La case finale, une fois que l'échiquier a été parcouru,  stocke Index = 64.

free. L'attribut free (type booleen) indique si la case a déjà été utilisée dans le parcours. Une case avec free=false n'est plus utilisée.

nborigine a été ajouté afin d'optimiser le temps de recherche. Cet attribut est initialisé dynamiquement au début du programme. Il indique le nombre de cases pouvant atteindre, par un saut de cavalier, la case en question (instance de la classe caseNB). Pour une case en coin nborigine = 2, pour une case centrale, nborigine = 8. Avant de commencer la recherche, pour chaque case de l'échiquier, le tableau des cases destinations est trié par ordre de nborigine croissante. Les cases excentrées sont donc choisies en priorité. En cours de recherche, cet attribut est remis à jour pour chaque case et permet de détecter les situations de blocage.

possibilites est un tableau de 8 éléments stockant les cases destination de la case en question. Ce tableau est initialisé dynamiquement en début de programme. Les cases de ce tableau sont triées en utilisant l'attribut nborigine comme indiqué précédemment. 

Les méthodes utilisées sont listées ici. Les types indiqués sont ceux du C++

bool CanIStep(int tent) ;
void Step(int from);
bool blocage() ;
void setfree();
void setbusy();
void clear_affiche();
void affiche(bool prog);
void SignalEnd();
bool impasse(int cur);

CanIStep(tent). La case reçoit un ordre de demande d'avance d'une autre case . Elle retourne True si elle peut réaliser cette action. "tent" indique dans la case d'origine, l'index de la liste des destinations possibles. 

Step(from). La case reçoit un ordre d'avance de la case "from". Elle connaît donc par ce moyen son origine. Les paramètres de la case sont modifiés (free mis à false, Index et origine sont modifiés)

blocage(). La case envoie à l'origine une commande blocage lorsqu'il n'existe plus de case libre atteignable pour la case atteinte

setbusy() et setfree(). Pour rendre une case occupée ou libre.

affiche() et  clear_affiche(). Pour inscrire ou effacer dans la case l'index de déplacement.

SignalEnd()permet au thread de recherche de signaler à la fenêtre principale la fin de la recherche.

Impasse(). A chaque avancée, toutes les cases de l'échiquier sont analysées. Si une case est libre et ne possède pas d'origine possible, c'est une situation d'impasse  même s'il est encore possible d'avancer. Il faut donc reculer !