AI與遊戲——吃豆人(3)基本的路徑規劃演算法(上)
這次我們來講一下程式碼中涉及的一些路徑規劃演算法,在這個遊戲中,路徑規劃雖然不屬於人工智慧但是確實實現AI演算法不可或缺的基礎方法,下面就來大致介紹一下有哪些主要的方法以及這些方法的實現。
(1)getApproximateNextMoveTowardsTarget:這個實現的是得到是起始點到目標點的大致的運動,為什麼叫大致呢,因為這裡沒有考慮障礙物等因素。這個函式還可以用在A*演算法上(A*演算法後面會專門講)。程式碼如下:
public MOVE getApproximateNextMoveTowardsTarget(int fromNodeIndex, int toNodeIndex,
MOVE lastMoveMade, DM distanceMeasure) {
MOVE move = null ;
double minDistance = Integer.MAX_VALUE;
for (Entry<MOVE, Integer> entry : currentMaze.graph[fromNodeIndex].allNeighbourhoods.get(
lastMoveMade).entrySet()) {
double distance = getDistance(entry.getValue(), toNodeIndex, distanceMeasure);
if (distance < minDistance) {
minDistance = distance;
move = entry.getKey();
}
}
return move;
}
引數分別是:起始點,目標點,上一次運動方向,距離度量方法。這裡有個上一次運動方向作為引數,說實話,這個for迴圈的條件語句可以說是非常難搞懂,其實allNeighbourhoods這裡是一個MAP裡面又嵌套了一個MAP,準確的說是 < MOVE, < MOVE, index > > 這種形式,第一個MOVE是可到達fromNode的移動,第二個是fromNode可以執行的移動以及執行該移動所到達的點,但是不包括前一個MOVE。舉個例子,對於左上角座標(0,0)的點,可以到達的移動為從(0,1)向左,從(1,0)向上,或在(0,0)保持不動,所以第一個MOVE為left,up,neutral三個(由於neutral只有特定情況才執行所以後面就不再考慮),而對於left,left->< down, (1,0) >,所以當遍歷left的value的時候,就沒有right這個值,只有向下走,同理,up->< right, (0,1) >。這樣在選擇路徑時不用再考慮之前的移動。接著得到所有除了上一步的點之外其餘可以行走的點,然後求與目標點的歐氏距離,距離最小的那個對應的MOVE即為所選。
(2)getNextMoveTowardsTarget:這個跟之前的差不多,不同的是這個考慮的MOVE考慮之前一步的MOVE了,也就是說,對於fromNode,所有可行走的方向都用於計算距離。上一個主要用於魔鬼的到達目標路線規劃,這個一般使用者吃豆人的。
for (Entry<MOVE, Integer> entry : currentMaze.graph[fromNodeIndex].neighbourhood.entrySet())
這裡只給出不同的迴圈語句,可以看到從之前的allNeighbourhoods,變成了neighbourhood,後者是結構是< MOVE, INDEX >,為走法與可到達的點組成的MAP。
(3)getApproximateNextMoveAwayFromTarget:這個跟第一個也差不多,只不過之前求的是最小距離,這個求最大距離。
(4)getNextMoveAwayFromTarget:這個不解釋了,想想也知道不同之處了。。。
以上都是得到大致方向的方法,那麼有沒有得到準確路徑的方法呢,當然有,就先放到下一部分再說吧。
相關推薦
AI與遊戲——吃豆人(3)基本的路徑規劃演算法(上)
這次我們來講一下程式碼中涉及的一些路徑規劃演算法,在這個遊戲中,路徑規劃雖然不屬於人工智慧但是確實實現AI演算法不可或缺的基礎方法,下面就來大致介紹一下有哪些主要的方法以及這些方法的實現。 (1)getApproximateNextMoveTowardsTar
AI與遊戲——吃豆人(5)樹搜尋演算法(上)
查詢搜尋類演算法可以說是被提及最多的人工智慧方法,絕大多數AI問題都可以被看成一個搜尋查詢問題,也就是找到最好的方案,路徑,模型等。搜尋演算法因此也最常在一些AI演算法的核心部分看到,很多AI的書籍也都是從搜尋演算法開始的。 下面講的查詢演算法是樹搜尋演算法,
AI與遊戲——吃豆人(4)方法綜述
這一部分先提一下一些基本的目前廣泛用於遊戲中的AI演算法。這裡最好現有點機器學習相關知識,不然可能會不知所云。後面提到具體演算法我會盡量列出一些參考文獻,例子也繼續在吃豆人上面舉例。 目前主流方法主要有,專門的行為表達方法例如有限狀態機,行為樹,和一些基於單元
路徑規劃:PRM路徑規劃演算法(Probabilistic Roadmap 隨機路標圖)
global_planner: A*、Dijstra、prm、人工勢場、單元分解、快速搜尋樹(RRT)等 local_planner: eband_local_planner、asr_ftc_local_planner、dwa_local_planner、teb_loc
[原始碼和文件分享]基於C++的吃豆人小遊戲的設計與實現
一 遊戲介紹 遊戲的目的就是控制遊戲的主角小精靈吃掉藏在迷宮內所有的豆子,並且不能被幽靈抓到,總共有三個關卡。 二 系統設計 2.1 系統總體架構 系統總體架構如下表所示: 玩家 地圖 敵軍 方向控
幾乎毀掉谷歌吃豆人塗鴉遊戲的 bug
【伯樂線上導讀】:2010 年 5 月 21 日吃豆人遊戲 30 週年,Google 首頁在上午 9 點上線了一個可互動的塗鴉遊戲。幾個小時內,這個遊戲就讓全世界都為之瘋狂。不過塗鴉團隊開始陸續收到一個詭異 Bug 的報告。作者在本文中分享了這個 Bug 背後的有趣
簡單的遺傳演算法(Genetic algorithms)-吃豆人
遺傳演算法簡介: 一直都在收聽卓老闆聊科技這個節目,最近播出了一起人工智慧的節目,主要講的是由霍蘭提出的遺傳演算法,在目中詳細闡述了一個有趣的小實驗:吃豆人。 首先簡單介紹下遺傳演算法: 1:為了解決某個具體的問題,先隨機生成若干個解決問題的實體,每個實體
吃豆人部分程式碼分析
吃豆人的專案下載地址,某位大神做的,亮點是參考地圖生成的部分 http://game.ceeger.com/forum/read.php?tid=160 地圖用一個txt檔案,如下圖的檔案,x表示牆的部分,.表示可吃的豆豆, O表示一些特殊種類的豆豆 O........
吃豆人 記憶化BFS..
題意: 吃豆人是一款非常經典的遊戲,遊戲中玩家控制吃豆人在地圖上吃光所有豆子,並且避免被怪物抓住。 這道題沒有怪物,將遊戲的畫面分成n*m的格子,每
《吃豆人pacman》原始碼
使用Unity 2D製作經典遊戲《吃豆人》 http://forum.china.unity3d.com/thread-13546-1-1.html 原帖,我就是對著學了,開始學習Unity3D啦,第一個遊戲,完整複製。 步驟1: 首先建立一個2D遊戲介面,取名叫pac
【Linux】【Services】【IaaS】OpenStack-Pike(3.搭建高可用消息隊列)
mission 服務 guide lan nsis edit 錯誤 all scp 1. 簡介 1.1. 官方網站: https://www.rabbitmq.com/ 2. 安裝與配置: 詳見:https://docs.openstack.org/ha-guide/sha
資料結構——圖(3)——深度優先搜尋演算法(DFS)思想
圖的遍歷 圖由頂點及其邊組成,圖的遍歷主要分為兩種: 遍歷所有頂點 遍歷所有邊 我們只討論第一種情況,即不重複的列出所有的頂點,主要有兩種策略:深度優先搜尋(DFS),廣度優先搜尋(BFS) 為了使深度和廣度優先搜尋的實現演算法的機制更容易理解,假設提
基於Qt的OpenGL程式設計(3.x以上GLSL可程式設計管線版)---(十九)模板測試
(Vries的教程是我看過的最好的可程式設計管線OpenGL教程,沒有之一,其原地址如下,https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/ 關於模板測試的詳細知識瞭解
基於Qt的OpenGL程式設計(3.x以上GLSL可程式設計管線版)---(二十二)幀緩衝
Vries的教程是我看過的最好的可程式設計管線OpenGL教程,沒有之一,其原地址如下,https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/05%20Framebuffers/關於幀緩衝的詳細知識瞭解請看原教程,本
基於Qt的OpenGL程式設計(3.x以上GLSL可程式設計管線版)---(四)紋理
本篇目的是在Qt中學習使用QOpenGLTexture類繫結紋理,分別生成普通紋理,混合紋理與在shader中使用紋理單元。 (Vries的原教程地址如下,https://learnopengl-cn.github.io/01%20Getting%20started/06%
Python搭建簡易HTTP服務(3.x版本和2.x版本的)
原文轉載地址:http://www.cnblogs.com/91allan/p/4889167.html 廢話不多說,我們工作時經常會用到需要HTTP服務,如果不想搞那些複雜的Apache、IIS伺服器等,這時我們就可以用python幫我們搭建一個簡單的伺服器。操作如下: 1、下載並安裝一個python;
WCF簡單使用(分別部署在控制臺和IIS上)
啟動項 找到 utf col 調用服務 cti 圖片 pub console WCF部署到控制臺 1.下面通過一個簡單的服務示例來認識WCF1.新建項目,名稱IBLL,解決方案名稱WcfDemo,模板選擇類庫2.修改Class1.cs文件名稱為 IUserInfoSe
圖——基本的圖演算法(四)關鍵路徑
圖——基本的圖演算法(四)關鍵路徑 1. 基本概念 (1)AOV網(Activity On Vertex Network) AOV網是一個表示工程的有向圖中,其中的頂點用來表示活動,弧則用來表示活動之間的優先關係。舉個簡單的例子,假定起床後可以邊煮水,邊刷牙洗臉,但洗臉要在刷牙後
圖——基本的圖演算法(三)拓撲排序
圖——基本的圖演算法(三)拓撲排序 1. 基本概念 對於一個有向無環圖G = (V, E)來說,其拓撲排序就是G中所有頂點的一種線性排序,這種排序滿足如下條件:如果圖G中包含邊(a, b),即由頂點a指向頂點b的有向邊,那麼在G的拓撲排序中,頂點a一定處於頂點b前面(因此如果有向
圖——基本的圖演算法(二)圖的遍歷
圖——基本的圖演算法(二)圖的遍歷 1. 基本概念 圖的遍歷指的是從圖中的某個頂點出發訪問圖中其餘的頂點,且每個頂點只被訪問一次的這個過程。通常來說,圖的遍歷次序有兩種:深度優先遍歷(Depth first Search, DFS)和廣度優先遍歷(Breadth First Se