去年做一个模仿保卫萝卜的塔防游戏的时候,自己写的,游戏框架用的是coco2d-html5

实现原理可以参考 http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html

这个算法项目一直放在github中,朋友们需要的可以自己去看下

https://github.com/caoke90/Algorithm/blob/master/Astar.js

//Astar 寻路算法
//Point 类型
var cc=cc||console
var Point=function(x,y){
if(this instanceof Point){
this.init(x,y)
}else{
return new Point(x,y)
} }
Point.prototype={
init:function(x,y){
this.x=x;
this.y=y;
},
ParentPoint:null,
F :0, //F=G+H
G:0,
H:0,
x:0,
y:0,
CalcF:function(){
this.F = this.G + this.H;
}
} //Maze 类型
var Maze=function(maze){
if(this instanceof Maze){
this.init(maze);
}else{
return new Maze(maze)
}
}
Maze.prototype={
init:function(maze){
this.MazeArray=maze
},
OBLIQUE : 14,
STEP:10,
CloseList:[],
OpenList:[],
FindPath:function(start, end, IsIgnoreCorner){
this.OpenList.push(start);
while (this.OpenList.length != 0)
{
//找出F值最小的点
var tempStart = this.MinPoint(this.OpenList);
this.CloseList.push(tempStart);
this.Remove(this.OpenList,tempStart); //找出它相邻的点
var surroundPoints = this.SurrroundPoints(tempStart, IsIgnoreCorner);
for (var i=0;i< surroundPoints.length;i++)
{
var point=surroundPoints[i]
if (this.Exists(this.OpenList,point)){
//计算G值, 如果比原来的大, 就什么都不做, 否则设置它的父节点为当前点,并更新G和F
this.FoundPoint(tempStart, point);
}
else{
//如果它们不在开始列表里, 就加入, 并设置父节点,并计算GHF
this.NotFoundPoint(tempStart, end, point);
}
}
if (this.Get(this.OpenList,end) != null){
return this.Get(this.OpenList,end);
}
}
return this.Get(this.OpenList,end);
},
//在二维数组对应的位置不为障碍物
CanReaches:function(x,y){
return this.MazeArray[this.MazeArray.length-y-1][x] == 0;
},
CanReach:function( start, point, IsIgnoreCorner){
if (!this.CanReaches(point.x, point.y) || this.Exists(this.CloseList,point))
return false;
else
{
if ((Math.abs(point.x - start.x) + Math.abs(point.y - start.y)) == 1){
return true;
}
return false;
}
},
NotFoundPoint:function(tempStart, end, point){
point.ParentPoint = tempStart;
point.G = this.CalcG(tempStart, point);
point.H = this.CalcH(end, point);
point.CalcF();
this.OpenList.push(point); },
FoundPoint:function(tempStart, point){
var G = this.CalcG(tempStart, point);
if (G < point.G)
{
point.ParentPoint = tempStart;
point.G = G;
point.CalcF();
}
},
CalcG:function(start, point)
{
var G = (Math.abs(point.X - start.X) + Math.abs(point.Y - start.Y)) == 2 ? this.OBLIQUE:this.STEP ;
var parentG = point.ParentPoint != null ? point.ParentPoint.G : 0;
return G + parentG;
}, CalcH:function( end, point)
{
var step = Math.abs(point.x - end.x) + Math.abs(point.y - end.y);
return step * this.STEP;
}, //获取某个点周围可以到达的点
SurrroundPoints:function( point, IsIgnoreCorner)
{
var surroundPoints = [];
if (this.CanReach(point,Point(point.x-1,point.y),IsIgnoreCorner)){
surroundPoints.push(Point(point.x-1,point.y));
}
if (this.CanReach(point,Point(point.x,point.y-1),IsIgnoreCorner)){
surroundPoints.push(Point(point.x,point.y-1));
}
if (this.CanReach(point,Point(point.x+1,point.y),IsIgnoreCorner)){
surroundPoints.push(Point(point.x+1,point.y));
}
if (this.CanReach(point,Point(point.x,point.y+1),IsIgnoreCorner)){
surroundPoints.push(Point(point.x,point.y+1));
}
return surroundPoints;
}, //对 List<Point> 的一些扩展方法
//判断是否存在点
Exists:function(points, point)
{
for(k in points){
var p=points[k]
if ((p.x == point.x) && (p.y == point.y)){
return true;
}
}
return false;
},
//获取f最小
MinPoint:function (points)
{
var min=points[0];
for(var i=0;i<points.length-1;i++){
if(points[i].F<points[i+1].F){
min=points[i]
}
}
return min;
},
//获取点
Get:function(points, point)
{
for (var k in points){
var p=points[k]
if ((p.x == point.x) && (p.y == point.y))
return p;
}
return null;
},
//删除点
Remove:function(points,point)
{
for(var i=0;i<points.length;i++){
var p=points[i]
if (point.x === p.x && point.y === p.y){
return points.splice(i,1);
}
} } } var arr= [
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[ 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[ 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[ 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[ 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]; var map=Maze(arr)
//起始点 结束点 是否斜角
var parent=map.FindPath(Point(2,3),Point(16,2),false) while (parent != null)
{
cc.log(parent.x + ", " + parent.y);
parent = parent.ParentPoint;
}

  

javascript的Astar版 寻路算法的更多相关文章

  1. 算法:Astar寻路算法改进,双向A*寻路算法

    早前写了一篇关于A*算法的文章:<算法:Astar寻路算法改进> 最近在写个js的UI框架,顺便实现了一个js版本的A*算法,与之前不同的是,该A*算法是个双向A*. 双向A*有什么好处呢 ...

  2. 算法:Astar寻路算法改进

    早前写了一篇<RCP:gef智能寻路算法(A star)> 出现了一点问题. 在AStar算法中,默认寻路起点和终点都是N x N的方格,但如果用在路由上,就会出现问题. 如果,需要连线的 ...

  3. JavaScript版排序算法

    JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) //排序算法 window.onload = function(){ var array = ...

  4. C#实现AStar寻路算法

    AStar寻路算法是一种在一个静态路网中寻找最短路径的算法,也是在游戏开发中最常用到的寻路算法之一:最近刚好需要用到寻路算法,因此把自己的实现过程记录下来. 先直接上可视化之后的效果图,图中黑色方格代 ...

  5. 一个高效的A-star寻路算法(八方向)(

    这种写法比较垃圾,表现在每次搜索一个点要遍历整个地图那么大的数组,如果地图为256*256,每次搜索都要执行65535次,如果遍历多个点就是n*65535,速度上实在是太垃圾了 简单说下思路,以后补充 ...

  6. A*(也叫A star, A星)寻路算法Java版

    寻路算法有非常多种,A*寻路算法被公觉得最好的寻路算法. 首先要理解什么是A*寻路算法,能够參考这三篇文章: http://www.gamedev.net/page/resources/_/techn ...

  7. [转] A*寻路算法C++简单实现

    参考文章: http://www.policyalmanac.org/games/aStarTutorial.htm   这是英文原文<A*入门>,最经典的讲解,有demo演示 http: ...

  8. 不再依赖A*,利用C++编写全新寻路算法

    一,说在前面的话 大概在半年前,看见一到信息竞赛题:在任意方格阵中设置障碍物,确定起始点后,求这两点之间路径.当时觉得蛮有意思的,但是没有时间去做,今天花了两个小时来实现它.据说有一个更高级的寻路算法 ...

  9. PHP树生成迷宫及A*自己主动寻路算法

    PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻 ...

随机推荐

  1. jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?

    Statement和PreparedStatement的功能主要是对sql语句的执行 区别 (1)Statement每执行一条sql语句就需要生成一条执行计划,执行100条就需要100条执行计划Pre ...

  2. Shiro——概述

    Apache Shiro 是 Java 的一个安全(权限)框架. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在 JavaEE 环境. Shiro 可以完成 ...

  3. Requests接口测试(二)

    requests安装先看下怎么安装requests, 执行以下命令: pip install requests 安装好后如何导入requests模块呢? 如下所示: import requests 基 ...

  4. MongoDB整理笔记の体系架构

    MongoDB 是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台特性. 一个运行着的MongoDB 数据库就可以看成是一个MongoDB Server,该Server 由实例和数 ...

  5. 使用java实现单链表----(java中的引用就是指针)

    //一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...

  6. ArcGIS 工作经历【IFeatureBuffer】【CAD转SHP】

    由于工作需要,需要基于ArcGIS进行二次开发,软件的开发过程当中有一个非常重要的功能,就是需要把CAD的数据转换为shp文件保存,方便后面的使用编辑,存储. 先说一下功能的前提,需要将CAD转换为s ...

  7. 在有主分支和个人分支情况下的TFS使用方法

    从事.NET开发的资深童鞋一定都知道VS有自带的代码管理工具TFS(Team Foundation Server ),但是开发萌新可能就不太了解了,下面我就介绍一下这个工具以及它的一些常用操作. TF ...

  8. intellij idea 15,webstorm 最新注册破解

    http://idea.lanyus.com 在激活地址填写上上面的地址就行了,非常简单有效. 亲测idea,webstorm...都可以激活

  9. vs2015+opencv3.3.1 +Eigen 3.3.4 c++实现 薄膜插值 泊松图像编辑(v=0||Δf=0)

    #include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/i ...

  10. 编码原则实例------c++程序设计原理与实践(进阶篇)

    编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...