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