La classe caseNBCette 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 ; 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 :
"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) ; 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) 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 !
|