PathFinding.js 尋路類神器


  最近有打算寫個迷宮玩玩,無意中發下了這個庫,很強大!又是開源在github的,並且有一個相當酷的demo。這個庫不僅支持瀏覽器端的運行,而且可以運行在node.js上。怎么用到服務器上這里就不涉及了,主要還是翻譯一下官方的demo。

一、基本應用

  首先我們要定義一個二維的圖

var grid = new PF.Grid(width, height); //這里的兩個參數定義了圖的長和寬

 

然后我們可以設置這個圖中一些不能走的節點,用setWalkableAt函數

grid.setWalkableAt(0, 1, false);

這段代碼的意思是設置(0,1)這個點不能走。

當然這樣的話如果圖非常大,不能走的點很多就很復雜了,不過還有一種方法可以讓我們直接用矩陣定義圖,用0,1表示能否到達

 

1 var matrix = [
2     [0, 0, 0, 1, 0],
3     [1, 0, 0, 0, 1],
4     [0, 0, 1, 0, 0],
5 ];
6 var grid = new PF.Grid(5, 3, matrix);

 

 

 

圖建好了之后我們就可以開始最激動人心的地方了,那就是這個庫為我們提供的九種尋路函數。要知道這個要是自己實現還是有不少的困難的。這九中算法分別是:

  • AStarFinder *
  • BreadthFirstFinder *
  • BestFirstFinder
  • DijkstraFinder *
  • BiAStarFinder
  • BiBestFirstFinder
  • BiDijkstraFinder *
  • BiBreadthFirstFinder *
  • JumpPointFinder *

 這九個函數中尾部加了星號的是保證能找到最短路的,從第五個開始四個前綴bi的則是雙向搜索的意思。

要使用這些函數需要首先建立一個查找的對象,一第一種查找為例:

var finder = new PF.AStarFinder();

 

然后我們用它查找所建立的圖上兩點的路徑:

var path = finder.findPath(1, 2, 4, 2, grid);//表示搜索(1,2)到(4,2)的最短路,運行后path=[ [ 1, 2 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ], [ 3, 2 ], [ 4, 2 ] ]

 

 當然它這個算法的實現貌似是直接在原圖上操作的,所以各種算法運行后圖就變了,所以你要多次應用的話就要先復制一份,就像:

var gridBackup = grid.clone();

 

二、高級應用

1、你可以設置是否允許走斜線:

var finder = new PF.AStarFinder({
    allowDiagonal: true
});

 

然后再走斜線的基礎上,你可以設置是否允許從不能走的方塊角上過去:

var finder = new PF.AStarFinder({
    allowDiagonal: true,
    dontCrossCorners: true
});

 

2、我們知道很影響尋路算法的速度的就是他們的啟發函數,在PathFinding中也允許我們定義自己的啟發函數

對於 AStarFinder, BestFirstFinder 以及他們加了 Bi 前綴,我們就可以設置他的啟發函數,本身提供了三個備選的

            1、PF.Heuristic.manhattan   (默認值)

            2、PF.Heuristic.chebyshev

            3、PF.Heuristic.euclidean

如果要修改啟發函數:

var finder = new PF.AStarFinder({
    heuristic: PF.Heuristic.chebyshev
});

 

或者是定義自己的啟發函數 

var finder = new PF.BestFirstFinder({
    allowDiagonal: true,
    heuristic: function(dx, dy) {
        return Math.min(dx, dy);
    }
});

 

 三、由於返回的路徑是路徑話說那個的每個點,你也可以只返回那些標志點:

var newPath = PF.Util.smoothenPath(grid, path);

 

這樣如果原來的path是[[0, 1], [0, 2], [0, 3], [0, 4]]那么修改之后就是 [[0, 1], [0, 4]] 

 

 這樣,有了這個庫歇一歇類似尋路的游戲就不用擔心算法問題啦(當然你追求速度要自己弄個高檔的啟發函數就另說啦),實在是很方便啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM