Exemplo n.º 1
0
 public APuck GetPassPuck(AHock striker, double PassPower, double PassAngle, Point goalie)
 {
     var puckSpeedAbs = striker.AStrength / 100 * Game.PassPowerFactor * Game.StruckPuckInitialSpeedFactor * PassPower + striker.Speed.Length * Math.Cos(striker.Angle + PassAngle - striker.Speed.GetAngle());
     var puckAngle = AngleNormalize(PassAngle + striker.Angle);
     var puckSpeed = new Point(puckAngle)*puckSpeedAbs;
     return new APuck(striker.PuckPos(), puckSpeed, goalie);
 }
Exemplo n.º 2
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));
        }
Exemplo n.º 3
0
        private bool StrikePrimitiveValidate(AHock striker)
        {
            var puckPos = striker.PuckPos();

            if (Math.Abs(puckPos.X - Opp.NetFront) > RinkWidth / 3 * 2)
            {
                return(false);
            }

            if (Math.Abs(puckPos.X - Opp.NetFront) < 3.5 * HoRadius)
            {
                return(false);
            }

            if (MyRight() && Math.Cos(striker.Angle) > 0)
            {
                return(false);
            }
            if (MyLeft() && Math.Cos(striker.Angle) < 0)
            {
                return(false);
            }

            return(true);
        }
Exemplo n.º 4
0
        public APuck GetPassPuck(AHock striker, double PassPower, double PassAngle, Point goalie)
        {
            var puckSpeedAbs = striker.AStrength / 100 * Game.PassPowerFactor * Game.StruckPuckInitialSpeedFactor * PassPower + striker.Speed.Length * Math.Cos(striker.Angle + PassAngle - striker.Speed.GetAngle());
            var puckAngle    = AngleNormalize(PassAngle + striker.Angle);
            var puckSpeed    = new Point(puckAngle) * puckSpeedAbs;

            return(new APuck(striker.PuckPos(), puckSpeed, goalie));
        }
Exemplo n.º 5
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);
        }
Exemplo n.º 6
0
        APuck GetStrikePuck(AHock striker, double strikePower, Point goalie, Point puckPos)
        {
            var strikerDirection   = new Point(striker.Angle);
            var speedAngleStriker  = striker.Speed.GetAngle();
            var puckSpeed          = 20.0 * strikePower + striker.Speed.Length * Math.Cos(striker.Angle - speedAngleStriker);
            var puckSpeedDirection = strikerDirection * puckSpeed;

            return(new APuck(puckPos ?? striker.PuckPos(), puckSpeedDirection, goalie));
        }
Exemplo n.º 7
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;
        }
Exemplo n.º 8
0
 bool Chase(IEnumerable <AHock> opps, AHock I)
 {
     foreach (var opp in opps)
     {
         opp.MoveTo(I);
         if (CanStrike(opp, I) || CanStrike(opp, I.PuckPos()))
         {
             return(false);
         }
     }
     return(true);
 }
Exemplo n.º 9
0
 Point PuckMove(int ticks, APuck pk, AHock hock)
 {
     if (hock == null)
     {
         pk.Move(ticks);
         return(new Point(pk));
     }
     if (Math.Abs(hock.GetAngleTo(hock + hock.Speed)) < Deg(15) && hock.Speed.Length > 2)
     {
         hock.Move(1, 0, ticks); // TODO
     }
     return(hock.PuckPos());
 }
Exemplo n.º 10
0
        private bool StrikePrimitiveValidate(AHock striker)
        {
            var puckPos = striker.PuckPos();
            if (Math.Abs(puckPos.X - Opp.NetFront) > RinkWidth/3*2)
                return false;

            if (Math.Abs(puckPos.X - Opp.NetFront) < 3.5*HoRadius)
                return false;

            if (MyRight() && Math.Cos(striker.Angle) > 0)
                return false;
            if (MyLeft() && Math.Cos(striker.Angle) < 0)
                return false;

            return true;
        }
Exemplo n.º 11
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);
        }
Exemplo n.º 12
0
 APuck GetStrikePuck(AHock striker, double strikePower, Point goalie, Point puckPos)
 {
     var strikerDirection = new Point(striker.Angle);
     var speedAngleStriker = striker.Speed.GetAngle();
     var puckSpeed = 20.0 * strikePower + striker.Speed.Length * Math.Cos(striker.Angle - speedAngleStriker);
     var puckSpeedDirection = strikerDirection * puckSpeed;
     return new APuck(puckPos ?? striker.PuckPos(), puckSpeedDirection, goalie);
 }
Exemplo n.º 13
0
 bool Chase(IEnumerable<AHock> opps, AHock I)
 {
     foreach (var opp in opps)
     {
         opp.MoveTo(I);
         if (CanStrike(opp, I) || CanStrike(opp, I.PuckPos()))
             return false;
     }
     return true;
 }
Exemplo n.º 14
0
 Point PuckMove(int ticks, APuck pk, AHock hock)
 {
     if (hock == null)
     {
         pk.Move(ticks);
         return new Point(pk);
     }
     if (Math.Abs(hock.GetAngleTo(hock + hock.Speed)) < Deg(15) && hock.Speed.Length > 2)
         hock.Move(1, 0, ticks); // TODO
     return hock.PuckPos();
 }