簡體   English   中英

Java 2d 游戲中的路徑查找?

[英]Path finding in a Java 2d Game?

本質上,它是我正在開發的一款 pacman 克隆游戲。 我有一個 Enemy class,以及這個 class 的 4 個實例,它們都代表游戲的 4 個幽靈。

所有的幽靈都在屏幕的隨機區域開始,然后他們必須朝着吃豆人角色前進。 當玩家控制 pacman 並移動它時,他們應該跟隨它並盡可能靠近他。

沒有迷宮/障礙物(還沒有),因此整個 map(400x400 像素)對它們都是開放的。

對於玩家和每個 Ghost,我可以檢索 X、Y、圖像寬度和高度屬性。 另外,我已經有一個碰撞檢測算法,所以不用擔心,只是鬼魂找到了吃豆人的路。

對於一個好的尋路算法,使用A*可能是一個好主意,然而,對於一個不需要復雜、高效或有效路徑搜索的簡單游戲,只需通過找出方向來讓角色朝着目標移動目標應該足夠了。

例如,讓角色移動的決定,在偽代碼中:

if (target is to the left of me):
    move(left);
else
    move(right);

if (target is above me):
    move(up);
else
    move(down);

是的,角色不會做出最有效的移動,但它會在游戲循環的每次迭代中越來越接近目標。

我也猜測 80 年代初期的街機游戲可能不會使用復雜的尋路算法。

如果你只有一個像素網格——一個 pacman 和 ghost 可以在上面自由移動的“大場”——那么最短路徑很簡單——ghost 和 pacman 之間的直線。

但是“最短路徑”總是意味着我們正在嘗試解決圖論問題。 (我假設了解圖、一些圖論、adj. 矩陣等!)

在上述情況下,將每個像素視為圖上的一個節點。 每個節點通過一條邊連接到它的鄰居,並且每條邊都具有相等的“權重”(移動到“上方”的節點並不比移動到“下方”的節點慢)。

所以你有這個:(“*”=節點,“-,/,\,|”=邊緣)

*-*-*
|\|/|
*-*-*  ... (etc)
|/|\|
*-*-* 

如果 Pacman 在中心,它可以很容易地移動到任何其他節點。

更接近現實的可能是這樣的:

*-*-*
| | |
*-*-*  ... (etc)
| | |
*-*-* 

現在,吃豆人不能對角移動。 從中心到右下角到 go 需要 2 個“躍點”而不是 1 個。

繼續前進:

*-*-*-*
| | | |
| | | |
| | | |
*-*-*-*
| | | |
*-*-*-*

現在,從中間節點到頂部節點到 go,需要 3 跳。 然而,向底部移動只需要 1 跳。

將任何游戲板設置轉換為圖形很容易。 每個“交叉點”都是一個節點。 兩個交點之間的路徑是一條邊,該路徑的長度是該邊的權重。

進入一個*。 通過構建圖(使用鄰接矩陣或節點列表),您可以使用 A* 算法找到最短路徑。 其他算法包括 Dijkstra 算法。 還有很多其他的,但首先你需要用圖表來描述你的問題。 然后玩弄如何將 go 從節點 A (pacman) 到節點 B (ghost)。

希望有幫助!

已經很久了,但是從 memory 開始,Pac-Man 中的幽靈在尋路方面並沒有做太多事情。 他們會做一個相當標准的隨機迷宮遍歷,直到他們“發現”你,這包括沿着走廊的軸線找到一條通向你的通暢路徑,然后他們會直接向你移動,直到你從他們的視線中消失,然后他們將恢復隨機模式。 在更高的級別上,吃豆人會在他身后留下一段時間的隱形痕跡,鬼會“聞到”並有時會跟隨。

當吃豆人啟動時,算法的唯一區別是,當他們發現你時,鬼魂會逃離你而不是向你移動。

因此,為了獲得真實的體驗,您可能根本不需要非常復雜的尋路算法。 如果你想花哨,當然可以實現A*。

直接走向你的敵人是一個開始,但是當你添加一個迷宮時,你會想要添加一些更智能的尋路功能,這樣你的幽靈就不會陷入彎道或死胡同。

以下教程是一個很棒的輕量級 A* 入門指南,帶有可下載的示例。

基於瓦片的地圖上的路徑查找

在吃豆人中,所有的幽靈都有不同的追逐算法

  • 眨眼->追逐。 通常會采取最短的路線到達您,並傾向於遵循。
  • 小指 -> 伏擊。 吃豆人傾向於采取更迂回的方式。 致命。 (pinky和blinky在選擇方向時往往會做出不同的選擇,經常把玩家困在角落里)
  • 漆黑->怪胎。 這家伙的行為很奇怪。 他在棋盤上相當隨意地移動,但有時在他靠近時會追逐。
  • 克萊德->白痴。 隨機移動。 威脅不大。

鬼魂的動作有一個有趣的模式:偶爾,它們會同時停止和停止對吃豆人的追求,並返回各自的迷宮角落,進入“分散模式”。

pacman dossier中有關於算法的完整描述

問候

紀堯姆

你可以開始看 A*(A 星)

這是一個鏈接到其他尋路算法的頁面

[edit] gah...大腦太慢了...忘記了這本書,它是 C 或 C++(我忘記了),但是您仍然可以獲得 ZD52387880E1EA22817A72D3759213 的概念。 它可能不是你最容易閱讀的,但總體來說還不錯。 面向游戲開發人員的 AI,作者:David M. Bourg、Glenn Seemann

我認為 go 是 pacman 每一步的最短路徑算法。 一個很好的實現是Dijkstra 的算法

總結一下:將迷宮可視化為具有頂點和邊的圖形。 每條邊都有一個等待(在你的情況下,所有邊都具有相同的權重)。 該算法通過將每個直接可達的邊向下移動一步來找到從源頂點到目標頂點的最短路徑。 然后在下一個頂點上你做同樣的事情並繼續做直到你到達目標。 到達的第一條路徑是最短路徑。 可以對該算法進行許多優化以加快速度,例如考慮 pacman 在其先前的 position 中的位置以及它移動的方向,以便您可以在算法中獲得一些啟發式。 我建議在每個動作中找到從每個幽靈到吃豆人的最短路徑,然后將幽靈朝那個方向移動。 最終距離會減少,你將能夠趕上吃豆人。

另一種啟發式方法,可用於查找 pacman 可到達的所有直接邊緣,並嘗試通過重影覆蓋盡可能多的這些頂點。 因此,我們沒有將 pacman 設置為目標頂點,而是將 pacman 立即可到達的頂點設置為目標,結果將是可用的幽靈將試圖掩蓋 pacman 的主要逃生路線並抓住他。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM