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); }
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); }
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); }
public static PathFinder Init(PointArray <long> wormLocations) { return(new PathFinder(wormLocations)); }