Exemplo n.º 1
0
        public IPlayer DecideCrossTarget()
        {
            var target = PassTargetDecideRule.WingCrossDecide(this);

            if (null != target)
            {
                this._status.PassStatus.PassTarget = target;
            }
            return(target);
        }
Exemplo n.º 2
0
        public IPlayer DecideShortPassTarget()
        {
            var target = PassTargetDecideRule.PassClosest(this);

            if (null != target)
            {
                this._status.PassStatus.PassTarget = target;
            }
            return(target);
        }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
        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
        }
Exemplo n.º 5
0
        /// <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
        }
Exemplo n.º 6
0
        /// <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
        }