Пример #1
0
 // Конструктор
 public BestAI(HommSensorData sensorData, HommClient client)
 {
     this.sensorData = sensorData;
     this.client     = client;
     myMap           = new MyMap(sensorData.Map.Width, sensorData.Map.Height);
     myMap.UpdateMap(sensorData);
 }
Пример #2
0
 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("Невозможно найти путь");
 }
Пример #3
0
 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));
     }
 }
Пример #4
0
        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          // Вы можете указать, с какой стороны будет находиться замок героя при игре на втором уровне.
                                            // Помните, что на сервере выбор стороны осуществляется случайным образом, поэтому ваш код
                                            // должен работать одинаково хорошо в обоих случаях.
                );
        }
Пример #5
0
        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>();
        }
Пример #6
0
 public void Init()
 {
     client     = new HommClient();
     sensorData = client.Configurate("127.0.0.1", 18700, Guid.Empty, operationalTimeLimit: 5, debugMap: true);
 }
Пример #7
0
        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();
        //}
    }
Пример #8
0
        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);
                }
            }
        }
Пример #9
0
 public MoveAndHire(HommClient client, Pathfinder pathfinder, HommSensorData sensorData,
                    MapObjectData target) : base(client, pathfinder, sensorData, target)
 {
 }
Пример #10
0
 public HommAi(HommClient client)
 {
     this.client = client;
 }
Пример #11
0
 public Wait(HommClient client, HommSensorData sensorData)
 {
     this.client     = client;
     this.sensorData = sensorData;
 }