// Конструктор public BestAI(HommSensorData sensorData, HommClient client) { this.sensorData = sensorData; this.client = client; myMap = new MyMap(sensorData.Map.Width, sensorData.Map.Height); myMap.UpdateMap(sensorData); }
public static void MoveTowards(this HommClient client, Location location, Pathfinder pathfinder) { if (location.IsEqualTo(pathfinder.HeroLocation)) { client.Wait(0.2); return; } var path = pathfinder.FindPathTo(location); if (path.Count != 0) client.Move(path[0]); else throw new Exception("Невозможно найти путь"); }
public Move(HommClient client, Pathfinder pathfinder, HommSensorData sensorData, MapObjectData target) { Client = client; Pathfinder = pathfinder; Target = target; SensorData = sensorData; EnemyArmy = Target.NeutralArmy?.Army ?? (Target.Hero?.Name != sensorData.MyRespawnSide ? Target.Hero?.Army : null) ?? (Target.Garrison?.Owner != sensorData.MyRespawnSide ? Target.Garrison?.Army : null); if (EnemyArmy != null) { CombatResult = Combat.Resolve(new ArmiesPair(SensorData.MyArmy, EnemyArmy)); } }
public static void Main(string[] args) { const string local = "127.0.0.1"; const string online = "homm.ulearn.me"; var seed = new Random().Next(); if (args.Length == 0) { args = new[] { online, "18700" } } ; var ip = args[0]; var port = int.Parse(args[1]); var client = new HommClient(); client.OnSensorDataReceived += Print; client.OnInfo += OnInfo; var ai = new HommAi(client); client.OnSensorDataReceived += ai.Act; var sensorData = client.Configurate( ip, port, CvarcTag, timeLimit: 90, // Продолжительность матча в секундах (исключая время, которое "думает" ваша программа). operationalTimeLimit: 20, // Суммарное время в секундах, которое разрешается "думать" вашей программе. // Вы можете увеличить это время для отладки, чтобы ваш клиент не был отключен, // пока вы разглядываете программу в режиме дебаггинга. seed: seed, // Seed карты. Используйте этот параметр, чтобы получать одну и ту же карту и отлаживаться на ней. // Иногда меняйте этот параметр, потому что ваш код должен хорошо работать на любой карте. spectacularView: true, // Вы можете отключить графон, заменив параметр на false. debugMap: false, // Вы можете использовать отладочную простую карту, чтобы лучше понять, как устроен игоровой мир. speedUp: true, level: HommLevel.Level3, // Здесь можно выбрать уровень. На уровне два на карте присутствует оппонент. isOnLeftSide: true // Вы можете указать, с какой стороны будет находиться замок героя при игре на втором уровне. // Помните, что на сервере выбор стороны осуществляется случайным образом, поэтому ваш код // должен работать одинаково хорошо в обоих случаях. ); }
public ActionManager(HommClient client, HommSensorData sensorData) { Client = client; SensorData = sensorData; var startCell = sensorData.Location.CreateCell(); EnemyRespawn = startCell.SameLocation(new Cell(0, 0)) ? sensorData.Map.Objects.SingleOrDefault(o => o.Location.X == 13 && o.Location.Y == 13) : sensorData.Map.Objects.SingleOrDefault(o => o.Location.X == 0 && o.Location.Y == 0); MapType = MapType.Single; if (sensorData.Map.Objects.Count < sensorData.Map.Height * sensorData.Map.Width) { MapType = MapType.DualHard; } else if (EnemyRespawn.Hero != null) { MapType = MapType.Dual; } Map = new List <Cell>(); }
public void Init() { client = new HommClient(); sensorData = client.Configurate("127.0.0.1", 18700, Guid.Empty, operationalTimeLimit: 5, debugMap: true); }
public static void Main(string[] args) { if (args.Length == 0) { args = new[] { "127.0.0.1", "18700" } } ; var ip = args[0]; var port = int.Parse(args[1]); var client = new HommClient(); //client.OnSensorDataReceived += Print; //client.OnInfo += OnInfo; var sensorData = client.Configurate( ip, port, CvarcTag, timeLimit: 90, // Продолжительность матча в секундах (исключая время, которое "думает" ваша программа). operationalTimeLimit: 90, // Суммарное время в секундах, которое разрешается "думать" вашей программе. // Вы можете увеличить это время для отладки, чтобы ваш клиент не был отключен, // пока вы разглядываете программу в режиме дебаггинга. seed: 3, // Seed карты. Используйте этот параметр, чтобы получать одну и ту же карту и отлаживаться на ней. // Иногда меняйте этот параметр, потому что ваш код должен хорошо работать на любой карте. spectacularView: true, // Вы можете отключить графон, заменив параметр на false. debugMap: false, // Вы можете использовать отладочную простую карту, чтобы лучше понять, как устроен игоровой мир. level: HommLevel.Level1, // Здесь можно выбрать уровень. На уровне два на карте присутствует оппонент. isOnLeftSide: true // Вы можете указать, с какой стороны будет находиться замок героя при игре на втором уровне. // Помните, что на сервере выбор стороны осуществляется случайным образом, поэтому ваш код // должен работать одинаково хорошо в обоих случаях. ); //var outPutPrinter = new CmdOutPutPrinter(); //outPutPrinter.PrintMap(sensorData.Map.Objects,sensorData.MyArmy, sensorData.Map.Width, sensorData.Map.Height ); var listCells = sensorData.Map.Objects.Select(item => item.ToCell()).ToList(); var pathFinder = new Finder(listCells, new Cell(sensorData.Location.X, sensorData.Location.Y)); //var a = pathFinder.GetMoves(sensorData.Map.Objects.Single(o => o.Location.X == 10 && o.Location.Y == 10).ToCell()); //outPutPrinter.PrintPath(sensorData.Map.Objects, a, sensorData.MyArmy, sensorData.Map.Width, sensorData.Map.Height ); //var b = Converter.ConvertCellPathToDirection(a); //foreach (var item in b) //{ // client.Move(item); //} var actionManager = new ActionManager(client, sensorData); //TODO: remove this cicle while (true) { actionManager.Play(); } client.Exit(); } //static void Print(HommSensorData data) //{ // Console.WriteLine("---------------------------------"); // //Console.WriteLine($"You are here: ({data.Location.X},{data.Location.Y})"); // // Console.WriteLine($"You have {data.MyTreasury.Select(z => z.Value + " " + z.Key).Aggregate((a, b) => a + ", " + b)}"); // //var location = data.Location.ToLocation(); // //Console.Write("W: "); // //Console.WriteLine(GetObjectAt(data.Map, location.NeighborAt(Direction.Up))); // //Console.Write("E: "); // //Console.WriteLine(GetObjectAt(data.Map, location.NeighborAt(Direction.RightUp))); // //Console.Write("D: "); // //Console.WriteLine(GetObjectAt(data.Map, location.NeighborAt(Direction.RightDown))); // //Console.Write("S: "); // //Console.WriteLine(GetObjectAt(data.Map, location.NeighborAt(Direction.Down))); // //Console.Write("A: "); // //Console.WriteLine(GetObjectAt(data.Map, location.NeighborAt(Direction.LeftDown))); // //Console.Write("Q: "); // //Console.WriteLine(GetObjectAt(data.Map, location.NeighborAt(Direction.LeftUp))); //} //static string GetObjectAt(MapData map, Location location) //{ // if (location.X < 0 || location.X >= map.Width || location.Y < 0 || location.Y >= map.Height) // return "Outside"; // return map.Objects. // Where(x => x.Location.X == location.X && x.Location.Y == location.Y) // .FirstOrDefault()?.ToString() ?? "Nothing"; //} //static void OnInfo(string infoMessage) //{ // Console.ForegroundColor = ConsoleColor.Green; // //Console.WriteLine(infoMessage); // Console.ResetColor(); //} }
public static void Main(string[] args) { if (args.Length == 0) { args = new[] { "127.0.0.1", "18700" } } ; var ip = args[0]; var port = int.Parse(args[1]); var client = new HommClient <HommSensorData>(); client.OnSensorDataReceived += Print; client.OnInfo += OnInfo; var sensorData = client.Configurate( ip, port, CvarcTag, timeLimit: 90, // Продолжительность матча в секундах (исключая время, которое "думает" ваша программа). operationalTimeLimit: 5, // Суммарное время в секундах, которое разрешается "думать" вашей программе. // Вы можете увеличить это время для отладки, чтобы ваш клиент не был отключен, пока вы разглядываете программу в режиме дебаггинга seed: 0, // seed карты. Используйте этот параметр, чтобы получать одну и ту же карту и отлаживаться на ней // Иногда меняйте этот параметр, потому что ваш код должен хорошо работать на любой карте spectacularView: true, // Вы можете отключить графон, заменив параметр на false debugMap: false // Вы можете использовать отладочную простую карту, чтобы лучше понять, как устроен игоровой мир ); while (true) { var resources = GetResources(sensorData.Map); var currentObject = GetObjectAt(sensorData.Map, sensorData.Location.ToLocation()); var adjacencyList = BuildAdjacencyListFromMap(sensorData.Map); var desiredObject = default(MapObjectData); switch (state) { case State.NeedResources: desiredObject = GetNearestObject(sensorData.Location.ToLocation(), resources); break; case State.NeedArmy: break; case State.NeedGlory: break; } if (desiredObject == null) { continue; } var direction = GetNextDirection(currentObject, desiredObject, adjacencyList); if (direction.HasValue) { sensorData = client.Move(direction.Value); } } }
public MoveAndHire(HommClient client, Pathfinder pathfinder, HommSensorData sensorData, MapObjectData target) : base(client, pathfinder, sensorData, target) { }
public HommAi(HommClient client) { this.client = client; }
public Wait(HommClient client, HommSensorData sensorData) { this.client = client; this.sensorData = sensorData; }