Example #1
0
        /// <summary>
        /// Fonction principale qui evalue le cout de l'heuristique C
        /// entre deux tableau quelconques
        /// </summary>
        /// <param name="currBoard"> Le tableau à évaluer </param>
        /// <param name="destBoard"> Le tableau avec lequel on compare </param>
        /// <returns></returns>
        public int EvaluateBoard(Board currBoard, Board destBoard)
        {
            int size = currBoard.Structure.GetLength(0);
            int cost = 0;
            // Liste des valeurs que l'on peut rencontrer dans les coins
            List <int> cornerValues;

            // Evaluation de l'heuristique pour un board de taille 3x3
            if (size == 3)
            {
                cornerValues = new List <int> {
                    0, 2, 6
                };
                // Liste des valeurs déja impliquées dans un conflit
                List <int> usedPile = new List <int>();
                foreach (int value in cornerValues)
                {
                    int optI, optJ, currI, currJ;
                    Functions.pos2coord(out optI, out optJ, value, size);
                    currBoard.FindCellByValue(out currI, out currJ, value.ToString());
                    if (optI != currI || optJ != currJ) // Si le coin est mal placé
                    {
                        // On cherche si une case sur le bord est à la bonne place
                        if (value == 0)
                        {
                            if (currBoard.Structure[optI, optJ + 1].Value == "1")
                            {
                                cost += 2;
                                usedPile.Add(1);
                            }
                            else if (currBoard.Structure[optI + 1, optJ].Value == "3")
                            {
                                cost += 2;
                                usedPile.Add(3);
                            }
                        }
                        else if (value == 2)
                        {
                            if (!(usedPile.Contains(1)))
                            {
                                if (currBoard.Structure[optI, optJ - 1].Value == "1")
                                {
                                    cost += 2;
                                }
                            }
                            else if (currBoard.Structure[optI + 1, optJ].Value == "5")
                            {
                                cost += 2;
                            }
                        }
                        else
                        {
                            if (!(usedPile.Contains(3)))
                            {
                                if (currBoard.Structure[optI - 1, optJ].Value == "3")
                                {
                                    cost += 2;
                                }
                            }
                        }
                    }
                }
            }
            // Evaluation de l'heuristique pour un board de taille 5x5
            else if (size == 5)
            {
                cornerValues = new List <int> {
                    0, 4, 20
                };
                // Pour chaque coin, on évalue son implication dans l'heuristique C
                foreach (int value in cornerValues)
                {
                    int optI, optJ, currI, currJ;
                    Functions.pos2coord(out optI, out optJ, value, size);
                    currBoard.FindCellByValue(out currI, out currJ, value.ToString());
                    if (optI != currI || optJ != currJ) // Si le coin est mal placé
                    {
                        // On évalue si ses voisins sont en palce ou non
                        if (value == 0)
                        {
                            if (currBoard.Structure[optI, optJ + 1].Value == "1")
                            {
                                cost += 2;
                            }
                            else if (currBoard.Structure[optI + 1, optJ].Value == "5")
                            {
                                cost += 2;
                            }
                        }
                        else if (value == 4)
                        {
                            if (currBoard.Structure[optI, optJ - 1].Value == "3")
                            {
                                cost += 2;
                            }
                            else if (currBoard.Structure[optI + 1, optJ].Value == "9")
                            {
                                cost += 2;
                            }
                        }
                        else
                        {
                            if (currBoard.Structure[optI - 1, optJ].Value == "15")
                            {
                                cost += 2;
                            }
                            else if (currBoard.Structure[optI, optJ + 1].Value == "21")
                            {
                                cost += 2;
                            }
                        }
                    }
                }
            }
            return(cost);
        }