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