从起点问题的提出:
在游戏地图中,如何寻找一条从起点到终点的最短行路线路?
数据表达:
使用M*N大小的byte数组 来表示地图,每个位置的状态用0表示可走,1表示墙,2表示起点,3表示终点,128表示路径;
行走规则有两种:
4方向行走规则:只能从当前点向上,下,左,右 这4个方向行走;
8方向行走规则:可以从当前点向上,下,左,右,左上,左下,右上,右下,这8个方向行走;
行走方向编码:
在游戏地图中,如何寻找一条从起点到终点的最短行路线路?
数据表达:
使用M*N大小的byte数组 来表示地图,每个位置的状态用0表示可走,1表示墙,2表示起点,3表示终点,128表示路径;
行走规则有两种:
4方向行走规则:只能从当前点向上,下,左,右 这4个方向行走;
8方向行走规则:可以从当前点向上,下,左,右,左上,左下,右上,右下,这8个方向行走;
行走方向编码:
3 | 2 | 1 |
4 | 0 | |
5 | 6 | 7 |
目标:
尽快找出一条从起点到终点的路径,最好能使得路径最短,且转弯次数最少。
算法思路:
思路一:
从当前点开始,往目标点方向前进,当遇到障碍时,改变方向,转到另一个可以前进的方向,同时在转变方向后修正前进方向;
优点: 可以很快找到一条路径;但不能保证最短
思路二:
使用宽度优先搜索算法,从起点开始,寻找出所有走一步所能到达的位置,记录这些位置,再从这些位置开始,寻找出所有
再走一步(即从起点走2步)所能到达的位置,不断继续,直到找到目标点止。然后从记录的这些位置(像一棵树)中找出路径;
优缺点: 需要记录大量位置,使用大量内存;可寻找出一条或者所有的最短路径。
路径优化算法:
假设已经找出了一条路径,则有可能在路径的某一段上存在"绕弯"的情况,重复走或者是多走了,这样路径
就不是最短了.优化算法如下:
1.设起点为当前点;
2.从终点开始向当前点逐个节点设为测试点进行测试;
3.若当前点到测试点之间存在直接路径(即直线路径),
4.则比较直线路径的长度与路径上两点的长度,如果大于直线路径长,则
5.将当前点到测试点之间的路径用直线路径代替
6.然后将测试点设置为当前点,转第2步;
7.直到当前点为终点为止;
为了方便生成地图,特编制了简单的程序,可以设置起点,终点以及障碍(即墙).
目前程序版本为V1.0.7,已经实现最短路径算法及优化算法.截图如下: