static void Main(string[] args) { // game loop while (true) { int myScore = int.Parse(Console.ReadLine()); int enemyScore1 = int.Parse(Console.ReadLine()); int enemyScore2 = int.Parse(Console.ReadLine()); int myRage = int.Parse(Console.ReadLine()); int enemyRage1 = int.Parse(Console.ReadLine()); int enemyRage2 = int.Parse(Console.ReadLine()); int unitCount = int.Parse(Console.ReadLine()); //dbg($"rage: {myRage}"); var units = new GameItem[unitCount]; for (int i = 0; i < unitCount; i++) { var str = Console.ReadLine(); //dbg($"{i}: {str}"); units[i] = new GameItem(str); } var reaper = units.First(x => x.player == 0 && x.IsReaper()); var destroyer = units.First(x => x.player == 0 && x.IsDestroyer()); var doof = units.First(x => x.player == 0 && x.IsDoof()); string reaperStr = null; string destroyerStr = null; string doofStr = null; var wreaks = units.Where(x => x.IsWreck()).ToArray(); var wreak = wreaks.Concat(FindIntersections(wreaks)) .ToArray() .OrderByDescending(x => CalcWreakRank(x, reaper, units)) .FirstOrDefault(); if (wreak != null) { if (myRage >= 60 && wreak.extra > 1 && reaper.DistanceTo(wreak) < wreak.radius && reaper.DistanceTo(destroyer) < 2000) { var n = reaper; reaperStr = "WAIT waiting for BOOM!"; destroyerStr = $"SKILL {n.x} {n.y}"; } else { reaperStr = $"{wreak.x - reaper.vx} {wreak.y - reaper.vy} 300 {wreak.label}"; } } if (destroyerStr == null) { var bestFullTank = units .Where(x => x.IsTanker() && x.DistanceTo(new Point(0, 0)) < 6000) .OrderBy(x => x.DistanceTo(destroyer)) .FirstOrDefault(); if (bestFullTank != null) { destroyerStr = $"{bestFullTank.x + bestFullTank.vx} {bestFullTank.y + bestFullTank.vy} 300"; } else { destroyerStr = $"0 0 150"; } } if (reaperStr == null) { reaperStr = "0 0 150 ?????"; } if (destroyerStr == null) { destroyerStr = "0 0 150 ?????"; } Console.WriteLine(reaperStr); Console.WriteLine(destroyerStr); GameItem higerEnemy; if (enemyScore1 > enemyScore2) { higerEnemy = units.First(x => x.player == 1 && x.IsReaper()); } else { higerEnemy = units.First(x => x.player == 1 && x.IsReaper()); } if (myRage >= 30) { var enemiesInDoofRange = units .Where(x => x.player != 0 && x.IsReaper() && x.DistanceTo(reaper) > 1000 && wreaks.Any(w => w.DistanceTo(x) < w.radius)) .OrderByDescending(x => x == higerEnemy ? 1 : 0).FirstOrDefault(); if (enemiesInDoofRange != null) { doofStr = $"SKILL {enemiesInDoofRange.x} {enemiesInDoofRange.y}"; } } if (doofStr == null) { doofStr = $"{higerEnemy.x + higerEnemy.vx} {higerEnemy.y + higerEnemy.vy} 300"; } Console.WriteLine(doofStr); //RoundTripMove(doof, 5000); } }