/// <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()); }
/// <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; }
/// <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; }
/// <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."); } } } }