`
java-mans
  • 浏览: 11427540 次
文章分类
社区版块
存档分类
最新评论

一步一步写算法(之寻路)

 
阅读更多


【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】


寻路是游戏设计中需要使用到一种功能,那么我们怎么样以一个点作为起始点,快速地寻找到目标点呢?其实寻路的方法不难。一种简单有效的方法就是回溯法。如果我们从一个点出发,那么这个点周围肯定有若干条路,只要有一条路存在,我们就一直走下去,直到发现没有路走为止;要是发现路走不下去了怎么办,那就只好回头了,我们只能从剩下的选项中继续选择一条路,继续尝试。如果很不幸,所有的尝试都结束了,还是没有发现目标节点,那只能说明,我们真的无路可走。

a)首先,我们用矩阵表示地图:其中1表示路,0表示没有路,2表示终点,起始地点为(1,0)

#define MAX_NUMBER_LENGTH 6

static int gPath[MAX_NUMBER_LENGTH][MAX_NUMBER_LENGTH] = {
	{0 , 0, 0, 0, 1, 1},
	{1,  1, 0, 0, 1, 0},
	{0 , 1, 1, 1, 1, 0},
	{0 , 0, 1, 0, 1, 2},
	{0 , 0, 1, 0, 1, 0},
	{0 , 0, 1, 1, 1, 0}
};

static int gValue[MAX_NUMBER_LENGTH][MAX_NUMBER_LENGTH] = {0}; /* 记录已走过的路 */


b)其实,我们编写一个判断函数,判断当前节点是否合法

int check_pos_valid(int x, int y)
{
	/* 节点是否出边界 */
	if(x < 0 || x>= MAX_NUMBER_LENGTH || y < 0 || y >= MAX_NUMBER_LENGTH)
		return 0;

	/* 当前节点是否存在路 */
	if(0 == gPath[x][y])
		return 0;

	/* 当前节点是否已经走过 */
	if('#' == gValue[x][y])
		return 0;

	return 1;
}

c)接着,我们编写一个递归的寻找算法即可

int find_path(int x, int y)
{
	if(check_pos_valid(x,y))
	{
		if(2 == gPath[x][y]){
			gValue[x][y] = '#';
			return 1;
		}

		gValue[x][y] = '#';
		if(find_path(x, y-1))
			return 1;

		if(find_path(x-1, y))
			return 1;

		if(find_path(x, y+1))
			return 1;

		if(find_path(x+1, y))
			return 1;
		gValue[x][y] = 0;
		return 0;
	}

	return 0;
}

d)为了验证我们的算法是否正确,可以编写一个打印函数

void print_path()
{
	int outer;
	int inner;

	for(outer = 0; outer < MAX_NUMBER_LENGTH; outer++){
		for(inner = 0; inner < MAX_NUMBER_LENGTH; inner++){
			printf("%c ", gValue[outer][inner]);
		}
		printf("\n");
	}
}

e)上面c中所描述的算法只是寻找一条路,那么如果想遍历所有的道路,算法应该怎么修改呢?

void find_path(int x, int y)
{
	if(check_pos_valid(x,y))
	{
		if(2 == gPath[x][y]){
			gValue[x][y] = '#';
			print_path();
			gValue[x][y] = 0;
			return ;
		}

		gValue[x][y] = '#';
		find_path(x, y-1);
		find_path(x-1, y);
		find_path(x, y+1);
		find_path(x+1, y);
		gValue[x][y] = 0;
	}
}

思考题:

上面的题目介绍了寻路的方法,介绍了如何遍历所有的可能路径。当然你可以从这所有的寻找路径中寻找出一条最短的路径。但是朋友们可以思考一下,有没有一种方法,可以一下子寻找到最优的路径呢?



分享到:
评论

相关推荐

    A*寻路算法源码 附带桌面演示工具

    A*算法是自动寻路的理想解决办法 像自动寻找NPC 自动寻找地图出口 我写的这个只是简单的实现了功能 在运算效率上没有做优化 在接下来的版本中我会增加二*堆算法 来提高A*算法的效率 请大家多多关注 包中还有一个我用...

    A*寻路算法

    实现的功能: 1 把open队列中的元素移到close队列中,表示起始节点已经走过了,那么接下来应该走哪一步呢? * 2 把起始位置周围的 8 个点都找出来 并且 计算出 估价函数值最低的那个元素 那么这个元素就是接下来要...

    d_star:D *寻路算法的基于文本的可视化

    该应用程序仅使用D *寻路算法,并在世界的每一步都打印出一个网格。 警告词:请勿运行类似map5的地图。 我对D *算法的实现不能很好地处理map5之类的地图。 当程序用完堆空间时,您将获得一个文本文件输出,其大小以...

    在Unity中实现Astar寻路算法

    本文将介绍寻路算法中的A*算法,并在unity中用C#脚本来实现寻路功能。 问题描述 现在有两个点:起点A,和终点B,允许向周围的八个方向移动,如图所示。需要找到从起点A到终点B效率最高的路径。 当不存在任何障碍物...

    A可视化:这是使用python和pygame的A *寻路算法的简单可视化

    A可视化:这是使用python和pygame的A *寻路算法的简单可视化

    【WHUT】*实验报告*《人工智能概论》课内实验:A*算法仿真实验

    2.2 运行A*算法:单击“开始”,可以看到起点的实际代价g(搜索深度,即搜索步数)、估计代价h(起点到终点的哈密尔顿距离,即起点到终点的横向和纵向的方格数之和)和估价函数值f(f=g+h),然后依次单击若干次“下...

    精华游戏算法整理(经典)

    算法一:A*寻路初探 From GameDev.net 译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念。这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为...

    java考试系统源码-Advanced_Shortest_Path:A-Star算法的Java代码。经过测试和验证的代码。双向Dijsktra

    star”)是一种广泛用于寻路和图形遍历的计算机算法,该过程是在称为节点的多个点之间绘制有效指向的路径的过程。 由于其性能和准确性,它得到了广泛的应用。 但是,在实际的旅行路线系统中,通常可以通过对图形进行...

    cocos2dx课件-传智王桂林

    传智5期的cocos2d培训文档笔记。。正如我们处理上图网格的方法,一旦搜索区域被转化为容易处理的节点,下一步就是去引导一次找到最短...在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标

    matlab跑代码慢-future_net:2016华为软件精英挑战赛冠军代码

    附上matlab写的一个复赛用例的随机生成器(matlab), 见data_generator 赛题说明 见doc/下的题目描述文档 基本算法 概况: 解决初赛问题, 加上两次寻路多次互设惩罚迭代 初赛问题解决方案 基本步骤 使用spfa或dij求出...

Global site tag (gtag.js) - Google Analytics