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