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