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