예제 #1
0
        public Simulateur CréerSimulateur()
        {
            Simulateur unSimulateur = new Simulateur();

            DonnéesInitialeSimulateurs donnéesXML = DonnéesXML.Réccupérer();

            Random rand = new Random();

            int longueur = donnéesXML.Fourmiliere.Carte.Longeur;
            int largeur  = donnéesXML.Fourmiliere.Carte.Largeur;
            int i;

            Parcelle[,] parcelles = new Parcelle[longueur, largeur];

            for (i = 0; i < longueur; i++)
            {
                for (int j = 0; j < largeur; j++)
                {
                    parcelles[i, j] = new Parcelle(unSimulateur);
                    unSimulateur.AjouterZone(parcelles[i, j]);

                    if (i > 0)
                    {
                        unSimulateur.AjouterAccès(new Tunnel(parcelles[i, j], parcelles[i - 1, j]));
                    }

                    if (j > 0)
                    {
                        unSimulateur.AjouterAccès(new Tunnel(parcelles[i, j], parcelles[i, j - 1]));
                    }
                }
            }

            Parcelle uneParcelleDeDépart = (unSimulateur.Zones[rand.Next(0, unSimulateur.Zones.Count)] as Parcelle);

            uneParcelleDeDépart.AjouterObjet(new Fourmiliere(unSimulateur, uneParcelleDeDépart));

            for (i = 0; i < donnéesXML.Fourmiliere.Fourmis.Nombre; i++)
            {
                unSimulateur.AjouterPersonnage(new Fourmi(donnéesXML.Fourmiliere.Pheromones.Poids));
            }

            i = 0;
            while (i < donnéesXML.Fourmiliere.Objectif.Nombre)
            {
                Parcelle uneParcelle = (unSimulateur.Zones[rand.Next(0, unSimulateur.Zones.Count)] as Parcelle);

                if (uneParcelle.estVide())
                {
                    uneParcelle.AjouterObjet(new Objectif(donnéesXML.Fourmiliere.Pheromones.Poids));
                    i++;
                }
            }

            unSimulateur.Interfaces.Add(new InterfaceGraphiqueFourmiliere(unSimulateur, largeur));
            unSimulateur.Play();

            return(unSimulateur);
        }
예제 #2
0
        public void Déplacer(Fourmi uneFourmi)
        {
            if (uneFourmi.Position == null || uneFourmi.Position.PrendreObjet() is Fourmiliere)
            {
                return;
            }

            if (uneFourmi.Position.Chemins.Count(x => x.autreBout(uneFourmi.Position).Occupant == null) == 0)
            {
                return;
            }

            Parcelle uneParcelle = uneFourmi.Position.Chemins.Cast <Tunnel>().Where(x => x.autreBout(uneFourmi.Position).Occupant == null)
                                   .ElementAt(rand.Next(0, uneFourmi.Position.Chemins.Count(x => x.autreBout(uneFourmi.Position).Occupant == null)))
                                   .autreBout(uneFourmi.Position) as Parcelle;

            uneFourmi.Position = uneParcelle;

            if (uneFourmi.Position.PrendreObjet() is Objectif)
            {
                // Ne devrait pas arriver si les déplacements n'étaient pas aléatoires
                return;
            }
            if (uneFourmi.Position.PrendreObjet() is Fourmiliere)
            {
                uneFourmi.Etat = EtatRentrée.GetInstance;
            }
            else if (uneFourmi.DeposerPheromone() > 0)
            {
                if (uneFourmi.Position.estVide())
                {
                    uneFourmi.Position.AjouterObjet(new Pheromone(uneFourmi.Position));
                    (uneFourmi.Position.PrendreObjet() as Pheromone).poids += uneFourmi.DeposerPheromone();
                }
                else if (uneFourmi.Position.PrendreObjet() is Pheromone)
                {
                    (uneFourmi.Position.PrendreObjet() as Pheromone).poids += uneFourmi.DeposerPheromone();
                }
            }
        }
예제 #3
0
        public void Déplacer(Fourmi uneFourmi)
        {
            if (uneFourmi.Position.Chemins.Count(x => x.autreBout(uneFourmi.Position).Occupant == null) == 0)
            {
                return;
            }

            Parcelle uneParcelle = uneFourmi.Position.Chemins.Cast <Tunnel>().Where(x => x.autreBout(uneFourmi.Position).Occupant == null)
                                   .ElementAt(rand.Next(0, uneFourmi.Position.Chemins.Count(x => x.autreBout(uneFourmi.Position).Occupant == null)))
                                   .autreBout(uneFourmi.Position) as Parcelle;

            uneFourmi.Position = uneParcelle;

            if (uneFourmi.Position.PrendreObjet() is Fourmiliere)
            {
                // Ne devrait pas arriver si les déplacements n'étaient pas aléatoires
                return;
            }
            if (uneFourmi.Position.PrendreObjet() is Objectif)
            {
                uneFourmi.Strategie = DéplacementRetour.GetInstance;
            }
        }
예제 #4
0
 public Fourmiliere(Simulateur unSimulateur, Parcelle uneParcelle)
 {
     simulateur = unSimulateur;
     parcelle   = uneParcelle;
 }
예제 #5
0
 public Pheromone(Parcelle uneParcelle)
 {
     parcelle = uneParcelle;
     poids    = 0;
 }