Ejemplo n.º 1
0
 internal void Add(PlateauRencontre plateau)
 {
     if (!List.ContainsKey(plateau.distanceCibles))
     {
         List.Add(plateau.distanceCibles, new List <PlateauRencontre>());
     }
     List[plateau.distanceCibles].Add(plateau);
     Count++;
 }
Ejemplo n.º 2
0
 private bool IsSolution(PlateauRencontre nextPlateau)
 {
     foreach (int cible in cibles)
     {
         if (nextPlateau.PosVide == cible)
         {
             return(true);
         }
     }
     return(false);
 }
Ejemplo n.º 3
0
        private void CalculeDistance(PlateauRencontre plateauRencontre)
        {
            int distance = int.MaxValue;

            foreach (int posCible in cibles)
            {
                int distance1 = jeu.Distance(jeu.Coordonnees(plateauRencontre.PosVide), jeu.Coordonnees(posCible));
                if (distance1 < distance)
                {
                    distance = distance1;
                }
            }
            plateauRencontre.distanceCibles = distance;
        }
Ejemplo n.º 4
0
        public override bool Equals(object obj)
        {
            if (this == obj)
            {
                return(true);
            }
            PlateauRencontre o = obj as PlateauRencontre;

            if (o == null)
            {
                return(false);
            }
            return(PosVide == o.PosVide);
        }
Ejemplo n.º 5
0
        internal PlateauRencontre Next()
        {
            PlateauRencontre result = null;

            foreach (List <PlateauRencontre> listePlateaux in List.Values)
            {
                if (listePlateaux.Count > 0)
                {
                    result = listePlateaux[listePlateaux.Count - 1];
                    listePlateaux.RemoveAt(listePlateaux.Count - 1);
                    Count--;
                    break;
                }
            }
            return(result);
        }
Ejemplo n.º 6
0
        internal IList <int> PositionsVide()
        {
            if (solution == null)
            {
                throw new ApplicationException();
            }
            List <int>       positionsVide = new List <int>();
            PlateauRencontre plateau       = solution;

            // On exclut l'origine qui donne la position de départ de la case vide
            while (plateau.parent != null)
            {
                positionsVide.Add(plateau.PosVide);
                plateau = plateau.parent;
            }
            positionsVide.Reverse();
            return(positionsVide);
        }
Ejemplo n.º 7
0
        private IEnumerable <PlateauRencontre> NextPlateaux(PlateauRencontre plateau)
        {
            Point coordVide = jeu.Coordonnees(plateau.PosVide);

            foreach (Size direction in Jeu.PointsCardinaux)
            {
                Point nextCoord = Point.Add(coordVide, direction);
                if (!jeu.InPlateau(nextCoord))
                {
                    continue;
                }
                int nextPos = jeu.Indice(nextCoord);
                if (jeu.PiecesRangees[nextPos])
                {
                    continue;
                }
                yield return(new PlateauRencontre(jeu, plateau, nextPos));
            }
        }
Ejemplo n.º 8
0
        // Il faut donc rechercher un chemin qui mène CaseVide
        // sur l'un des voisins prometteurs
        // tout en évitant les cases interdites (jeu.PiecesRangees)
        // RQ : on a pris la précaution de placer temporairement
        // la pièce en cours de traitement dans les pièces rangées.
        internal void Recherche()
        {
            PlateauRencontre plateauInitial = new PlateauRencontre(jeu);

            if (IsSolution(plateauInitial))
            {
                this.solution = plateauInitial;
                return;
            }
            HashSet <PlateauRencontre> plateauxRencontres  = new HashSet <PlateauRencontre>();
            PlateauxPrometteurs        plateauxPrometteurs = new PlateauxPrometteurs();

            plateauxRencontres.Add(plateauInitial);
            CalculeDistance(plateauInitial);
            plateauxPrometteurs.Add(plateauInitial);
            PlateauRencontre solution = null;

            while (solution == null)
            {
                if (plateauxPrometteurs.Count == 0)
                {
                    throw new ApplicationException("Chemin non trouvé");
                }
                PlateauRencontre plateauRencontrePrometteur = plateauxPrometteurs.Next();
                foreach (var nextPlateau in NextPlateaux(plateauRencontrePrometteur))
                {
                    if (plateauxRencontres.Contains(nextPlateau))
                    {
                        continue;
                    }
                    if (IsSolution(nextPlateau))
                    {
                        solution = nextPlateau;
                        break;
                    }
                    plateauxRencontres.Add(nextPlateau);
                    CalculeDistance(nextPlateau);
                    plateauxPrometteurs.Add(nextPlateau);
                }
            }
            this.solution = solution;
        }
Ejemplo n.º 9
0
 internal PlateauRencontre(Jeu jeu, PlateauRencontre parent, int nextPosVide)
 {
     this.NbCases = jeu.NbCases;
     this.parent  = parent;
     PosVide      = nextPosVide;
 }
Ejemplo n.º 10
0
 internal PlateauRencontre(Jeu jeu)
 {
     this.NbCases = jeu.NbCases;
     this.parent  = null;
     PosVide      = jeu.PosVide;
 }