Ejemplo n.º 1
0
        /// <summary>
        /// Olha aos arredores do agente em busca de entidades para ele trabalhar.
        /// </summary>
        /// <returns>Lista de entidades encontradas.</returns>
        public List <Entidade> OlhaArredores()
        {
            List <Entidade> entidadesEncontradas = new List <Entidade>();

            foreach (Direcoes valor in Enum.GetValues(typeof(Direcoes)))
            {
                Coordenadas coordenadas = Geral.GetCoordenadasPorDirecao(this.Coordenadas, valor);
                Entidade    entidade    = Ambiente.GetEntidade(coordenadas);

                if (entidade is Agente || entidade is Lixeira || entidade is Lixo)
                {
                    entidadesEncontradas.Add(entidade);
                }
                else if (valor == Direcoes.NENHUMA && entidade is Multiplo)
                {
                    entidadesEncontradas.AddRange((entidade as Multiplo).Entidades.Except(new List <Entidade> {
                        this
                    }));
                }

                Thread.Sleep(MainWindow.VelocidadeAgentes);
            }

            return(entidadesEncontradas);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Pega lixo em determinada coordenada.
        /// </summary>
        /// <param name="coordenadas">Coordenadas de onde o lixo está.</param>
        /// <returns>Se conseguiu pegar o lixo ou não.</returns>
        public bool PegaLixo(Coordenadas coordenadas)
        {
            Entidade entidade = Ambiente.GetEntidade(coordenadas);
            Lixo     lixo     = null;

            if (entidade is Multiplo)
            {
                lixo = (entidade as Multiplo).Entidades.Find(e => e is Lixo) as Lixo;
            }
            else if (entidade is Lixo)
            {
                lixo = entidade as Lixo;
            }

            if (lixo != null && (lixo.Tipo == TipoLixo.ORGANICO && !SacoLixoOrganicoEstaCheio() || lixo.Tipo == TipoLixo.SECO && !SacoLixoSecoEstaCheio()))
            {
                bool sucesso = VaiAte(coordenadas);

                Multiplo multiplo = Ambiente.GetEntidade(this.Coordenadas) as Multiplo;

                if (multiplo != null && sucesso)
                {
                    sucesso = false;

                    lixo = multiplo.Entidades.Find(e => e is Lixo) as Lixo;

                    if (lixo.Tipo == TipoLixo.ORGANICO && !SacoLixoOrganicoEstaCheio())
                    {
                        this.SacoLixoOrganico.Add(lixo);
                        multiplo.Entidades.Remove(lixo);
                        sucesso = true;
                    }
                    else if (lixo.Tipo == TipoLixo.SECO && !SacoLixoSecoEstaCheio())
                    {
                        this.SacoLixoSeco.Add(lixo);
                        multiplo.Entidades.Remove(lixo);
                        sucesso = true;
                    }

                    if (multiplo.Entidades.Count <= 1)
                    {
                        Ambiente.AtualizaEntidade(this);
                    }
                    else
                    {
                        Ambiente.AtualizaEntidade(multiplo);
                    }
                }

                return(sucesso);
            }

            return(false);
        }
Ejemplo n.º 3
0
        public bool DespejaLixo(Coordenadas coordenadas)
        {
            Lixeira lixeira = Ambiente.GetEntidade(coordenadas) as Lixeira;
            ObservableCollection <Lixo> sacoLixo = null;

            if (lixeira.Tipo == TipoLixo.ORGANICO)
            {
                sacoLixo = this.SacoLixoOrganico;
            }
            else if (lixeira.Tipo == TipoLixo.SECO)
            {
                sacoLixo = this.SacoLixoSeco;
            }

            if (lixeira != null && sacoLixo != null)
            {
                VaiAte(coordenadas);

                if (EstaDiretamenteAoLado(coordenadas))
                {
                    while (sacoLixo.Count != 0 && !lixeira.EstaCheia())
                    {
                        Lixo lixo = sacoLixo.First();
                        if (lixo != null)
                        {
                            lixeira.Lixos.Add(lixo);
                            sacoLixo.Remove(lixo);
                        }
                    }

                    Ambiente.AtualizaEntidade(lixeira);
                    Ambiente.AtualizaEntidade(this);

                    if (sacoLixo.Count == 0)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Vai até a coordenada informada passo a passo.
        /// </summary>
        /// <param name="coordenadas">Coordenadas para onde o agente deverá ir.</param>
        /// <returns>Se conseguiu ou não se mover até o local desejado.</returns>
        public bool VaiAte(Coordenadas coordenadas)
        {
            int desviou    = 0;
            int andou      = 0;
            int tentativas = 0;

            while ((this.Coordenadas.X != coordenadas.X || this.Coordenadas.Y != coordenadas.Y))
            {
                if (tentativas > 3)
                {
                    return(false);
                }
                Coordenadas canditata = new Coordenadas();

                if (((Ambiente.GetEntidade(coordenadas) is Agente || Ambiente.GetEntidade(coordenadas) is Lixeira)) && EstaDiretamenteAoLado(coordenadas))
                {
                    break;
                }

                int distanciaX = coordenadas.X - this.Coordenadas.X;
                int distanciaY = coordenadas.Y - this.Coordenadas.Y;

                if (Math.Abs(distanciaX) > Math.Abs(distanciaY))
                {
                    if (coordenadas.X > this.Coordenadas.X)
                    {
                        canditata.X = this.Coordenadas.X + 1;
                    }
                    else
                    {
                        canditata.X = this.Coordenadas.X - 1;
                    }

                    canditata.Y = this.Coordenadas.Y;
                }
                else
                {
                    if (coordenadas.Y > this.Coordenadas.Y)
                    {
                        canditata.Y = this.Coordenadas.Y + 1;
                    }
                    else
                    {
                        canditata.Y = this.Coordenadas.Y - 1;
                    }

                    canditata.X = this.Coordenadas.X;
                }

                if (Geral.PodeCaminhar(canditata))
                {
                    Ambiente.MoveEntidade(canditata, this);

                    if (andou > 2)
                    {
                        desviou = 0;
                    }
                    andou++;
                }
                else
                {
                    if (desviou < 2)
                    {
                        Desvia(canditata, coordenadas);
                        desviou++;
                    }
                    else
                    {
                        MoveAleatoriamente();
                        MoveAleatoriamente();
                        desviou = 0;
                    }

                    tentativas++;
                    andou = 0;
                }

                Thread.Sleep(MainWindow.VelocidadeAgentes);
            }

            return(true);
        }