Beispiel #1
0
        public bool Compute(int originX, int originY, int destX, int destY)
        {
            OriginX      = originX;
            OriginY      = originY;
            DestinationX = destX;
            DestinationY = destY;
            Nodes.Clear();
            OpenList.Clear();

            if (originX == destX && originY == destY)
            {
                return(true);
            }

            var originOutsideMap = !IsValid(OriginX, OriginY);
            var destOutsideMap   = !IsValid(DestinationX, DestinationY);

            if (originOutsideMap || destOutsideMap)
            {
                return(false);
            }

            if (!Map.Tiles[OriginX, OriginY].Walkable || !Map.Tiles[DestinationX, DestinationY].Walkable)
            {
                return(false);
            }

            InitializeGrid(ClosedList, false, Width, Height);
            InitializeCellDetails();

            OpenList.Add(new NodeScore(0, new Point(OriginX, OriginY)));

            while (OpenList.Count != 0)
            {
                var nodeScore = OpenList[0];
                OpenList.RemoveAt(0);

                var x = nodeScore.Location.X;
                var y = nodeScore.Location.Y;
                ClosedList[x, y] = true;

                if (ProcessCell(x, y, NorthEast, DiagonalCost))
                {
                    break;
                }

                if (ProcessCell(x, y, North, 1))
                {
                    break;
                }

                if (ProcessCell(x, y, NorthWest, DiagonalCost))
                {
                    break;
                }

                if (ProcessCell(x, y, East, 1))
                {
                    break;
                }

                if (ProcessCell(x, y, West, 1))
                {
                    break;
                }

                if (ProcessCell(x, y, SouthEast, DiagonalCost))
                {
                    break;
                }

                if (ProcessCell(x, y, South, 1))
                {
                    break;
                }

                if (ProcessCell(x, y, SouthWest, DiagonalCost))
                {
                    break;
                }
            }

            return(true);
        }