public IPlayer DecideCrossTarget() { var target = PassTargetDecideRule.WingCrossDecide(this); if (null != target) { this._status.PassStatus.PassTarget = target; } return(target); }
public IPlayer DecideShortPassTarget() { var target = PassTargetDecideRule.PassClosest(this); if (null != target) { this._status.PassStatus.PassTarget = target; } return(target); }
/// <summary> /// Decide a target to pass. /// 选择传递目标 /// </summary> public void DecidePassTarget() { if (_input.AsPosition == Position.Goalkeeper) { _status.PassStatus.PassTarget = PassTargetDecideRule.GoalKickDecide(this); return; } var region = (Side == Base.Enum.Side.Home) ? _match.Pitch.AwayForcePassRegion : _match.Pitch.HomeForcePassRegion; if (region.IsCoordinateInRegion(Current)) { this._status.PassStatus.PassTarget = PassTargetDecideRule.ForcePassDecide(this); } else { this._status.PassStatus.PassTarget = PassTargetDecideRule.Decide(this); } }
public unsafe override void Start() { var random = manager.Match; #region 站位回合 manager.Match.Status.Round++; // 当前回合加1 manager.Match.RoundInit(); #region 找出罚球人-> 找出离球最近的人 IPlayer takeKickPlayer = MatchRule.GetClosestPlayerFromBallInMySide(manager); if (takeKickPlayer == null) { return; } takeKickPlayer.Status.Hasball = true; #endregion manager.Match.Football.MoveTo(point); takeKickPlayer.MoveTo(point); takeKickPlayer.Rotate((manager.Side == Side.Home) ? manager.Match.Pitch.AwayGoal : manager.Match.Pitch.HomeGoal); takeKickPlayer.Status.ForceState(IdleState.Instance); bool isHome = takeKickPlayer.Manager.Side == Side.Home; Coordinate coor; double x, y; var atkPlayers = takeKickPlayer.Manager.Players; IPlayer atkPlayer = null; //进攻球员 foreach (var p in atkPlayers) { if (p.Disable) { continue; } if (p.ClientId == takeKickPlayer.ClientId) { continue; } if (p.Input.AsPosition == Position.Goalkeeper) { coor = p.Status.Default; } else { x = isHome ? (p.Status.Default.X + 100) : (p.Status.Default.X - 100); y = p.Status.Default.Y; if (y <= 38) { y += 20; } else if (y >= 98) { y -= 20; } coor = MatchRule.RandPointInRect(random, new Coordinate(x, y), 3, 8); } p.Status.ForceState(IdleState.Instance); p.MoveTo(coor); p.Rotate(point); } //防守球员 int uStep = 60; int dStep = 76; foreach (var p in takeKickPlayer.Manager.Opponent.Players) { if (p.Disable) { continue; } if (p.ClientId == takeKickPlayer.ClientId) { continue; } if (p.Input.AsPosition == Position.Goalkeeper) { coor = p.Status.Default; } else { x = isHome ? (p.Status.Default.X + 60) : (p.Status.Default.X - 60); y = p.Status.Default.Y; coor = new Coordinate(x, y); atkPlayer = MatchRule.GetNearPlayerInRound(coor, atkPlayers, 20); if (null != atkPlayer) { coor = MatchRule.GetNearPointInLine(atkPlayer.Current, coor, 8); } else { coor = MatchRule.RandPointInRect(random, coor, 5, 15); if (38 < coor.Y && coor.Y <= 68) { coor.Y = uStep; uStep += 2; } else if (68 < coor.Y && coor.Y <= 98) { coor.Y = dStep; dStep -= 2; } } if (coor.Y <= 38) { coor.Y += 20; } else if (coor.Y >= 98) { coor.Y -= 20; } } p.Status.ForceState(IdleState.Instance); p.MoveTo(coor); p.Rotate(point); } // 停顿时间 for (int i = 0; i < 4; i++) { manager.Match.SaveRpt(); manager.Match.Status.Round++; manager.Match.RoundInit(); } #endregion #region 开球回合 manager.Match.RoundInit(); takeKickPlayer.Status.ForceState(PassState.Instance); takeKickPlayer.Status.State.Enter(takeKickPlayer); #region 如果没有合适的传球人 if (takeKickPlayer.Status.PassStatus.PassTarget == null) // 没有合适传球的人 { takeKickPlayer.Status.PassStatus.PassTarget = PassTargetDecideRule.PassClosest(takeKickPlayer); } #endregion if (takeKickPlayer.Current.SimpleDistance(takeKickPlayer.Status.PassStatus.PassTarget.Current) <= Defines.Player.SHORT_PASS_MAX_RANGEPow) { takeKickPlayer.Status.ForceState(ShortPassState.Instance); } else { takeKickPlayer.Status.ForceState(LongPassState.Instance); } takeKickPlayer.Rotate(takeKickPlayer.Status.PassStatus.PassTarget.Current); takeKickPlayer.Action(); manager.Match.SaveRpt(); #endregion }
/// <summary> /// Starts a openball round. /// 开启一个开球回合 /// </summary> /// <param name="openBallManager"></param> public static void Start(IManager openBallManager) { #region 重置所有的物体 var match = openBallManager.Match; if (match.Status.BreakState != (int)EnumMatchBreakState.SectionOpen) { match.Status.Break(EnumMatchBreakState.MFOpen); } match.Football.Reset(); foreach (IManager manager in match.Managers) { foreach (IPlayer player in manager.Players) { // 下场及有异常状态的球员不移动位置 if (player.SkillLock) { continue; } player.Reset(); player.Status.ForceState(IdleState.Instance); player.Status.Speed = 0; player.MoveTo(player.Status.HalfDefault); player.Rotate(match.Football.Current); } } // 防止对方站入中圈内 bool isHome = openBallManager.Side == Side.Home; double difX = 0; double difY = 0; int cnt = 0; foreach (IPlayer player in openBallManager.Opponent.Players) { difX = Math.Abs(player.Current.X - 105); if (difX >= 25) { continue; } difX = isHome ? 130 + cnt % 2 * 5 : 80 - cnt % 2 * 5; difY = player.Current.Y + (cnt % 2 == 0 ? 3 : -3); cnt++; player.MoveTo(difX, difY); player.Rotate(match.Football.Current); } #endregion #region 找出1个发球人和1个接应人 List <IPlayer> openballArray = new List <IPlayer>(2); IPlayer tmp = null; for (int i = openBallManager.Players.Count - 1; i >= 0; i--) { tmp = openBallManager[i]; if (tmp.SkillLock) { continue; } if (tmp.Input.AsPosition == Base.Enum.Position.Goalkeeper) { continue; } openballArray.Add(openBallManager[i]); if (openballArray.Count == 2) { break; } } if (openballArray.Count == 0) // 没有任何发球人 { openballArray.Add(openBallManager[0]); openballArray[0].Status.Hasball = true; match.SaveRpt(); return; } else // 有足够的发球人 { if (openballArray.Count == 1) // 只有1个发球人 { openballArray[0].MoveTo(_openballPosition1); openballArray[0].Rotate(match.Football.Current); openballArray.Add(openBallManager[0]); // 添加守门员为第二接球人 openballArray[0].Status.Hasball = true; match.SaveRpt(); return; } else // 拥有2个发球人 { openballArray[0].MoveTo(_openballPosition1); openballArray[1].MoveTo(_openballPosition2); openballArray[0].Rotate(match.Football.Current); openballArray[1].Rotate(match.Football.Current); openballArray[0].Status.Hasball = true; } } #endregion #region 发球 match.SaveRpt(); match.Status.Round++; match.RoundInit(); openballArray[0].Status.ForceState(ShortPassState.Instance); openballArray[1].Status.Hasball = true; match.Football.MoveTo(openballArray[1].Current); match.SaveRpt(); match.Status.Round++; match.RoundInit(); openballArray[0].Status.ForceState(IdleState.Instance); openballArray[1].Status.ForceState(ShortPassState.Instance); openballArray[1].Status.PassStatus.PassTarget = PassTargetDecideRule.OpenballDecide(openballArray[1]); openballArray[1].Action(); match.SaveRpt(); match.Status.Round++; openballArray[1].Status.ForceState(IdleState.Instance); #endregion }
/// <summary> /// Starts a free kick. /// 执行一次间接任意球 /// </summary> public unsafe override void Start() { #region 站位回合 var random = manager.Match; manager.Match.Status.Round++; // 当前回合加1 manager.Match.RoundInit(); if (!_isOutBorder) { manager.Match.Status.Break(EnumMatchBreakState.IndirectKick); } #region 找出罚球人-> 找出离球最近的人 IPlayer takeKickPlayer = MatchRule.GetClosestPlayerFromBallInMySide(manager); if (takeKickPlayer == null) { return; } takeKickPlayer.Status.Hasball = true; #endregion // 罚球人站到球面前 takeKickPlayer.Status.ForceState(IdleState.Instance); takeKickPlayer.MoveTo(point); takeKickPlayer.Rotate((manager.Side == Side.Home) ? manager.Match.Pitch.AwayGoal : manager.Match.Pitch.HomeGoal); #region 防守方移动至防守位置 foreach (IPlayer p in takeKickPlayer.Manager.Opponent.Players) { // 下场及有异常状态的球员不移动位置 if (p.SkillLock) { continue; } Coordinate coor; if (p.Input.AsPosition != Position.Goalkeeper) { coor = CloseMove(p.Status.HalfDefault.X, p.Status.HalfDefault.Y); } else { coor = p.Status.Default; } p.Status.ForceState(IdleState.Instance); p.MoveTo(coor); p.Rotate(point); } #endregion #region 进攻方除罚球人移动至进攻位置 foreach (IPlayer p in takeKickPlayer.Manager.Players) { // 下场及有异常状态的球员不移动位置 if (p.SkillLock) { continue; } if (p.ClientId == takeKickPlayer.ClientId) { continue; } if (p.Input.AsPosition == Position.Goalkeeper) { p.MoveTo(p.Status.Default); p.Rotate(point); p.Status.ForceState(IdleState.Instance); continue; } double x = (p.Manager.Side == Side.Home) ? p.Status.HalfDefault.X * 1.6 : p.Status.HalfDefault.X * 1.6 - Defines.Pitch.MAX_WIDTH * 0.6; double y = p.Status.Default.Y; y = random.RandomBool() ? y + 5 : y - 5; Coordinate coor = CloseMove(x, y); p.Status.ForceState(IdleState.Instance); p.MoveTo(coor); p.Rotate(point); } #endregion // 停顿时间 for (int i = 0; i < 4; i++) { manager.Match.SaveRpt(); manager.Match.Status.Round++; manager.Match.RoundInit(); } #endregion #region 开球回合 manager.Match.RoundInit(); takeKickPlayer.Status.ForceState(PassState.Instance); //边线球 if (manager.Match.Football.IsOutBorder) { takeKickPlayer.Status.SubState.SetSubState(EnumSubState.HandThrow, manager.Match.Status.Round); takeKickPlayer.Status.ForceState(ShortPassState.Instance); takeKickPlayer.DecideEnd(); takeKickPlayer.Status.PassStatus.PassTarget = PassTargetDecideRule.PassClosest(takeKickPlayer); } else { takeKickPlayer.Status.State.Enter(takeKickPlayer); #region 如果没有合适的传球人 if (takeKickPlayer.Status.PassStatus.PassTarget == null) // 没有合适传球的人 { takeKickPlayer.Status.PassStatus.PassTarget = PassTargetDecideRule.PassClosest(takeKickPlayer); } #endregion if (takeKickPlayer.Current.SimpleDistance(takeKickPlayer.Status.PassStatus.PassTarget.Current) < Defines.Player.SHORT_PASS_MAX_RANGEPow) { takeKickPlayer.Status.ForceState(ShortPassState.Instance); } else { takeKickPlayer.Status.ForceState(LongPassState.Instance); } } takeKickPlayer.Rotate(takeKickPlayer.Status.PassStatus.PassTarget.Current); takeKickPlayer.Action(); manager.Match.SaveRpt(); #endregion }