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