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); }
//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); }