日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

A*寻路算法之解决目标点不可达问题

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A*寻路算法之解决目标点不可达问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在游戲世界的尋路中,通常會有這樣一種情況:在小地圖上點擊目標點時,點擊到了障礙物或者建筑上,然后游戲會提示我們目標地點無法到達。玩家必須非常小心的在小地圖上點擊目標區域的空白部分,才能移動到目標地點。那么,有沒有辦法來改進一下這種不友好的體驗呢?

下面給出兩種方法:

  • 最近可達點替代:當目標點S不可達時,在S點周圍尋找一個最近的可達點R,讓R替代S作為目標點尋路。
  • 最近點檢測法:設置一個最小距離,尋路過程中,不斷檢測每個加入openList的點,如果該點到目標點S的距離小于最小距離,保存當前點為N,并修改最小距離。在尋路結束時,如果目標點S無法到達,那么將最接近點N作為尋路的終點。
  • 1.最近可達點替代

    最近可達點替代方法是在尋路之前的一個預處理,首先需要檢測目標點是否可達,如果不可達則需檢測最近的一個可達的點作為目標點。其情形如下:

    ??

    從A點到S的尋路中,發現S點不可達時,在S點周圍一圈的點中搜尋到R,使用R點作為替代目標點。如果A點需要移動到S2點呢?我們在檢測附近可達點的時候,引入一個變量depth,表示不可達點的深度,意為從S到最近的可達點需要搜尋的圈數。

    代碼延續前一篇文章A*尋路算法之解決路徑多拐點問題中的A*尋路算法,搜索替換點方法實現如下:

    public Node getNearestReachableNode(Node node, int maxDepth) {if (maxDepth <= 0 || map.canReach(node.x, node.y)) {return node;}for (int depth = 1; depth < maxDepth ; depth++) {for (int i = node.x - depth; i <= node.x + depth; i++) {// 左if (map.canReach(i, node.y - depth)) {return new Node(i, node.y - depth);}// 右if (map.canReach(i, node.y + depth)) {return new Node(i, node.y + depth);}}for (int i = node.y - depth + 1; i < node.y + depth; i++) {// 上if (map.canReach(node.x - depth, i)) {return new Node(node.x - depth, i);}// 下if (map.canReach(node.x + depth, i)) {return new Node(node.x + depth, i);}}}return node;}

    2.最近點檢測法

    最近點檢測,基本的想法就是在尋路過程中不斷檢測加入到openList中的點與目標點的距離。當無法尋路到目標點時,可以移動到這個最近點上。下面直接上代碼:

    public List<Node> findPath(Node startNode, Node endNode) {int minDistance = Integer.MAX_VALUE;Node nearestNode = startNode;newOpenList.add(startNode);Node currNode = null;while ((currNode = newOpenList.poll()) != null) {removeKey(openSet, currNode.x, currNode.y);addKey(closeSet, currNode.x, currNode.y);ArrayList<Node> neighborNodes = findNeighborNodes(currNode);for (Node nextNode : neighborNodes) {// G + H + Eint gCost = 10 * calcNodeCost(currNode, nextNode) + currNode.gCost + calcNodeExtraCost(currNode, nextNode, endNode);if (contains(openSet, nextNode.x, nextNode.y)) {if (gCost < nextNode.gCost) {nextNode.parent = currNode;nextNode.gCost = gCost;nextNode.fCost = nextNode.gCost + nextNode.hCost;}} else {nextNode.parent = currNode;nextNode.gCost = gCost;nextNode.hCost = 10 * calcNodeCost(nextNode, endNode);nextNode.fCost = nextNode.gCost + nextNode.hCost;newOpenList.add(nextNode);addKey(openSet, nextNode.x, nextNode.y);// 檢測是否是當前最近點int distance = Math.abs(nextNode.x - endNode.x) + Math.abs(nextNode.y - endNode.y);if (distance < minDistance) {minDistance = distance;nearestNode = nextNode;}}}if (contains(openSet, endNode.x, endNode.y)) {Node node = findOpenList(newOpenList, endNode);return getPathList(node != null ? node : nearestNode);}}Node node = findOpenList(newOpenList, endNode);return getPathList(node != null ? node : nearestNode);}

    大概修改10行左右的代碼,就可以在尋路的過程中解決目標點不可達的問題。

    3.兩種方法對比

    1.目標點替代法無法解決尋路到封閉地形的問題,而最近點檢測方法可以移動到附近的點R(?如左圖)。因此,最近點檢測方法一定會生成一條路徑,而目標點替代法不一定會有。

    2.一般情況下,當目標點無法移動過去時,最近點檢測方法往往會搜索地圖上的所有點,而目標點替代法通過找最近可達點可以解決這個問題。不過在如左圖所示回字形地圖上,標點替代法同樣會搜索地圖上的所有點。

    3.目標點替代法搜索到的可達點,可能不是在起點和中間之間,可能使最終生成路徑變得稍微有點怪異。而最近點檢測方法生成的路徑則很自然。如右圖所示,由于目標點替代法查找周圍的可達點時,是按照一定的順序去搜索的。那么就可能出現目標點是S,卻走到R1上去了,而很自然的路徑應該是走到R點上。這一點在格子大小很小的地圖中表現不是非常明顯,但是在格子很大的地圖上表現的差異感就很強烈了,甚至不能接受了。不過,我們可以通過額外的方法消除這個問題-- 在搜索每一圈的可達點的時候,計算該圈上每一點到起始點的距離大小,選擇距離最小的可達點作為替代點。

    ? ? ? ??

    ?

    總結

    以上是生活随笔為你收集整理的A*寻路算法之解决目标点不可达问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲va天堂va欧美ⅴa在线 | 手机看片中文字幕 | 中文字幕乱妇无码av在线 | 国内自拍视频在线播放 | 毛片福利 | 色射色 | 牛牛在线免费视频 | 婷婷啪啪 | 在线视频综合网 | 亚洲国产精品系列 | 成人午夜小视频 | 欧美黄色影院 | 亚洲欧美bt | 国产精品福利一区 | 国产a一区二区三区 | 美女扒开腿让人桶爽 | 欧美日韩精品一区二区三区四区 | 假日游船 | 一本无码aⅴ久久久国产 | 国产精品传媒麻豆hd | 亚洲精品久久久久中文字幕二区 | 日韩一区二区三区在线观看视频 | 久久精品屋 | 夜夜成人| 熟女熟妇伦久久影院毛片一区二区 | 最新视频在线观看 | 国产一区二区三区视频在线观看 | 91日韩在线视频 | 韩国精品久久久 | 亚洲黄色免费电影 | 一级看片 | 欧美三级韩国三级日本三斤 | 毛片视频免费观看 | 国产成人欧美 | 亚洲无限看| 成人在线观看免费视频 | 免费一级黄色 | a点w片| 四虎在线视频免费观看 | 久久一级黄色片 | 欧美69久成人做爰视频 | 亚洲第9页| 成人在线三级 | 国产精品免费一区二区三区 | 欧洲自拍一区 | 美女扒开尿口给男人捅 | 麻豆精品在线视频 | 波多野结衣高清在线 | 樱桃成人精品视频在线播放 | 亚洲精品美女网站 | 玩弄人妻少妇500系列视频 | 91av精品 | 在线美女av| 久久久资源网 | 日韩三级在线免费观看 | 熟女俱乐部一区二区视频在线 | 蜜桃av色偷偷av老熟女 | 成人免费毛片入口 | 精品国产人妻一区二区三区 | 免费裸体视频网站 | 亚洲av电影天堂男人的天堂 | 国产理论视频在线观看 | 亚洲h网站 | 99久久久无码国产精品免费 | 日韩特级片 | 国产精品成人久久久久 | 国产1区2区在线观看 | 俺也去婷婷 | 丨国产丨调教丨91丨 | 成年人av网站 | 光明影院手机版在线观看免费 | 国产日产欧美一区二区三区 | 极品白嫩丰满少妇无套 | 国产精美视频 | 欧美一级一区二区三区 | 操女人的逼逼 | 亚洲免费视频网站 | 欧美在线观看视频一区二区 | 97精品人妻一区二区三区蜜桃 | 男女那个视频 | 精品久久久久久久久久久久久久久 | 国产毛片毛片毛片毛片毛片毛片 | 国模吧一区二区 | 久久大伊人 | 免费成年人视频 | 欧美麻豆 | 亚洲精品国产精品乱码不99热 | 亚洲资源在线 | 亚洲欧洲日本精品 | 国产青青草在线 | 成人看片泡妞 | 动漫一区二区三区 | 日日天天干 | 久久综合成人网 | 久久亚洲精精品中文字幕早川悠里 | 美女中文字幕 | 亚洲av无码国产精品久久 | 波多野结衣中文字幕一区 | 艳母免费在线观看 |