Ejemplo n.º 1
0
        public static Hockeyist NearestOpponent(this Hockeyist me)
        {
            var world = Get <World> .Current();

            Hockeyist nearestOpponent      = null;
            double    nearestOpponentRange = 0.0D;

            foreach (Hockeyist hockeyist in world.Hockeyists)
            {
                if (hockeyist.IsTeammate ||
                    hockeyist.Type == HockeyistType.Goalie ||
                    hockeyist.State == HockeyistState.KnockedDown ||
                    hockeyist.State == HockeyistState.Resting)
                {
                    continue;
                }

                double opponentRange = MathUtil.Hypot(me.X - hockeyist.X, me.Y - hockeyist.Y);

                if (nearestOpponent == null || opponentRange < nearestOpponentRange)
                {
                    nearestOpponent      = hockeyist;
                    nearestOpponentRange = opponentRange;
                }
            }

            return(nearestOpponent);
        }
Ejemplo n.º 2
0
 public My(Hockeyist _self, World _world, Game _game, Move _move)
 {
     self  = _self;
     world = _world;
     game  = _game;
     move  = _move;
 }
Ejemplo n.º 3
0
        public static bool CanStrike(this Hockeyist self, Unit unit)
        {
            var angle = self.GetAngleTo(unit);

            return((Math.Abs(angle) <= 0.5 * Current.Game.StickSector) &&
                   (self.GetDistanceTo(unit) <= Current.Game.StickLength));
        }
Ejemplo n.º 4
0
 private void Init()
 {
     self  = (Hockeyist)args[0];
     world = (World)args[1];
     game  = (Game)args[2];
     move  = (Move)args[3];
 }
Ejemplo n.º 5
0
        private void HasGoalieStrikeLogic(Hockeyist enemyGoalie)
        {
            Move.Action = Self.SwingTicks < Current.Stratagy.RandomSwingCount
                            ? ActionType.Swing
                            : ActionType.Strike;

            if (Move.Action == ActionType.Swing)
            {
                var    xPossibleConnection = Math.Abs((Self.Y + Self.SpeedY * Current.Game.SwingActionCooldownTicks - enemyGoalie.Y) / Math.Tan(Self.Angle));
                double offset = 1.0D;

                if (Self.X - enemyGoalie.X > 0.0)
                {
                    offset = -1.0D;
                }


                var dis = UnitHelper.GetDistance(Self.X + Self.SpeedX * Current.Game.SwingActionCooldownTicks + xPossibleConnection * offset,
                                                 enemyGoalie.Y,
                                                 enemyGoalie.X + offset * enemyGoalie.Radius * -1.0D,
                                                 enemyGoalie.Y);

                if (dis < 2.0D * enemyGoalie.Radius)
                {
                    Move.Action = ActionType.Strike;
                }
            }
        }
Ejemplo n.º 6
0
 public void StayOn(Hockeyist self, Point to, Point lookAt)
 {
     if (!FindPath(self, to, lookAt))
     {
         DoMove(self, to, GetTicksToUp(new AHock(self), to) < GetTicksToDown(new AHock(self), to) ? 1 : -1);
     }
 }
Ejemplo n.º 7
0
        private static Hockeyist getNearestOpponent(double x, double y, World world)
        {
            Hockeyist nearestOpponent      = null;
            double    nearestOpponentRange = 0.0D;

            foreach (Hockeyist hockeyist in world.Hockeyists)
            {
                if (hockeyist.IsTeammate || hockeyist.Type == HockeyistType.Goalie ||
                    hockeyist.State == HockeyistState.KnockedDown ||
                    hockeyist.State == HockeyistState.Resting)
                {
                    continue;
                }

                double opponentRange = hypot(x - hockeyist.X, y - hockeyist.Y);

                if (nearestOpponent == null || opponentRange < nearestOpponentRange)
                {
                    nearestOpponent      = hockeyist;
                    nearestOpponentRange = opponentRange;
                }
            }

            return(nearestOpponent);
        }
Ejemplo n.º 8
0
        double ProbabStrikeAfter(int swingTime, Hockeyist self, IEnumerable <MoveAction> actions, ActionType actionType)
        {
            var I = new AHock(self);

            if (Math.Abs(My.NetFront - I.X) < RinkWidth / 3)
            {
                return(0.0);
            }

            var power     = GetPower(I, swingTime);
            var totalTime = 0;
            var opps      = Hockeyists
                            .Where(x => !x.IsTeammate && IsInGame(x))
                            .Select(x => new AHock(x))
                            .ToArray();

            var goalie = Get(OppGoalie);

            foreach (var action in actions)
            {
                for (var i = 0; i < action.Ticks; i++)
                {
                    GoalieMove(goalie, 1, I.PuckPos());
                    I.Move(action.SpeedUp, action.Turn);
                    if (!Chase(opps, I))
                    {
                        return(0.0);
                    }
                }
                totalTime += action.Ticks;
            }
            var passAngle = PassAngleNorm(I.GetAngleTo(GetStrikePoint()));

            return(StrikeProbability(I, power, goalie, totalTime, actionType, passAngle, null));
        }
Ejemplo n.º 9
0
        public static bool IsHunter(this Hockeyist me)
        {
            var world = Get <World> .Current();

            var teammate = world.MyTeam().First(x => x.Id != me.Id);

            return(world.Puck.OwnerHockeyistId == me.Id || me.GetDistanceTo(world.Puck) < teammate.GetDistanceTo(world.Puck));
        }
Ejemplo n.º 10
0
        public bool FindPath(Hockeyist self, Point to, Point lookAt)
        {
            if (lookAt == null)
            {
                return(StopOn(new AHock(self), to));
            }

            var okDist = HoRadius * 1.5;

            var minTime = Inf;
            var selTurn = 0.0;
            var selSpUp = 0.0;

            for (var dir = -1; dir <= 1; dir += 2)
            {
                var hock = new AHock(self);
                for (var ticksDirect = 0; ticksDirect < 100; ticksDirect++)
                {
                    var curTime = ticksDirect;
                    var ho      = hock.Clone();
                    while (Math.Abs(ho.GetAngleTo(lookAt)) > Deg(8))
                    {
                        ho.Move(0, TurnNorm(ho.GetAngleTo(lookAt), ho.AAgility));
                        curTime++;
                    }
                    if (curTime < minTime && ho.GetDistanceTo(to) < okDist)
                    {
                        minTime = curTime;
                        if (ticksDirect == 0)
                        {
                            selSpUp = 0.0;
                            selTurn = TurnNorm(ho.GetAngleTo(lookAt), hock.AAgility);
                        }
                        else if (dir > 0)
                        {
                            selTurn = self.GetAngleTo(to.X, to.Y);
                            selSpUp = GetSpeedTo(selTurn);
                        }
                        else
                        {
                            selTurn = RevAngle(self.GetAngleTo(to.X, to.Y));
                            selSpUp = -GetSpeedTo(selTurn);
                        }
                    }
                    if (dir > 0)
                    {
                        GetTicksToUpN(hock, to, 0, 1);
                    }
                    else
                    {
                        GetTicksToDownN(hock, to, 0, 1);
                    }
                }
            }
            move.SpeedUp = selSpUp;
            move.Turn    = selTurn;
            return(minTime != Inf);
        }
Ejemplo n.º 11
0
        public double Stamina; // TODO: учитавать изменение?

        public AHock(Hockeyist self) : base(MyStrategy.Get(self), MyStrategy.GetSpeed(self), self.Angle)
        {
            Base         = self;
            AngularSpeed = self.AngularSpeed;
            Angle        = self.Angle;
            CoolDown     = self.RemainingCooldownTicks;
            KnockDown    = self.RemainingKnockdownTicks;
            Stamina      = self.Stamina;
        }
Ejemplo n.º 12
0
 public HunterBehaviour(Hockeyist h) : base(h)
 {
     getThePuck   = new GetThePuckBehaviour(h);
     strikePoints = new[]
     {
         new Point(attackLine, 650),
         new Point(attackLine, 250)
     };
 }
Ejemplo n.º 13
0
        private void Init(Hockeyist self, World world, Game game, Move move)
        {
            this.self  = self;
            this.world = world;
            this.game  = game;
            this.move  = move;

            opponentPlayer = world.GetOpponentPlayer();
        }
Ejemplo n.º 14
0
        public Point FindWayPoint(Hockeyist self)
        {
            var okDist = 5 * HoRadius;

            var   bestTime = Inf;
            Point sel      = null;
            //TimerStart();
            var bot = Hockeyists.Count(x => !x.IsTeammate && IsInGame(x) && x.Y > RinkCenter.Y);
            var top = Hockeyists.Count(x => !x.IsTeammate && IsInGame(x) && x.Y <= RinkCenter.Y);

            foreach (Point p in WayPoints.ToArray().OrderBy(x => ((Point)x).GetDistanceTo(self)).Take(10))
            {
                var I = new AHock(self);
                if (p.GetDistanceTo2(I) <= okDist * okDist || MyRight() && I.X < p.X || MyLeft() && I.X > p.X)
                {
                    continue;
                }

                var cands = Hockeyists
                            .Where(x => !x.IsTeammate && IsInGame(x))
                            .Select(x => new AHock(x)).ToArray();

                var time = 0;
                var ok   = true;
                while (p.GetDistanceTo2(I) > okDist * okDist && ok)
                {
                    I.MoveTo(p);
                    foreach (var c in cands)
                    {
                        c.MoveTo(I);
                        if (CanStrike(c, I.PuckPos()) || // достанет шайбу
                            CanStrike(c, I) || // достанет меня
                            I.GetDistanceTo2(c) <= 2 * HoRadius * 2 * HoRadius // столкнется со мной
                            )
                        {
                            ok = false;
                            break;
                        }
                    }
                    time++;
                }
                if (ok)
                {
                    if (p.Y > RinkCenter.Y && bot > top || p.Y <= RinkCenter.Y && top > bot)
                    {
                        time *= 3;
                    }
                    if (time < bestTime)
                    {
                        bestTime = time;
                        sel      = p.Clone();
                    }
                }
            }
            //Log("FindWayPoint " + TimerStop());
            return(sel);
        }
Ejemplo n.º 15
0
        public void Move(Hockeyist _self, World _world, Game _game, Move _move)
        {
            args.Add(_self); args.Add(_world); args.Add(_game); args.Add(_move);
            Init();
            opponentMinions = AllBadGuys();

            //Инициализация позиций для удара
            opponent = world.GetOpponentPlayer();
            if (world.GetMyPlayer().NetFront > world.Width / 2)
            {
                amIRight        = true;
                AimGoalPoint[0] = opponent.NetFront + world.Width / 6 + self.Radius;
            }
            else
            {
                amIRight        = false;
                AimGoalPoint[0] = opponent.NetFront - world.Width / 6 - self.Radius;
            }

            if (self.Y < game.GoalNetTop + game.GoalNetHeight / 4)
            {
                AimGoalPoint[1] = game.GoalNetTop - self.Radius;                                                             // + game.GoalNetHeight/2;
            }
            else if (self.Y < game.GoalNetTop + game.GoalNetHeight * 3 / 4)
            {
            }
            else
            {
                AimGoalPoint[1] = game.GoalNetTop + game.GoalNetHeight + self.Radius;             // + game.GoalNetHeight/2;
            }
            //позиции для защиты
            myNetDefPointX = 5 * world.GetMyPlayer().NetFront - 2 * world.GetMyPlayer().NetRight - 2 * world.GetMyPlayer().NetLeft;
            myNetDefPointY = game.GoalNetTop + game.GoalNetHeight / 2;



            bool flag = StrikeOpps();

            if (flag)
            {
            }
            else if (self.TeammateIndex == 0)
            {
                PlayAttack();
            }
            else if (self.TeammateIndex == 1)
            {
                PlayDefence();
            }
//			double x = world.Puck.X;
//			double y = world.Puck.Y;

            //gotoPuck();

            args.Clear();
        }
Ejemplo n.º 16
0
 public AHock(Point pos, Point speed, double angle, double angularSpeed, int coolDown, int knockDown, double stamina, Hockeyist from)
     : base(pos, speed, angle)
 {
     Base         = from;
     AngularSpeed = angularSpeed;
     Angle        = angle;
     CoolDown     = coolDown;
     KnockDown    = knockDown;
     Stamina      = stamina;
 }
Ejemplo n.º 17
0
        public void Move(Hockeyist self, World world, Game game, Move move)
        {
            Current.Move      = move;
            Current.World     = world;
            Current.Hockeyist = self;
            Current.Game      = game;
            Current.Stratagy  = this;

            GameStates.Play();
        }
Ejemplo n.º 18
0
        // Проверка движение хоккеиста
        void Research3(Hockeyist self)
        {
            var range = TurnRange(new AHock(self).AAgility);

            move.Turn    = range / 2;
            move.SpeedUp = 0.8;
            var pl = new AHock(self);

            pl.Move(0.8, range / 2, 20);
        }
Ejemplo n.º 19
0
 // Проверка движение шайбы - OK
 void Research4(Hockeyist self)
 {
     if (TK(190))
     {
         __puck = new APuck(puck, OppGoalie);
         __puck.Move(10);
     }
     if (TK(190 + 10))
     {
     }
 }
Ejemplo n.º 20
0
        public int GetTicksTo(Point to, Hockeyist my, bool tryDown = true)
        {
            var ho   = new AHock(my);
            var up   = GetTicksToUp(ho, to);
            var down = tryDown ? GetTicksToDown(ho, to) : Inf;

            if (up <= down)
            {
                return(up);
            }
            return(-down);
        }
Ejemplo n.º 21
0
        public void Move(Hockeyist self, World world, Game game, Move move)
        {
            if (self.State == HockeyistState.Swinging)
            {
                move.Action = ActionType.Strike;
                return;
            }

            Init(self, world, game, move);
            if (PuckUnderOurControl)
            {
                if (ThisHasPuck)
                {
                    if (InStrikeZone())
                    {
                        if (Hypot(self.SpeedX, self.SpeedY) > 0.069)
                        {
                            move.SpeedUp = -1;
                        }
                        if (Math.Abs(TurnToNetFarCorner(self, move)) < STRIKE_ANGLE)
                        {
                            move.Action = ActionType.Swing;
                        }
                    }
                    else
                    {
                        GoToNearestStrikeZone();
                    }
                }
                else
                {
                    var nearestOpponent = GetNearestOpponent();
                    if (nearestOpponent != null)
                    {
                        if (self.GetDistanceTo(nearestOpponent) > game.StickLength)
                        {
                            move.SpeedUp = 1.0D;
                        }
                        else if (Math.Abs(self.GetAngleTo(nearestOpponent)) < 0.5D * game.StickSector)
                        {
                            move.Action = ActionType.Strike;
                        }
                        move.Turn = self.GetAngleTo(nearestOpponent);
                    }
                }
            }
            else
            {
                move.SpeedUp = 1.0D;
                move.Turn    = self.GetAngleTo(world.Puck);
                move.Action  = ActionType.TakePuck;
            }
        }
Ejemplo n.º 22
0
        private double TurnToNetFarCorner(Hockeyist self, Move move)
        {
            double x;
            double y;

            GetNetFarCorner(out x, out y);

            var angleToNet = self.GetAngleTo(x, y);

            move.Turn = angleToNet;
            return(angleToNet);
        }
Ejemplo n.º 23
0
 void DoMove(Hockeyist self, Point to, int direction)
 {
     if (direction > 0)
     {
         move.Turn    = self.GetAngleTo(to.X, to.Y);
         move.SpeedUp = GetSpeedTo(move.Turn);
     }
     else
     {
         move.Turn    = RevAngle(self.GetAngleTo(to.X, to.Y));
         move.SpeedUp = -GetSpeedTo(move.Turn);
     }
 }
Ejemplo n.º 24
0
        private static Hockeyist GetGoalie(bool isTeammate)
        {
            Hockeyist goalie = null;

            foreach (var hockeyist in Current.World.Hockeyists)
            {
                if (hockeyist.IsTeammate == isTeammate && hockeyist.Type == HockeyistType.Goalie)
                {
                    goalie = hockeyist;
                    break;
                }
            }
            return(goalie);
        }
Ejemplo n.º 25
0
        public void Move(Hockeyist self, World world, Game game, Move move)
        {
            if (self.State == HockeyistState.Swinging)
            {
                move.Action = ActionType.Strike;
                return;
            }

            if (world.Puck.OwnerPlayerId == self.PlayerId)
            {
                if (world.Puck.OwnerHockeyistId == self.Id)
                {
                    Player opponentPlayer = world.GetOpponentPlayer();

                    double netX = 0.5D * (opponentPlayer.NetBack + opponentPlayer.NetFront);
                    double netY = 0.5D * (opponentPlayer.NetBottom + opponentPlayer.NetTop);
                    netY += (self.Y < netY ? 0.5D : -0.5D) * game.GoalNetHeight;

                    double angleToNet = self.GetAngleTo(netX, netY);
                    move.Turn = angleToNet;

                    if (Math.Abs(angleToNet) < STRIKE_ANGLE)
                    {
                        move.Action = ActionType.Swing;
                    }
                }
                else
                {
                    Hockeyist nearestOpponent = getNearestOpponent(self.X, self.Y, world);
                    if (nearestOpponent != null)
                    {
                        if (self.GetDistanceTo(nearestOpponent) > game.StickLength)
                        {
                            move.SpeedUp = 1.0D;
                        }
                        else if (Math.Abs(self.GetAngleTo(nearestOpponent)) < 0.5D * game.StickSector)
                        {
                            move.Action = ActionType.Strike;
                        }
                        move.Turn = self.GetAngleTo(nearestOpponent);
                    }
                }
            }
            else
            {
                move.SpeedUp = 1.0D;
                move.Turn    = self.GetAngleTo(world.Puck);
                move.Action  = ActionType.TakePuck;
            }
        }
Ejemplo n.º 26
0
        private Hockeyist[] AllBadGuys()
        {
            Hockeyist[] allguys = world.Hockeyists;
            Hockeyist[] badguys = new Hockeyist[6];
            int         j       = 0;

            for (int i = 0; i < allguys.Length; i++)
            {
                if (allguys[i].Type != HockeyistType.Goalie && !allguys[i].IsTeammate)
                {
                    badguys[j] = allguys[i];
                    j++;
                }
            }
            return(badguys);
        }
Ejemplo n.º 27
0
        private void WriteHockeyist(Hockeyist hockeyist)
        {
            if (hockeyist == null)
            {
                WriteBoolean(false);
            }
            else
            {
                WriteBoolean(true);

                WriteLong(hockeyist.Id);
                WriteLong(hockeyist.PlayerId);
                WriteInt(hockeyist.TeammateIndex);
                WriteDouble(hockeyist.Mass);
                WriteDouble(hockeyist.Radius);
                WriteDouble(hockeyist.X);
                WriteDouble(hockeyist.Y);
                WriteDouble(hockeyist.SpeedX);
                WriteDouble(hockeyist.SpeedY);
                WriteDouble(hockeyist.Angle);
                WriteDouble(hockeyist.AngularSpeed);
                WriteBoolean(hockeyist.IsTeammate);
                WriteEnum((sbyte?)hockeyist.Type);
                WriteInt(hockeyist.Strength);
                WriteInt(hockeyist.Endurance);
                WriteInt(hockeyist.Dexterity);
                WriteInt(hockeyist.Agility);
                WriteDouble(hockeyist.Stamina);
                WriteEnum((sbyte?)hockeyist.State);
                WriteInt(hockeyist.OriginalPositionIndex);
                WriteInt(hockeyist.RemainingKnockdownTicks);
                WriteInt(hockeyist.RemainingCooldownTicks);
                WriteInt(hockeyist.SwingTicks);
                WriteEnum((sbyte?)hockeyist.LastAction);
                if (hockeyist.LastActionTick == null)
                {
                    WriteBoolean(false);
                }
                else
                {
                    WriteBoolean(true);
                    WriteInt((int)hockeyist.LastActionTick);
                }
            }
        }
Ejemplo n.º 28
0
        private Hockeyist[] ReadHockeyists()
        {
            int hockeyistCount = ReadInt();

            if (hockeyistCount < 0)
            {
                return(null);
            }

            Hockeyist[] hockeyists = new Hockeyist[hockeyistCount];

            for (int hockeyistIndex = 0; hockeyistIndex < hockeyistCount; ++hockeyistIndex)
            {
                hockeyists[hockeyistIndex] = ReadHockeyist();
            }

            return(hockeyists);
        }
Ejemplo n.º 29
0
        private Hockeyist GetNearestOpponent()
        {
            Hockeyist nearestOpponent      = null;
            var       nearestOpponentRange = 0.0D;

            foreach (var hockeyist in world.Hockeyists.Where(h => !(h.IsTeammate || h.Type == HockeyistType.Goalie || h.State == HockeyistState.KnockedDown || h.State == HockeyistState.Resting)))
            {
                var opponentRange = Hypot(self.X - hockeyist.X, self.Y - hockeyist.Y);

                if (nearestOpponent == null || opponentRange < nearestOpponentRange)
                {
                    nearestOpponent      = hockeyist;
                    nearestOpponentRange = opponentRange;
                }
            }

            return(nearestOpponent);
        }
Ejemplo n.º 30
0
        protected override void Do()
        {
            if (Current.SaferCount > 0)
            {
                var       distance = 0.0;
                Hockeyist passer   = null;

                foreach (var friend in Current.World.Hockeyists)
                {
                    if (friend.IsTeammate && friend.Type != HockeyistType.Goalie)
                    {
                        var dis = friend.GetDistanceTo(Self);
                        if (dis > distance)
                        {
                            distance = dis;
                            passer   = friend;
                        }
                    }
                }

                if (passer != null)
                {
                    var angle = Self.GetAngleTo(passer);
                    if (angle <= Current.Game.PassSector / 2.0D)
                    {
                        Move.PassPower = 1.0D;
                        Move.PassAngle = angle;
                    }
                    else
                    {
                        Move.Turn = angle;
                    }
                }
            }
            else
            {
                if (TakePossition == null)
                {
                    TakePossition = new TakeShotPossition();
                }

                TakePossition.Decide();
            }
        }