Пример #1
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);
        }
Пример #2
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.");
                    }
                }
            }
        }