Пример #1
0
        public void MoveAction(int action)
        {
            int xf, yf;
            switch (action)
            {
                case GameHelper.PlayerAction.Move.Up:
                    xf = _player.GetX();
                    yf = _player.GetY() - 1;
                    break;
                case GameHelper.PlayerAction.Move.Down:
                    xf = _player.GetX();
                    yf = _player.GetY() + 1;
                    break;
                case GameHelper.PlayerAction.Move.Left:
                    xf = _player.GetX() - 1;
                    yf = _player.GetY();
                    break;
                case GameHelper.PlayerAction.Move.Right:
                    xf = _player.GetX() + 1;
                    yf = _player.GetY();
                    break;
                default:
                    return;
            }

            // out of bounds
            if (xf < 0 || xf >= GameHelper.GetNumCols() || yf < 0 || yf >= GameHelper.GetNumRows())
            {
                return;
            }

            var nextPos = _arena.GetChar(xf, yf);

            // clear spot to move
            if (nextPos == '.')
            {
                _player.Action(action);
            }
            // run into robot
            else if (nextPos.ToString().IndexOfAny("R123456789".ToCharArray()) != -1)
            {
                _player.Action(GameHelper.PlayerAction.Action.TakeDamage);
            }
            // else ran into wall, do nothing
        }
Пример #2
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
        }
Пример #3
0
        /// <summary>
        /// Kicks the penalty kick.
        /// 罚点球
        /// </summary>
        public unsafe override void Start()
        {
            #region 站位回合
            var random = manager.Match;
            // 当前回合加1
            manager.Match.Status.Round++;
            manager.Match.Status.Break(EnumMatchBreakState.PenaltyKick);
            #region 找出罚球人-> 找出离球最近的人
            // 找出罚球人,罚球人为任意球属性最高的球员(不包含守门员)
            IPlayer takeKickPlayer = MatchRule.GetHighestPropertyPlayer(manager, PlayerProperty.FreeKick);
            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 防守方移动至防守位置
            var region = (manager.Side == Side.Home) ? manager.Match.Pitch.AwayPenaltyRegion : manager.Match.Pitch.HomePenaltyRegion;
            foreach (IPlayer p in takeKickPlayer.Manager.Opponent.Players)
            {
                Coordinate coor;
                if (p.Input.AsPosition != Position.Goalkeeper)
                {
                    coor = CloseMove(p.Status.HalfDefault.X, p.Status.HalfDefault.Y);
                }
                else
                {
                    coor = p.Status.Default;
                }

                if (p.Input.AsPosition == Position.Fullback) // 将防守人移动至禁区线上
                {
                    if (region.Start.X == 0)
                    {
                        coor = new Coordinate(region.End.X, coor.Y);
                    }
                    else
                    {
                        coor = new Coordinate(region.Start.X, coor.Y);
                    }
                }

                p.Status.ForceState(IdleState.Instance);
                p.MoveTo(coor);
                p.Rotate(point);
            }
            #endregion

            #region 进攻方除罚球人移动至进攻位置
            foreach (IPlayer p in takeKickPlayer.Manager.Players)
            {
                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.HalfDefault.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

            #region 防止除罚球人外任何人进入禁区
            foreach (IManager m in manager.Match.Managers)
            {
                foreach (IPlayer player in m.Players)
                {
                    if (player.ClientId == takeKickPlayer.ClientId)
                    {
                        continue;
                    }

                    if (player.Input.AsPosition == Position.Goalkeeper)
                    {
                        continue;
                    }

                    if (region.IsCoordinateInRegion(player.Current))
                    {
                        if (region.Start.X == 0)
                        {
                            player.MoveTo(region.End.X, player.Current.Y);
                        }
                        else
                        {
                            player.MoveTo(region.Start.X, player.Current.Y);
                        }
                    }
                }
            }

            #endregion

            // 停顿时间
            for (int i = 0; i < 4; i++)
            {
                manager.Match.SaveRpt();
                manager.Match.Status.Round++;
                manager.Match.RoundInit();
            }

            #endregion

            #region 开球回合
            takeKickPlayer.Status.ForceState(VolleyShootState.Instance);
            takeKickPlayer.AddFinishingBuff(1);
            takeKickPlayer.Action();

            IPlayer gk = manager.Opponent.GetPlayersByPosition(Position.Goalkeeper)[0];
            gk.QuickDecide();
            gk.Action();
            manager.Match.SaveRpt();
            #endregion
        }
Пример #4
0
        static IMatch MainLoop(IMatch match)
        {
            match.SessionInit();
            IPlayer ballHandler   = null;
            byte    ballHandlerId = 0;

            while (match.Status.Round < match.Status.TotalRound)
            {
                match.Status.Round++;
                // 回合初始化数据
                match.RoundInit();
                // 持球人决策
                ballHandler   = match.Status.BallHandler;
                ballHandlerId = match.Status.BallHandler.ClientId;
                //经理技能
                SkillEngine.SkillImpl.SkillFacade.TriggerManagerSkills(match.HomeManager, 0);
                SkillEngine.SkillImpl.SkillFacade.TriggerManagerSkills(match.AwayManager, 0);
                ballHandler.QuickDecide();

                #region 进攻方决策
                foreach (var player in ballHandler.Manager.Players)
                {
                    if (player == ballHandler)
                    {
                        continue;
                    }

                    player.QuickDecide();
                }
                #endregion

                #region 防守方决策
                foreach (var player in ballHandler.Manager.Opponent.Players)
                {
                    player.QuickDecide();
                }
                #endregion
                match.HomeManager.SetDoneState();
                match.AwayManager.SetDoneState();
                // 持球人行动
                ballHandler   = match.Status.BallHandler;
                ballHandlerId = match.Status.BallHandler.ClientId;
                ballHandler.Action();

                #region 所有球员一起行动
                foreach (var manager in match.Managers)
                {
                    foreach (var player in manager.Players)
                    {
                        if (player.ClientId == ballHandlerId)
                        {
                            continue;
                        }

                        if (player.Disable)
                        {
                            continue;
                        }

                        player.Action();
                    }
                }
                #endregion

                // 足球移动
                match.Football.Move();

                match.SaveRpt();
            }
            match.SaveRptEnd();
            return(match);
        }
Пример #5
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
        }
Пример #6
0
        /// <summary>
        /// Starts a free kick.
        /// </summary>
        public unsafe override void Start()
        {
            #region 站位回合
            var random = manager.Match;
            // 当前回合加1
            manager.Match.Status.Round++;
            manager.Match.RoundInit();
            manager.Match.Status.Break(EnumMatchBreakState.DirectKick);
            // 射门目标
            Coordinate target = (manager.Side == Side.Home) ? manager.Match.Pitch.AwayGoal : manager.Match.Pitch.HomeGoal;
            // 已经移动位置后的球员列表
            List <IPlayer> finArray = new List <IPlayer>(Defines.Match.MAX_PLAYER_COUNT * 2);

            #region  罚球人相关
            // 找出罚球人,罚球人为任意球属性最高的球员(不包含守门员)
            IPlayer takeKickPlayer = MatchRule.GetHighestPropertyPlayer(manager, PlayerProperty.FreeKick);
            if (takeKickPlayer == null) // 如果没有可以罚球的球员,返回
            {
                return;
            }
            takeKickPlayer.Status.Hasball = true;
            finArray.Add(takeKickPlayer);

            // 罚球人站到球面前
            takeKickPlayer.Status.ForceState(IdleState.Instance);
            takeKickPlayer.MoveTo(point);
            takeKickPlayer.Rotate(point);
            #endregion

            #region 找出人墙区
            const int distance   = 20; // 离人墙的距离
            const int pDistance  = 5;  // 人墙间的距离
            const int pDistanceY = 10;

            double xdiff = point.X - target.X;
            double ydiff = point.Y - target.Y;
            if (xdiff == 0)
            {
                xdiff = 1;
            }
            if (ydiff == 0)
            {
                ydiff = 5;                             //ydiff = 1;
            }
            double tDistance = target.Distance(point); // 总距离
            double l         = xdiff / -ydiff;         // 斜率

            double x0 = point.X - xdiff / tDistance * distance;
            double y0 = point.Y - ydiff / tDistance * distance;

            #region 填充人墙坐标
            int wallPlayerCount          = random.RandomBool() ? 2 : 3;
            List <Coordinate> wallPoints = new List <Coordinate>(wallPlayerCount);
            if (wallPlayerCount == 2)
            {
                double x = x0 - pDistance / 2 * xdiff / tDistance;
                double y = y0 + pDistanceY / 2 * ydiff / tDistance;
                wallPoints.Add(new Coordinate(x, y));

                x = x0 + pDistance / 2 * xdiff / tDistance;
                y = y0 - pDistanceY / 2 * ydiff / tDistance;
                wallPoints.Add(new Coordinate(x, y));
            }
            else
            { // wall player count = 3
                double x = x0 - pDistance * xdiff / tDistance;
                double y = y0 + pDistanceY * ydiff / tDistance;
                wallPoints.Add(new Coordinate(x, y));

                x = x0;
                y = y0;
                wallPoints.Add(new Coordinate(x, y));

                x = x0 + pDistance * xdiff / tDistance;
                y = y0 - pDistanceY * ydiff / tDistance;
                wallPoints.Add(new Coordinate(x, y));
            }

            #endregion

            #region 摆人墙

            // 从防守方找出离球最近的人摆人墙
            double *       defenders = stackalloc double[Defines.Match.MAX_PLAYER_COUNT - 1];
            List <IPlayer> array     = new List <IPlayer>(Defines.Match.MAX_PLAYER_COUNT - 1);
            int            length    = 0;
            foreach (var p in manager.Opponent.Players)
            {
                if (p.SkillLock)
                {
                    continue;
                }
                if (p.Input.AsPosition == Position.Goalkeeper ||
                    p.Input.AsPosition == Position.Forward)
                {
                    continue;
                }
                defenders[length] = p.Current.SimpleDistance(point);
                array.Add(p);
                length++;
            }
            int[] indexes = Utility.SortMinDoubleArrayIndexQuick(defenders, length);
            for (int i = 0; i < wallPlayerCount; i++)
            {
                if (i >= array.Count)
                {
                    continue;                   // 修正人墙人数不够引发异常
                }
                Coordinate p = wallPoints[i];
                array[indexes[i]].MoveTo(p);
                finArray.Add(array[indexes[i]]);
            }

            #endregion

            #endregion

            #region 防守方剩余球员站位
            foreach (var p in manager.Opponent.Players)
            {
                if (p.SkillLock)
                {
                    continue;
                }
                if (!finArray.Contains(p))
                {
                    if (p.Input.AsPosition == Position.Goalkeeper)
                    {
                        p.MoveTo(p.Status.Default);
                    }
                    else
                    {
                        p.MoveTo(CloseMove(p.Status.HalfDefault.X, p.Status.HalfDefault.Y));
                    }
                }
                p.Status.ForceState(IdleState.Instance);
                p.Rotate(manager.Match.Football.Current);
            }
            #endregion

            #region 进攻方剩余球员站位
            IPlayer lastMan = manager.Opponent.Status.LastPlayer; // 最后一个防守人
            if (null == lastMan)
            {
                lastMan = FindOutLastDefender();
            }
            foreach (var p in manager.Players)
            {
                if (p.SkillLock)
                {
                    continue;
                }

                if (p.ClientId != takeKickPlayer.ClientId)
                {
                    if (p.Input.AsPosition == Position.Goalkeeper)
                    {
                        p.MoveTo(p.Status.Default);
                    }
                    else
                    {
                        if (p.Input.AsPosition == Position.Forward)
                        {
                            // 前锋挤压阵型
                            int excursion = (manager.Side == Side.Home) ? -random.RandomInt32(0, 10) : random.RandomInt32(0, 10);
                            p.MoveTo(lastMan.Current.X + excursion, p.Status.HalfDefault.Y);
                        }
                        else
                        {
                            // 其余进攻球员
                            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.HalfDefault.Y;
                            p.MoveTo(CloseMove(x, y));
                        }
                    }
                }
                p.Status.ForceState(IdleState.Instance);
                p.Rotate(manager.Match.Football.Current);
            }

            #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(FreekickShootState.Instance);
            SkillEngine.SkillImpl.SkillFacade.TriggerPlayerSkills(takeKickPlayer, 0, true);
            takeKickPlayer.Action();

            IPlayer gk = manager.Opponent.GetPlayersByPosition(Position.Goalkeeper)[0];
            // gk.Decide();
            gk.QuickDecide();
            gk.Action();

            manager.Match.SaveRpt();
            #endregion
        }