我只是在玩NetHack,因爲我正在爲自己編寫一個簡化版本。我的問題是,走廊是如何實施的?我幾天來一直在想辦法,不能拿出任何合理的東西。NetHack走廊實現
7
A
回答
7
Nethack中的地圖生成發生在mkmap.c中。方法join_map
確定哪些房間應該連接。在sp_lev.c中的方法dig_corridor
進行實際的挖掘。
行的興趣。
if (tx > xx) dx = 1;
else if (ty > yy) dy = 1;
else if (tx < xx) dx = -1;
else dy = -1;
這比「當前的X和Y」與「對象X與Y」確定,我們將首先在被挖掘的方向
while(xx != tx || yy != ty) {
/* loop: dig corridor at [xx,yy] and find new [xx,yy] */
if(cct++ > 500 || (nxcor && !rn2(35)))
return FALSE;
我們我們會繼續努力,直到達到目標爲止,但有一些例外:如果「走廊計數」cct
爲500,那麼我們已經挖掘了很長時間並想放棄。如果nxcor是真的,那麼走廊就可以走完了。 rn2
是一個隨機數字生成器,所以如果可能有死衚衕,那麼在每個循環中我們都會放棄一個小的機會。
crm = &levl[xx][yy];
if(crm->typ == btyp) {
if(ftyp != CORR || rn2(100)) {
crm->typ = ftyp;
if(nxcor && !rn2(50))
(void) mksobj_at(BOULDER, xx, yy, TRUE, FALSE);
} else {
crm->typ = SCORR;
}
crm是我們目前使用的瓷磚。大多數時候,我們把瓷磚變成一個普通的走廊。有時候,我們會將拼貼塊變成一個SCORR或祕密走廊,只有通過搜索才能找到該拼貼走廊。如果路徑可能是死路一條,我們也會放置巨石。
/* do we have to change direction ? */
if(dy && dix > diy) {
register int ddx = (xx > tx) ? -1 : 1;
crm = &levl[xx+ddx][yy];
if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) {
dx = ddx;
dy = 0;
continue;
}
} else if(dx && diy > dix) {
register int ddy = (yy > ty) ? -1 : 1;
crm = &levl[xx][yy+ddy];
if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) {
dy = ddy;
dx = 0;
continue;
}
}
如果當前位置與目標位置之間繪製的線的「斜率」是略微遠離45度,我們試圖改變方向;如果我們沿着X軸移動,那麼我們開始沿着Y軸移動;反之亦然。這導致了連接兩個對角房間的典型的彎曲的樓梯形走廊。如果改變方向會導致我們碰到障礙物(其他房間,熔岩等),那麼我們將繼續朝着我們前進的方向前進。
2
你可以檢查自己的來源! Link
我記得很久以前曾經經歷過一段時間的源代碼。內存有點生疏,但我認爲這是一個非常簡單的順序過程。房間裏的房間會按照一定比例的可用瓷磚來繪製,然後他們會生成走廊並掩蓋房間對着他們。我認爲他們有通過他們尋找無法進入的區域(使用洪水填充?)。
然後樓梯/門/等被填充。
你在找什麼是Maze generation algorithm。有噸。
相關問題
- 1. 用Google Maps繪製「走廊」
- 2. 走廊可用性測試
- 3. 走廊可用性測試:你實際做了多少UI?
- 4. OpenCV vs Matlab - 線/走廊檢測
- 5. 我需要riak跑走廊(單身)嗎?
- 6. 在走廊裏找到一顆星路徑
- 7. 如何從Node.js連接到nethack?
- 8. 如何在solaris 11.3上啓動nethack?
- 9. 如何實現元素走出邊界的平滑過渡?
- 10. 如何實現師帶圓走向無窮的Python
- 11. 什麼是一個畫廊最好的JavaScript實現?
- 12. 如何在iPhone/iPad上實現水平畫廊
- 13. 如何實現android的自定義設備照片畫廊?
- 14. 實現捏縮放在一個畫廊裏面的ImageView
- 15. 在頁面上實現多個photobox畫廊
- 16. 如何在Android中實現無盡的畫廊?
- 17. 自定義表格視圖以實現「畫廊」外觀
- 18. Bootstrap畫廊不會改變圖像後實施到現場
- 19. 如何在點擊下實現畫廊划動
- 20. 如何實現流體寬度,畫廊風格的等距divs?
- 21. 走走Dart_NewString':標識符建設飛鏢的SQLite沒有發現
- 22. 查找數據集中每個走廊的最大里程數參考
- 23. SQL - Informix的錯誤導致了另一個錯誤 - 鏡子的走廊PITA
- 24. C#MongoDB.Driver GetServer已經走了,現在呢?
- 25. 的Android Camera2 pcitures出現旋轉,畫廊
- 26. 圖片沒有出現在畫廊
- 27. 使imageview出現在畫廊上方
- 28. 走走activeSpreadsheet.getSheetByName()'改變動態
- 29. 走走拋出java.lang.ClassNotFoundException:org.springframework.beans.BeansException'起tomcat
- 30. 走走android.os.NetworkOnMainThreadException「同時的AsyncTask
感謝您找出代碼實際存在的位置!我想,但我被懶惰所抑制。 – MrLeap 2013-02-26 17:37:13