private static bool FindFinish(List <HashSet <Position> > waves, Position start, Greed greed, out Position finish) { int level = 0; var count = 1; waves[0].Add(start); var total = greed.Total(); var totalCount = 0; var alreadyViewed = new HashSet <Position>() { start }; while (count > 0 && totalCount <= total) { count = 0; waves.Add(new HashSet <Position>()); foreach (var point in waves[level]) { var neighbors = greed.GetNearests(point); foreach (var neighbor in neighbors) { if (!alreadyViewed.Contains(neighbor.Centre)) { if (greed.IsInDestinations(neighbor.Centre) && !greed.IsInBlocks(neighbor.Centre) && greed.IsInGreed(neighbor.Centre)) { finish = new Position(neighbor.Centre.X, neighbor.Centre.Y);; return(true); } else { count++; totalCount += 1; waves[level + 1].Add(neighbor.Centre); alreadyViewed.Add(neighbor.Centre); } } } } level++; } finish = null; return(false); }
internal GameActions GetDecision(List <IGameObject> allObjects, int id) { var player = (Player)allObjects.Find(elem => elem.Type == ObjectType.Player && elem.UniqueId != id); var bot = (Player)allObjects.Find(elem => elem.Type == ObjectType.Player && elem.UniqueId == id); var field = (Field)allObjects.Find(elem => elem.Type == ObjectType.Field); var step = GameActions.None; if (!player.Centre.Equal(lastPlayerPos)) { greed.SetShadows(CreateShadows(allObjects, player.Centre, player.Radius / 2)); currentPath = LeeSearch.FindPath(bot.Centre, greed); } if (greed.IsInDestinations(bot.Centre)) { step = Aim(bot, player); } else { step = Go(bot, currentPath); } return(step); }