public static Pac GetClosestVisibleEnemy(Pac myPac, bool withOppositeDirection = false)
        {
            Console.Error.WriteLine("GetClosestVisibleEnemy start");
            Pac result          = null;
            int minDistance     = int.MaxValue;
            int distanceToEnemy = int.MaxValue;

            if (enemyPacs.Count == 0)
            {
                Console.Error.WriteLine("No enemies!");
                return(null);
            }

            List <Pac> enemies = new List <Pac>();

            foreach (Pac enemy in enemyPacs)
            {
                Console.Error.WriteLine("GetClosestVisibleEnemy enemy: " + enemy.origin.ToString());
                //foreach (Point tile in Level.GetTilesVisibleFrom(myPac.origin))
                //{
                //	Console.Error.WriteLine("GetClosestVisibleEnemy visible: " + tile.ToString());
                //}

                if (Level.GetTilesVisibleFrom(myPac.origin).Contains(enemy.origin))
                {
                    Console.Error.WriteLine("GetClosestVisibleEnemy match found! opositeDirection:" + withOppositeDirection.ToString());
                    distanceToEnemy = myPac.origin.GetDistanceTo(enemy.origin);
                    if (withOppositeDirection)
                    {
                        if (PacController.HaveOppositeDirection(myPac, enemy, myPac.currentTarget))
                        {
                            if (distanceToEnemy < minDistance)
                            {
                                result      = enemy;
                                minDistance = distanceToEnemy;
                            }
                        }
                    }
                    else
                    {
                        if (distanceToEnemy < minDistance)
                        {
                            result      = enemy;
                            minDistance = distanceToEnemy;
                        }
                    }
                }
            }

            if (result != null)
            {
                Console.Error.WriteLine("Found closest enemy!. myPac:" + myPac.id.ToString() + " enemy: " + result.id.ToString());
            }
            return(result);
        }
Esempio n. 2
0
        //Not thread safe
        public static List <Point> MarkObstacles(Pac pac, Point target)
        {
            List <Point> result       = new List <Point>();
            Point        pacDirection = PacController.GetDirectionSigns(pac.origin, target);

            foreach (Pac otherPac in PacController.myPacs)
            {
                if (pac.id == otherPac.id || !otherPac.isAlive || otherPac.previousOrigin == null)
                {
                    continue;
                }
                Point otherPacDirection = PacController.GetDirectionSigns(otherPac.previousOrigin, otherPac.origin);
                if (PacController.HaveOppositeDirection(pac, otherPac, target))
                {
                    Console.Error.WriteLine("Obstacle found:" + otherPac.origin.ToString());
                    result.Add(otherPac.origin);
                    Level.map[otherPac.origin.y, otherPac.origin.x] = -1;
                }
            }

            return(result);
        }