コード例 #1
0
        public static PudgeSensorsData GoTo(this PudgeClientLevel3 client, PudgeSensorsData data, Point2D end, WorldInfo visited, WorldInfo killed)
        {
            var old      = data.SelfLocation;
            var dx       = end.X - data.SelfLocation.X;
            var dy       = end.Y - data.SelfLocation.Y;
            var distance = Movement.GetDistance(dx, dy);

            data = client.RotateTo(data, dx, dy);
            data = MoveByLine(client, data, distance, visited, killed);
            if (!data.IsDead)
            {
                if (!AfterHook && Movement.ApproximatelyEqual(old, data.SelfLocation, 2))
                {
                    data = client.Rotate(180);
                    data = client.MoveByLine(data, 10, visited, killed);
                    visited.Check(data.WorldTime);
                    killed.Check(data.WorldTime);
                }
                AfterHook = false;
                if (!Movement.ApproximatelyEqual(data.SelfLocation, end, 7))
                {
                    return(client.GoTo(data, end, visited, killed));
                }
            }
            return(data);
        }
コード例 #2
0
 public static double AngleToVictim(PudgeSensorsData data, Pudge pudge, PudgeClientLevel3 client)
 {
     foreach (var enemy in data.Map.Heroes)
     {
         var targetRotate = new Vector(new Node(new Point((int)data.SelfLocation.X, (int)data.SelfLocation.Y)),
                                       new Node(new Point((int)enemy.Location.X, (int)enemy.Location.Y)));
         var rotationAngle = GetRotationAngle(pudge.Direction, targetRotate);
         return(rotationAngle);
     }
     return(0);
 }
コード例 #3
0
        public static PudgeSensorsData HookEnemy(PudgeClientLevel3 client, PudgeSensorsData data)
        {
            var old   = data.SelfLocation;
            var enemy = data.Map.Heroes.Where(x => x.Type == HeroType.Slardar || x.Type == HeroType.Pudge).Single();
            var dx    = enemy.Location.X - data.SelfLocation.X;
            var dy    = enemy.Location.Y - data.SelfLocation.Y;
            var angle = Movement.FindAngle(data, dx, dy);

            data      = client.Rotate(angle);
            data      = client.Hook();
            AfterHook = !AfterHook;
            data      = client.Rotate(-angle);
            while (data.Events.Select(x => x.Event).Contains(PudgeEvent.HookThrown))
            {
                data = client.Wait(0.05);
            }
            return(data);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: fng3r/c-sharp
        public static PudgeSensorsData PartWalking(PudgeSensorsData data, PudgeClientLevel3 client, IEnumerable <Node> path, WorldInfo visited, WorldInfo killed)
        {
            foreach (var node in path)
            {
                visited.Check(data.WorldTime);
                killed.Check(data.WorldTime);
                data = client.GoTo(data, node.Location, visited, killed);
                if (data.IsDead)
                {
                    for (int i = 0; i < 1; i++)
                    {
                        data = client.Wait(PudgeRules.Current.PudgeRespawnTime);
                        visited.Check(data.WorldTime);
                        killed.Check(data.WorldTime);
                    }
                    return(data);
                }
            }
            var destination = path.Last().Location;

            visited.Add(destination);
            data = client.Wait(0.1);
            return(data);
        }
コード例 #5
0
        public static PudgeSensorsData MoveByLine(this PudgeClientLevel3 client, PudgeSensorsData data, double distance, WorldInfo visited, WorldInfo killed)
        {
            double speed;

            if (data.Events.Select(x => x.Event).Contains(PudgeEvent.Hasted))
            {
                var hasteDuration = data.Events.Select(x => x).Where(x => x.Event == PudgeEvent.Hasted).First().Duration;
                if (hasteDuration > distance / 80)
                {
                    speed = 80;
                }
                else
                {
                    speed = distance / (hasteDuration + (distance - hasteDuration * 80) / 40);
                }
            }
            else
            {
                speed = 40;
            }

            var count = Math.Floor((distance / speed) * 4.5);
            var step  = distance / count;

            for (var i = 0; i < count; i++)
            {
                if (data.IsDead)
                {
                    break;
                }
                var check = CheckEnemy(data);
                if (check != "")
                {
                    if (!data.Events.Select(x => x.Event).Contains(PudgeEvent.HookCooldown))
                    {
                        if (check == "Slardar")
                        {
                            killed.Add(SlardarSpots.Where(x => Movement.ApproximatelyEqual(data.SelfLocation, x, 100)).Single());
                        }
                        data = HookEnemy(client, data);
                        break;
                    }
                }
                #region MaybeNextTime
                //if (CheckRune(data))
                //    if (!OnMove)
                //    {
                //        var loc = data.Map.Runes.First().Location;
                //        var min = Points.Select(x => Movement.GetDistance(x, data.SelfLocation)).Min();
                //        var toGo = Points.Where(x => Movement.GetDistance(x, data.SelfLocation) == min).First();
                //        OnMove = !OnMove;
                //        data = client.GoTo(data, toGo, visited);
                //        data = client.GoTo(data, loc, visited);
                //        visited.Add(loc);
                //        OnMove = !OnMove;
                //        break;
                //    }
                #endregion
                data = client.Move(step);
                visited.Check(data.WorldTime);
                killed.Check(data.WorldTime);
            }

            return(data);
        }
コード例 #6
0
        public static PudgeSensorsData RotateTo(this PudgeClientLevel3 client, PudgeSensorsData data, double dx, double dy)
        {
            var angle = Movement.FindAngle(data, dx, dy);

            return(client.Rotate(angle));
        }
コード例 #7
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                args = new[] { "127.0.0.1", "14000" }
            }
            ;
            var ip   = args[0];
            var port = int.Parse(args[1]);

            // Каждую неделю клиент будет новый. Соотетственно Level1, Level2 и Level3.
            var client = new PudgeClientLevel3();
            var graph  = CreateWayGraph();
            var dict   = GetEdgesWeight(graph);

            // У этого метода так же есть необязательные аргументы:
            // timeLimit -- время в секундах, сколько будет идти матч (по умолчанию 90)
            // operationalTimeLimit -- время в секундах, отображающее ваш лимит на операции в сумме за всю игру
            // По умолчанию -- 1000. На турнире будет использоваться значение 5. Подробнее про это можно прочитать в правилах.
            // isOnLeftSide -- предпочитаемая сторона. Принимается во внимание во время отладки. По умолчанию true.
            // seed -- источник энтропии для случайного появления рун. По умолчанию -- 0.
            // При изменении руны будут появляться в другом порядке
            // speedUp -- ускорение отладки в два раза. Может вызывать снижение FPS на слабых машинах
            var sensorData = client.Configurate(ip, port, CvarcTag);

            // Пудж узнает о всех событиях, происходящих в мире, с помощью сенсоров.
            // Для передачи и представления данных с сенсоров служат объекты класса PudgeSensorsData.
            Print(sensorData);

            // Каждое действие возвращает новые данные с сенсоров.
            //sensorData = client.Move();
            //Print(sensorData);

            // Для удобства, можно подписать свой метод на обработку всех входящих данных с сенсоров.
            // С этого момента любое действие приведет к отображению в консоли всех данных
            client.SensorDataReceived += Print;
            var pudge = new Pudge(sensorData);
            // Угол поворота указывается в градусах, против часовой стрелки.
            // Для поворота по часовой стрелке используйте отрицательные значения.
            //client.Rotate(-45);

            //client.Move(100);
            //lient.Wait(45);

            // Так можно хукать, но на первом уровне эта команда будет игнорироваться.
            //client.Hook();

            // Пример длинного движения. Move(100) лучше не писать. Мало ли что произойдет за это время ;)
            //var previousVector = new Vector(new Node(new Point(0, 0)), graph[0]);
            //var angle = 180.0;
            //for (var i = 0; i < graph.Length - 1; i++)
            //{
            //    var vect = new Vector(graph[i], graph[i + 1]);
            //    angle -= GetRotationAngle(previousVector, vect);
            //    previousVector = vect;
            //    client.Rotate(-angle);
            //    client.Move(vect.Length);
            //}

            /*bool exit = false;
             * while (!exit)
             * {
             *  for (var i = 0; i < graph.Length - 1; i++)
             *  {
             *      var nextDirection = new Vector(graph[i], graph[i + 1]);
             *      var rotationAngle = GetRotationAngle(pudge.Direction, nextDirection);
             *      pudge.Direction = nextDirection;
             *      sensorData = client.Rotate(rotationAngle);
             *      while (SegmentLength(pudge.Location, graph[i + 1].Position) > 7.8)
             *      {
             *          if (sensorData.WorldTime > 85)
             *          {
             *              exit = true;
             *              break;
             *          }
             *          sensorData = client.Move(8);
             *          pudge.Location = new Point((int)sensorData.SelfLocation.X, (int)sensorData.SelfLocation.Y);
             *      }
             *
             *      if (i == 5)
             *          client.Wait(5);
             *  }
             * }*/

            var edgWeights   = GetEdgesWeight(graph);
            var targets      = getTargetNodes();
            var target_index = 0;
            var path         = Graph.Dijkstra(graph, edgWeights, graph[0], targets[target_index]);
            var i            = 0;

            while (true)
            {
                if (sensorData.WorldTime > 85)
                {
                    break;
                }
                if (i < path.Count)
                {
                    if (path[i].Equals(targets[target_index]))
                    {
                        if (target_index == targets.Count - 1)
                        {
                            target_index = 0;
                        }
                        else
                        {
                            target_index++;
                        }
                        //edgWeights = GetEdgesWeight(graph);
                        path = Graph.Dijkstra(graph, edgWeights, path[i], targets[target_index]);
                        i    = 0;
                        continue;
                    }

                    var nextDirection = new Vector(path[i], path[i + 1]);
                    var rotationAngle = GetRotationAngle(pudge.Direction, nextDirection);
                    pudge.Direction = nextDirection;
                    sensorData      = client.Rotate(rotationAngle);
                    while (SegmentLength(pudge.Location, path[i + 1].Position) >= 12)
                    {
                        //if (search_rune(path[i], sensorData))
                        //{
                        //    edgWeights = GetEdgesWeight(graph);
                        //    path = Graph.Dijkstra(graph, edgWeights, path[i], targets[target_index]);
                        //    i = 0;
                        //}

                        if (sensorData.Map.Heroes.Count > 0)
                        {
                            var ang = AngleToVictim(sensorData, pudge, client);
                            sensorData = client.Rotate(ang);
                            sensorData = client.Hook();
                            sensorData = client.Rotate(-ang);
                        }

                        sensorData = client.Move(8);
                        if (sensorData.WorldTime > 85)
                        {
                            break;
                        }
                        pudge.Location = new Point((int)sensorData.SelfLocation.X, (int)sensorData.SelfLocation.Y);
                    }
                    i++;
                }
            }
            client.Exit();
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: romansp/research2016-ai
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                args = new[] { "127.0.0.1", "14000" }
            }
            ;
            var ip   = args[0];
            var port = int.Parse(args[1]);

            Node previousNode = null;

            //foreach (var node in World.Nodes.OrderByDescending(c => c.Y).ThenBy(c => c.X))
            //{
            //    if (previousNode != null && node.Y < previousNode.Y)
            //    {
            //        Console.WriteLine();
            //    }
            //    if (node.IsWalkable)
            //    {
            //        Console.Write("·");
            //    }
            //    else
            //    {
            //        Console.Write("†");
            //    }

            //    previousNode = node;
            //}
            Console.WriteLine();

            while (true)
            {
                var client = new PudgeClientLevel3();

                // У метода Configurate так же есть необязательные аргументы:
                // timeLimit -- время в секундах, сколько будет идти матч (по умолчанию 90)
                // operationalTimeLimit -- время в секундах, отображающее ваш лимит на операции в сумме за всю игру
                // По умолчанию -- 1000. На турнире будет использоваться значение 5. Подробнее про это можно прочитать в правилах.
                // isOnLeftSide -- предпочитаемая сторона. Принимается во внимание во время отладки. По умолчанию true.
                // seed -- источник энтропии для случайного появления рун. По умолчанию -- 0.
                // При изменении руны будут появляться в другом порядке
                // speedUp -- ускорение отладки в два раза. Может вызывать снижение FPS на слабых машинах
                var sensorData = client.Configurate(ip, port, CvarcTag);

                var targetNode = World.GetNode(0, 90);

                while (true)
                {
                    Print(sensorData);
                    var nodeX = sensorData.SelfLocation.X;
                    var nodeY = sensorData.SelfLocation.Y;

                    var currentNode = World.GetNode(nodeX, nodeY);

                    if (currentNode == targetNode)
                    {
                        sensorData = client.Wait(Strategy.DefaultWaitTime);
                        continue;
                    }

                    var path = AStar.FindPath(currentNode, targetNode,
                                              (previous, possibleNext) => Distance(previous, possibleNext),
                                              (current, destination) => Heuristic(current, destination))?.ToList();

                    if (path == null)
                    {
                        sensorData = client.Wait(Strategy.DefaultWaitTime);
                        continue;
                    }

                    if (path.Count < 2)
                    {
                        sensorData = client.Wait(Strategy.DefaultWaitTime);
                        continue;
                    }

                    var nextNode  = path[path.Count - 2];
                    var turnAngle = CalculateTurnAngle(currentNode, nextNode, sensorData.SelfLocation.Angle);

                    if (Math.Abs(turnAngle) > TurnAngleThreshold)
                    {
                        sensorData = client.Rotate(turnAngle);
                        // wait rotation
                        client.Wait(Math.Abs(turnAngle / PudgeRules.Current.RotationVelocity));
                    }
                    else
                    {
                        sensorData = client.Move(Strategy.DefaultStepSize);
                    }
                }

                client.Wait(1);
                // Корректно завершаем работу
                client.Exit();

                Thread.Sleep(1000);
            }
        }
コード例 #9
0
ファイル: Program.cs プロジェクト: fng3r/c-sharp
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                args = new[] { "127.0.0.1", "14000" }
            }
            ;
            //args = new[] { "87.224.245.130", "14001" };

            var ip   = args[0];
            var port = int.Parse(args[1]);


            // Каждую неделю клиент будет новый. Соотетственно Level1, Level2 и Level3.
            var client = new PudgeClientLevel3();

            // У этого метода так же есть необязательные аргументы:
            // timeLimit -- время в секундах, сколько будет идти матч (по умолчанию 90)
            // operationalTimeLimit -- время в секундах, отображающее ваш лимит на операции в сумме за всю игру
            // По умолчанию -- 1000. На турнире будет использоваться значение 5. Подробнее про это можно прочитать в правилах.
            // isOnLeftSide -- предпочитаемая сторона. Принимается во внимание во время отладки. По умолчанию true.
            // seed -- источник энтропии для случайного появления рун. По умолчанию -- 0.
            // При изменении руны будут появляться в другом порядке
            // speedUp -- ускорение отладки в два раза. Может вызывать снижение FPS на слабых машинах



            var data = client.Configurate(ip, port, CvarcTag, seed: 119, operationalTimeLimit: 1000);

            // Пудж узнает о всех событиях, происходящих в мире, с помощью сенсоров.
            // Для передачи и представления данных с сенсоров служат объекты класса PudgeSensoвс rsData.
            Print(data);

            // Каждое действие возвращает новые данные с сенсоров.


            // Для удобства, можно подписать свой метод на обработку всех входящих данных с сенсоров.
            // С этого момента любое действие приведет к отображению в консоли всех данных
            client.SensorDataReceived += Print;

            var rules        = PudgeRules.Current;
            var points       = PrepareForBattle.GetPoints();
            var graph        = PrepareForBattle.MakeGraph(points);
            var excNodes     = new int[] { 10, 11, 13, 20, 6, 7, 3, 15 };
            var excluded     = graph.Nodes.Where(x => excNodes.Contains(x.NodeNumber)).ToList();
            var runes        = PrepareForBattle.GetRunes();
            var specRunes    = PrepareForBattle.GetSpecialRunes();
            var visited      = new WorldInfo(rules.RuneRespawnTime);
            var killed       = new WorldInfo(rules.SlardarRespawnTime);
            var slardarSpots = PrepareForBattle.GetSlardars();
            var central      = new Point2D(0, 0);

            while (true)
            {
                var choices = new List <DijkstraAnswer>();
                choices.Add(InvestigateWorld(data, graph, new Point2D[] { central }, visited, Empty));
                var       slPath   = (InvestigateWorld(data, graph, slardarSpots, killed, Empty));
                var       specPath = (InvestigateWorld(data, graph, specRunes, visited, Empty));
                EventData hookData;
                if (data.Events.Select(x => x.Event).Contains(PudgeEvent.HookCooldown))
                {
                    hookData = data.Events.Select(x => x).Where(x => x.Event == PudgeEvent.HookCooldown).First();
                    var time = hookData.Duration - (data.WorldTime - hookData.Start);
                    if (time < slPath.PathLength / rules.MovementVelocity)
                    {
                        choices.Add(slPath);
                        choices.Add(specPath);
                    }
                }
                else
                {
                    choices.Add(slPath);
                    choices.Add(specPath);
                }
                var chosen = InvestigateWorld(data, graph, runes, visited, excluded);
                if (choices.Any(x => x.PathLength != 0))
                {
                    var min = choices.Where(x => x.PathLength != 0).Min(x => x.PathLength);
                    chosen = choices.Where(x => x.PathLength == min).Single();
                }
                var slCD = killed.GetCooldown(data.WorldTime);
                if (slCD < 4.5)
                {
                    var nearest = slardarSpots.Where(x => Movement.ApproximatelyEqual(data.SelfLocation, x, 50)).SingleOrDefault();
                    var hookCD  = double.Epsilon;
                    if (nearest != default(Point2D))
                    {
                        foreach (var eventData in data.Events)
                        {
                            if (eventData.Event == PudgeEvent.HookCooldown)
                            {
                                hookCD = eventData.Duration - (data.WorldTime - eventData.Start);
                                break;
                            }
                        }
                        if (hookCD < slCD)
                        {
                            client.GoTo(data, nearest, visited, killed);
                            var dist = Movement.GetDistance(nearest, data.SelfLocation);
                            client.Wait(slCD - dist / rules.MovementVelocity - 0.5);
                        }
                    }
                }

                var path = chosen.Path.Skip(1);
                if (path.Count() == 0)
                {
                    data = client.Wait(0.2);
                    continue;
                }
                data = PartWalking(data, client, path, visited, killed);
            }
        }