Пример #1
0
    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);
        }
    }