A*寻路算法入门(七)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!
一只没有远见的猫咪
在上面的例子中,我们看到猫咪在选择最短路径的时候,它总是选择最好的方块(在未来最短路径中的一块) — 就像他它是一只有远见的猫咪一样!
但是如果这只猫咪不总是头脑清楚的去选择第一个添加到列表中的方块时会发生什么呢?
这里有一张示意图显示了这些被用在该处理过程中的方块.你将看到猫咪会尝试更多的方块,但是它仍然能找到一条最短的路径(不一定和前面相同,但是等效的):
上图中红色方块并不表示最短路径,它仅表示在某些点上选择的”S”方块.
我建议你检查上图并且视图跟随遍历它.这次,你将发现无论怎样”最坏的”的路径被选择,在最后你仍然可以得到一条最短的路径!
所以你可以看到跟随”错误”的方块也没有关系,在最终你仍然可以得到最短路径,即使你会经历更多次的迭代.
在我们的实现中,我们将按以下算法将方块添加到开放列表中去:
- 邻居方块将按以下顺序返回:上/左/下/右.
 - 一个具有相同分值的方块将被添加到开放列表中所有相同分值相同方块的最后面(所以第一个添加的将第一个被猫咪取得).
 
这里是一张回溯的示意图:
最短路径通过开始从目的地回退到其父方块来建立起来(比如:在目的地我们可以看到箭头指向右侧,所以该方块的父方块在它的左侧).
最终,我们可以通过下面的伪代码来合成猫咪的处理.它被写为Objective-C,但是你可以用任何语言实现:
[openList add:originalSquare]; // start by adding the original position to the open list
do {
    currentSquare = [openList squareWithLowestFScore]; // Get the square with the lowest F score
    [closedList add:currentSquare]; // add the current square to the closed list
    [openList remove:currentSquare]; // remove it to the open list
    if ([closedList contains:destinationSquare]) { // if we added the destination to the closed list, we've found a path
        // PATH FOUND
        break; // break the loop
    }
    adjacentSquares = [currentSquare walkableAdjacentSquares]; // Retrieve all its walkable adjacent squares
    foreach (aSquare in adjacentSquares) {
        if ([closedList contains:aSquare]) { // if this adjacent square is already in the closed list ignore it
            continue; // Go to the next adjacent square
        }
        if (![openList contains:aSquare]) { // if its not in the open list
            // compute its score, set the parent
            [openList add:aSquare]; // and add it to the open list
        } else { // if its already in the open list
            // test if using the current G score make the aSquare F score lower, if yes update the parent because it means its a better path
        }
    }
} while(![openList isEmpty]); // Continue until there is no more available square in the open list (which means there is no path)
你有没有小激动想要实现一下?!在下一篇课程中,我们将完全实现它!
接下来呢?
恭喜,你现在了解了基本的A*寻路算法!如果你想要从这里学到更多内容,我推荐你阅读 Amit’s A* Pages.
在本系列的下一篇课程中,我们将在一个简单的Cocos2D地图游戏中实现A*算法!(之前猫猪写过的 Cocos2D将v1.0的tileMap游戏转换到v3.4中一例系列博文即是前奏,大家可以先看一下 ;)
与此同时,如果你有关于A*算法的任何问题,请加入下面的讨论中来!
A*寻路算法入门(七)的更多相关文章
- A*寻路算法入门(三)
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
 - A*寻路算法入门(二)
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
 - A*寻路算法入门(一)
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
 - A星寻路算法入门(Unity实现)
		
最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...
 - A*寻路算法入门(六)
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
 - A*寻路算法入门(五)
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
 - A*寻路算法入门(四)
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
 - Andrew Ng机器学习算法入门((七):特征选择和多项式回归
		
特征选择 还是回归到房价的问题.在最开始的问题中,我们假设房价与房屋面积有关,那么最开始对房价预测的时候,回归方程可能如下所示: 其中frontage表示的房子的长,depth表示的是房子的宽. 但长 ...
 - A星寻路算法介绍
		
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
 
随机推荐
- c++ primer第15章这几个例子中的构造函数形式不太理解
			
//向基类构造函数传递实参p491 class Bulk_item : public Item_base{ public: Bulk_item(,double disc_rate = 0.0): It ...
 - web性能优化之---JavaScript中的无阻塞加载性能优化方案
			
一.js阻塞特性 JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 即<script>每次出现都会让页面等待脚本的解析和执 ...
 - Nginx+tomcat配置集群负载均衡
			
开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...
 - Goland 提示 :configuration is still incorrect 的解决
			
安装好 Goland 后,调试编译的时候提示 goland configuration is still incorrect,百度 和 Google 都没有明确答案 Google 上有一些提示,但是也 ...
 - 使用gogs搭建git私有仓库
			
搭建gogs 我的机器环境:centos 7 1.安装git yum install git 2.安装mysql gogs的数据存在mysql中,需要安装一个mysql来存数据,当然也有其他的选择 ...
 - Rstudio-server 重新登录载入session的问题
			
Rstudio-server 非常好用,但是免费版的也有一些问题,一个是只能支持在一个客户端的登录,另一个就是每次登录都要导入之前session的问题,对于第二个问题的解决方案,我们可以进入到~/.r ...
 - NOIP2017D2T3 列队—Treap
			
NOIP2017列队 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m ...
 - day08 JSP
			
day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...
 - Nodejs 模块查找机制还不错(从当前目录开始逐级向上查找node_modules)
			
比如 m.js是能够调用a.js的, 这样子目录就可以避免重复安装node_modules. 够用了.
 - 设计模式一日一练:中介者模式(Mediator)
			
Mediator模式,用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 比较典型的例子是联合国.QQ群等.比如,如果中国有 ...