Example #1
0
        /// <summary>
        /// Procura a lixeira mais próxima a partir do tipo definido.
        /// </summary>
        /// <param name="tipo">Tipo de lixeira a ser localizada.</param>
        /// <param name="desconsiderar">Lixeiras que o agente visitou, estão cheias e pode desconsiderar conforme a definição.</param>
        /// <returns>Lixeira mais próxima encontrada.</returns>
        public Lixeira ProcuraLixeiraProxima(TipoLixo tipo, List <Lixeira> desconsiderar = null)
        {
            if (desconsiderar == null)
            {
                desconsiderar = new List <Lixeira>();
            }

            List <Lixeira> lixeirasFind = Ambiente.Lixeiras.Except(desconsiderar).ToList().FindAll(l => l.Tipo == tipo);

            lixeirasFind.Sort((l1, l2) => Geral.DistanciaPontos(this, l1).CompareTo(Geral.DistanciaPontos(this, l2)));

            return(lixeirasFind.FirstOrDefault());
        }
Example #2
0
 /// <summary>
 /// Lixo com informações básicas do ambiente e tipo.
 /// </summary>
 /// <param name="coordenadas">Posição no ambiente.</param>
 /// <param name="tipo">Tipo de lixo que ele é.</param>
 public Lixo(Coordenadas coordenadas, TipoLixo tipo) : base(coordenadas)
 {
     Tipo = tipo;
 }
Example #3
0
 /// <summary>
 /// Lixeira com informações básicas do ambiente.
 /// </summary>
 /// <param name="coordenadas">Posição no ambiente.</param>
 /// <param name="tipo">Tipo de lixo que ela suporta.</param>
 public Lixeira(Coordenadas coordenadas, TipoLixo tipo) : base(coordenadas)
 {
     Lixos = new ObservableCollection <Lixo>();
     Tipo  = tipo;
 }
Example #4
0
        /// <summary>
        /// Junção de todas as regras na ordem para o agente tomar as decições necessárias no ambiente.
        /// </summary>
        public void Age()
        {
            MainWindow.LogMessage($"Agente {Numero} selecionado para agir.");
            if (SacoLixoOrganicoEstaCheio() || SacoLixoSecoEstaCheio())
            {
                TipoLixo tipoLixo = SacoLixoOrganicoEstaCheio() ? TipoLixo.ORGANICO : TipoLixo.SECO;

                MainWindow.LogMessage($"Saco de {Geral.GetDescricaoEnum(tipoLixo).ToLower()} está cheio. Vai até a lixeira mais próxima descartar.");

                Lixeira        lixeiraMaisProxima = ProcuraLixeiraProxima(tipoLixo);
                List <Lixeira> desconsiderar      = new List <Lixeira>();

                bool pronto = false;
                while (!pronto && lixeiraMaisProxima != null)
                {
                    pronto = DespejaLixo(lixeiraMaisProxima.Coordenadas);
                    desconsiderar.Add(lixeiraMaisProxima);
                    lixeiraMaisProxima = ProcuraLixeiraProxima(tipoLixo, desconsiderar);
                }

                if (!pronto)
                {
                    MainWindow.LogMessage($"Não conseguiu despejar todo o lixo necessário. Irá tentar novamente no próximo ciclo.");
                }
            }
            else
            {
                MainWindow.LogMessage("Olha em volta...");
                List <Entidade> aoRedor = OlhaArredores();

                List <Entidade> lixosParaColetar = new List <Entidade>();
                if (!SacoLixoOrganicoEstaCheio())
                {
                    lixosParaColetar.AddRange(aoRedor.FindAll(e => e is Lixo && (e as Lixo).Tipo == TipoLixo.ORGANICO));
                }
                if (!SacoLixoSecoEstaCheio())
                {
                    lixosParaColetar.AddRange(aoRedor.FindAll(e => e is Lixo && (e as Lixo).Tipo == TipoLixo.SECO));
                }

                MainWindow.LogMessage($"Possui lixo em volta para pegar? {(lixosParaColetar.Count > 0 ? "Sim" : "Não")}");
                if (lixosParaColetar.Count > 0)
                {
                    MainWindow.LogMessage("Vai pegar o primeiro lixo que encontrou.");
                    bool sucesso = PegaLixo(lixosParaColetar.First().Coordenadas);
                    if (!sucesso)
                    {
                        MainWindow.LogMessage("Não conseguiu pegar o lixo. Irá tentar novamente no próximo ciclo.");
                    }
                }
                else
                {
                    _naoEncontrouNada++;
                    bool sucesso = false;

                    if (_naoEncontrouNada < 3)
                    {
                        MainWindow.LogMessage("Não encontrou nada, vai andar aleatoriamente nos limites dele.");
                        sucesso = MoveAleatoriamente(true);
                    }
                    else
                    {
                        MainWindow.LogMessage("Não encontrou pela terceira vez, vai andar aleatoriamente por uma linha ou coluna.");
                        sucesso           = MoveAleatoriamente(false);
                        _naoEncontrouNada = 0;
                    }

                    if (!sucesso)
                    {
                        MainWindow.LogMessage("Não conseguiu se mover para o ponto desejado, provavelmente porque estava trancado.");
                    }
                }
            }
        }