/// <summary> /// cette procedure trouve les cases voisines de celle passée en paramètre. /// Créer des instances de Case pour chacune /// et les ajoute dans la liste des cases voisines de la case passée en paramètre /// et le niveau de parcours du chemin est incrémenté pour ces cellules voisines. /// </summary> private void AddAcceptablesNeighbors(OneCell workingCell) { int xofCell = workingCell.X; int yofCell = workingCell.Y; int nextLevel = workingCell.Deep + 1; for ( int dx = -1; dx < 2; dx++) { for (int dy = -1; dy < 2; dy++) { int coordonneeX = xofCell + dx; int coordonneeY = yofCell + dy; if ((coordonneeX == xofCell) && (coordonneeY == yofCell)) { // On ne fait rien car les coordonnées sont celles de la case d'appel } else { if (coordonneeX >= 0 && coordonneeX < 4 && coordonneeY >= 0 && coordonneeY < 4) { // on traite car les coordonnées sont acceptables if (this.arrayOfUsedCells[coordonneeX, coordonneeY]) { // La case est déjà utilisée : on ne fait rien } else { // La case est libre donc utilisable donc // on crée une Case de coordonnées courantes // qu'on ajoute à la liste des cases voisines de la case courante si le chemin n'est pas sans issu. if (this.IsNotSteril(this.Chaine(nextLevel))) { OneCell neighborsCell = new OneCell { X = coordonneeX, Y = coordonneeY, Deep = nextLevel, }; workingCell.ListOfPossiblesCellNeighbors.Add(neighborsCell); } } } else { // on ne fait rien car au moins une des coordonnées est hors limites } } } } }
// AllWays est appelée par BeginTree pour continuer la recherche des mots possibles // dans la grille à partir de la case passée en paramètre private void AllWays(OneCell lowCell) { this.cptCombinaisons++; this.arrayOfUsedCells[lowCell.X, lowCell.Y] = true; this.PossibleWord[lowCell.Deep] = this.LetterOfCell(lowCell); this.TestMot(lowCell.Deep); this.AddAcceptablesNeighbors(lowCell); while (lowCell.ListOfPossiblesCellNeighbors.Count != 0) { this.AllWays(lowCell.ListOfPossiblesCellNeighbors[0]); lowCell.ListOfPossiblesCellNeighbors.RemoveAt(0); } this.arrayOfUsedCells[lowCell.X, lowCell.Y] = false; this.PossibleWord[lowCell.Deep] = '+'; }
// BegiTree commande la recherche des mots possibles dans la grille à partir de la case aux coordonnées passées en paramètre private void BeginTree(int x, int y) { this.InitialiseArrayOfUsedfCells(); this.InitializePossibleWord(); OneCell root = new OneCell { X = x, Y = y, Deep = 0, }; this.arrayOfUsedCells[root.X, root.Y] = true; this.PossibleWord[root.Deep] = this.LetterOfCell(root); this.TestMot(root.Deep); this.AddAcceptablesNeighbors(root); while (root.ListOfPossiblesCellNeighbors.Count != 0) { this.AllWays(root.ListOfPossiblesCellNeighbors[0]); root.ListOfPossiblesCellNeighbors.RemoveAt(0); } // replace True by false in used cells array. this.arrayOfUsedCells[root.X, root.Y] = false; }
private char LetterOfCell(OneCell oneCell) { return(DonneesLettres.TableauDeLettres[oneCell.X, oneCell.Y]); }