Esempio n. 1
0
        public int FloodFill(Point startPoint)
        {
            var count = 0;

            var map = _level.Map;

            if (map[startPoint] != 0)
            {
                return(count);
            }

            var painted = new PointArray <bool>(map.Width, map.Height);
            var queue   = new Queue <Point>();

            queue.Enqueue(startPoint);

            while (queue.Count > 0)
            {
                var point = queue.Dequeue();

                var west = point.X;
                while (west >= 0 && map[west, point.Y] == 0 && !painted[west, point.Y])
                {
                    west -= 1;
                }

                var east = point.X;
                while (east < map.Width && map[east, point.Y] == 0 && !painted[east, point.Y])
                {
                    east += 1;
                }

                for (var x = west + 1; x < east; x++)
                {
                    painted[x, point.Y] = true;
                    count++;

                    var north = new Point(x, point.Y + 1);
                    if (north.Y < map.Height && map[north] == 0 && !painted[north])
                    {
                        queue.Enqueue(north);
                    }

                    var south = new Point(x, point.Y - 1);
                    if (south.Y >= 0 && map[south] == 0 && !painted[south])
                    {
                        queue.Enqueue(south);
                    }
                }

                if (count > _fillGiveUpLimit)
                {
                    return(_fillGiveUpLimit);
                }
            }

            return(count);
        }
Esempio n. 2
0
        private PathFinder(PointArray <long> wormLocations)
        {
            _mapWidth  = wormLocations.Width;
            _mapHeight = wormLocations.Height;

            _wormLocations = wormLocations;

            _movementCost = new PointArray <int>(_mapWidth, _mapHeight);

            _parent                = new PointArray <Point>(_mapWidth, _mapHeight);
            _pointFlag             = new PointArray <ListStatus>(_mapWidth, _mapHeight);
            _estimatedDistanceCost = new long[_mapWidth * _mapHeight];


            _binaryHeap = new BinaryHeap(_mapWidth, _mapHeight);
        }
Esempio n. 3
0
        private void PositionsMessage(dynamic data)
        {
            var map = new PointArray <long>(_width, _height);

            var snakes = data.snakes;

            for (var i = 0; i < snakes.Count; i++)
            {
                for (var j = 0; j < snakes[i].body.Count; j++)
                {
                    long x = snakes[i].body[j][0];
                    long y = snakes[i].body[j][1];

                    if (x < 0 || y < 0 || x >= _width || y >= _height)
                    {
                        return;
                    }

                    map[x, y] = snakes[i].body.Count - i;
                }
            }

            long headX           = snakes[_playerNo].body[0][0];
            long headY           = snakes[_playerNo].body[0][1];
            var  myHeadPoisition = new Point(headX, headY);

            headX = snakes[_enemyNo].body[0][0];
            headY = snakes[_enemyNo].body[0][1];
            var enemyHeadPoisition = new Point(headX, headY);

            var positionsUpdateDto = new PositionsUpdateDto
            {
                Map       = map,
                MyHead    = myHeadPoisition,
                EnemyHead = enemyHeadPoisition,
                MyLength  = snakes[_playerNo].body.Count
            };

            _greyWorm.UpdatePositions(positionsUpdateDto);
        }
Esempio n. 4
0
 public static PathFinder Init(PointArray <long> wormLocations)
 {
     return(new PathFinder(wormLocations));
 }