跪求一款游戏的寻路算法 10C

根据地图的二值化数据写寻路算法,还需要在其中加上判断障碍物类型,例如:可以破坏和不可破坏。
还有障碍物碰撞检测,简单说就是判断当前人物是否撞墙。

3个回答

这个是图的搜索,一般分为深度优先和广度优先
1.深度优先,每次进入到一个新的格子,判断周围的格子,然后选定第一个非墙且未走过的路,直到没有路了,退回到有其他选择的节点,递归进行
2.广度优先,每次进入一个新的格子,把周围所有的格子都入栈,然后遍历每个,将每个可能性的周围继续搜索,直到找到目标节点

qiuzhu001
qiuzhu001 回复llxiaoh: 对啊我现在也就是这个问题,其实我在做一个游戏的脚本现在就是难在不知道怎么样把地图换成二值化黑白地图
大约一年之前 回复
u011892089
llxiaoh 这样怎么考虑是不是墙,是不是可以走得通呢
大约一年之前 回复
qiuzhu001
qiuzhu001 你好我现在有一个想法不知道对不对,就是取出两点之间的坐标,套用距离公式,这样可以么?
大约一年之前 回复

可以考虑A*算法,效率高,有成熟的算法描述,且网上有很多源代码可用。需要加入的只是对于地图中格子的属性描述(是否障碍物、是否可破环等),并在寻路过程中进行判断。

qiuzhu001
qiuzhu001 你好我现在有一个想法不知道对不对,就是取出两点之间的坐标,套用距离公式,这样可以么?
大约一年之前 回复

这个用A*算法。 下面我给您贴上核心代码

A*算法类
/// <summary>
    /// 节点移动方向
    /// </summary>
    public enum CompassDirections
    {
        /// <summary>
        /// 未设置
        /// </summary>
        NotSet = 0,
        /// <summary>
        /// 上移(北)
        /// </summary>
        North = 1,
        /// <summary>
        /// 右上移(东北)
        /// </summary>
        NorthEast = 2,
        /// <summary>
        /// 右移(东)
        /// </summary>
        East = 3,
        /// <summary>
        /// 右下移(东南)
        /// </summary>
        SouthEast = 4,
        /// <summary>
        /// 下移(南)
        /// </summary>
        South = 5,
        /// <summary>
        /// 左下移(西南)
        /// </summary>
        SouthWest = 6,
        /// <summary>
        /// 左移(西)
        /// </summary>
        West = 7,
        /// <summary>
        /// 左上移(西南)
        /// </summary>
        NorthWest = 8
    }

    /// <summary>
    /// A*算法,节点对象
    /// </summary>
    public class AStarPoint
    {
        /// <summary>
        /// 从起点,沿着产生的路径,移动到网格上指定方格的移动耗费。 
        /// </summary>
        public int G = 0;
        /// <summary>
        /// 从网格上那个方格移动到终点B的预估移动耗费。
        /// </summary>
        public int H = 0;

        /// <summary>
        /// X 坐标
        /// </summary>
        public int X
        {
            get { return CurrentPoint.X; }
            set { CurrentPoint.X = value; }
        }
        /// <summary>
        /// Y 坐标
        /// </summary>
        public int Y
        {
            get { return CurrentPoint.Y; }
            set { CurrentPoint.Y = value; }
        }

        /// <summary>
        /// 初始化当前节点的坐标
        /// </summary>
        /// <param name="_x">X坐标</param>
        /// <param name="_y">Y坐标</param>
        public AStarPoint(int _x, int _y)
        {
            CurrentPoint = new Point(_x, _y);
        }

        /// <summary>
        /// 初始化当前节点对象
        /// </summary>
        /// <param name="currentPoint">当前节点</param>
        /// <param name="parentPoint">父节点</param>
        /// <param name="costG">代价G</param>
        /// <param name="costH">代价H</param>
        public AStarPoint(Point currentPoint, AStarPoint parentPoint, int costG, int costH)
        {
            this.CurrentPoint = currentPoint;
            this.ParentPoint = parentPoint;
            this.G = costG;
            this.H = costH;
        }

        /// <summary>
        /// 当前节点
        /// </summary>
        public Point CurrentPoint = new Point(0, 0);
        /// <summary>
        /// 父节点
        /// </summary>
        public AStarPoint ParentPoint = null;

        /// <summary>
        /// F = G + H
        /// </summary>
        public int F
        {
            get
            {
                return this.G + this.H;
            }
        }

        /// <summary>
        /// 重置当前节点的父节点和代价G
        /// </summary>
        /// <param name="parentPoint">父节点</param>
        /// <param name="costG">代价G</param>
        public void ResetParentPoint(AStarPoint parentPoint, int costG)
        {
            this.ParentPoint = parentPoint;
            this.G = costG;
        }
    }

qiuzhu001
qiuzhu001 回复qq_36718671: 我就是只要生成二值化的黑白地图就可以了您可以留个联系方式么
大约一年之前 回复
qiuzhu001
qiuzhu001 回复qq_36718671: 人物当前坐标这些都可以搞啊就是不知道怎么去生成二值化的黑白图片啊
大约一年之前 回复
qq_36718671
qq_36718671 回复qiuzhu001: 如果是本游戏可以判断人物在地图坐标数组位置,然后生成图片。要是外挂系统,对不起啊!这个要指针相关内存操作,我不会。
大约一年之前 回复
qiuzhu001
qiuzhu001 你好我您知道怎么通过游戏内存绘制出游戏当前角色所处的地图的二值化黑白图片么?
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问