예제 #1
0
        /// <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);
        }