Exemplo n.º 1
0
        /// <summary>
        /// 计算移动方式
        /// <para>必须保证 p1 p2相临再跑一步的距离内</para>
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        /// <returns></returns>
        public RunType CalculationRunType(PositionInfo position, Point p2)
        {
            var xd = position.Point.X - p2.X;
            var yd = position.Point.Y - p2.Y;

            if (Math.Abs(xd) <= 1 && Math.Abs(yd) <= 1)
            {
                return(RunType.Normal);
            }
            else
            {
                //Point p3 = new Point(p2.X + x, p2.Y + y);
                var maze = MirContext.Maze(position.MapInfo);
                int x    = p2.X + xd;
                int y    = p2.Y + yd;
                if (x > MirContext.ReadMap.Width || y > MirContext.ReadMap.Height)//跑步终点坐标超出地图
                {
                    return(RunType.Normal);
                }
                else
                {
                    //跑步终点坐标有障碍物则走,否则跑
                    return(maze[x, y] == 1 ? RunType.Normal : RunType.FastRun);
                }
            }
        }
Exemplo n.º 2
0
 public MirAction(dmsoft _dmsoft, MirContext _mirContext)
 {
     dmsoft     = _dmsoft;
     mirContext = _mirContext;
 }
Exemplo n.º 3
0
        /// <summary>
        /// 走到坐标
        /// </summary>
        /// <param name="mapInfo"></param>
        /// <param name="point"></param>
        /// <param name="cancellationTokenSource"></param>
        /// <param name="distance"></param>
        /// <returns></returns>
        public MirResult MoveToPoint(MapInfo mapInfo, Point point, CancellationTokenSource cancellationTokenSource, int distance = 2, Func <bool> func = null)
        {
            var position = MirContext.Position;

            //同一个地图判断
            if (!position.MapInfo.Equals(mapInfo))
            {
                return(new MirResult(Consts.NotSameMap, "不在同一个地图"));
            }

            //距离判断
            if (CalculationDistance(position.Point, point) <= distance)
            {
                return(new MirResult());
            }

            /**
             * 1.找到两个点的路径
             * 2.循环路径,一个个点的走过去(需要考虑人怪卡位问题)
             */
            string message = string.Empty;

            #region 1.找到两个点的路径
            var findPath   = FindPath(position, point);
            var pathPoints = findPath.Data;
            if (findPath.Success && !pathPoints.Any())
            {
                return(new MirResult(Consts.AutoRoteFail, findPath.Message));
            }
            #endregion

            #region 循环路径,一个个点的走过去(需要考虑人怪卡位问题)
            Point firstPoint = pathPoints.FirstOrDefault();
            //Point secondPoint = null;
            MirDirection mirDirection = MirDirection.None;
            RunType      runType      = RunType.FastRun;
            //移动是否成功
            bool moveState  = false;
            bool reFindPath = false;
            //循环条件
            //还有点位没有走到
            //没有被取消
            //同一个地图
            //距离大于 distance
            while (firstPoint != null &&
                   !cancellationTokenSource.IsCancellationRequested &&
                   position.MapInfo.Equals(mapInfo) &&
                   CalculationDistance(position.Point, point) > distance)
            {
                try
                {
                    #region 计算移动方向
                    mirDirection = CalculationDirection(position.Point, firstPoint);
                    if (mirDirection == MirDirection.None)
                    {
                        pathPoints.Remove(firstPoint);
                        //已经到达位置,需要重新计算路线
                        //findPath = FindPath(MirContext.Position, point);
                        //if(findPath.Success && findPath.Data.Any())
                        //{
                        //    pathPoints = findPath.Data;
                        //}
                        //else
                        //{
                        //    pathPoints = new List<Point>();
                        //}
                        continue;
                    }
                    #endregion

                    #region 计算移动方式
                    runType = CalculationRunType(position, firstPoint);
                    #endregion

                    #region 移动
                    var actionResult = MirAction.Move(mirDirection, runType);
                    //#TODO 判断 actionResult 状态,并输入日志
                    moveState = actionResult.Data;
                    if (moveState)
                    {
                        //更新最后移动时间
                        MirContext.LastMoveTime = new DateTime();
                        pathPoints.Remove(firstPoint);

                        //打怪过程有移动过,这重新寻路
                        if (func != null)
                        {
                            reFindPath = func();
                        }
                    }
                    else
                    {
                        var nextPoint = GetNextPoint(position.Point, mirDirection, runType);
                        //#TODO,如果是跑,需要再处理下
                        //移动失败,15秒内不走这个点
                        MirContext.AddBartPoint(nextPoint, position.MapInfo, DateTime.Now.AddSeconds(15));

                        if (LongTimeNotMove())
                        {
                            //长时间被堵住,随用随机飞
                        }
                        //被堵后,重新寻路
                        reFindPath = true;
                    }
                    if (reFindPath)
                    {
                        findPath = FindPath(MirContext.Position, point);
                        if (findPath.Success && findPath.Data.Any())
                        {
                            pathPoints = findPath.Data;
                        }
                        else
                        {
                            pathPoints = new List <Point>();
                            return(new MirResult(findPath.Code, findPath.Message));
                        }
                    }
                    #endregion
                }
                finally
                {
                    firstPoint = pathPoints.FirstOrDefault();
                    position   = MirContext.Position;
                }
            }
            #endregion
            return(new MirResult());
        }
Exemplo n.º 4
0
 public AbstractMirService(MirContext mirContext, CancellationTokenSource cancellationTokenSource)
 {
     this.MirContext = mirContext;
 }
Exemplo n.º 5
0
        /// <summary>
        /// 寻路
        /// </summary>
        /// <param name="position"></param>
        /// <param name="to"></param>
        /// <returns></returns>
        protected ActionResult <List <APoint> > FindPath(PositionInfo position, APoint to)
        {
            PathGrid pathGrid = new PathGrid(MirContext.ReadMap.Width, MirContext.ReadMap.Height, MirContext.Maze(position.MapInfo));

            return(new ActionResult <List <APoint> >(pathGrid.FindPath(position.Point, to)));
        }