mud_sanc 板


LINE

※ [本文轉錄自 mud 看板 #1R-xocVS ] 作者: laechan (揮淚斬馬雲) 看板: mud 標題: [閒聊] 隨機地圖產生器 時間: Mon Nov 26 17:28:02 2018 網頁好讀版:https://webptt.com/m.aspx?n=bbs/mud_sanc/M.1543224853.A.20C.html 以前曾寫過相關的東西: ┌───────────────────────────────────┐ │ 文章代碼(AID): #1EjMKNIx (mud) [ptt.cc] [閒聊] 區域產生器 │ │ 文章網址: https://webptt.com/m.aspx?n=bbs/mud/M.1320510743.A.4BB.html │ └───────────────────────────────────┘ 以上面的做法所產生的地圖,有個缺點,就是很難靠程式產生一條 明確的移動路徑(註: 並非指最短路徑)。 在大部份時候這其實沒什麼問題,但有視障玩家曾反映,在這樣的 地圖容易迷路。 因此直覺的想法就是,改成,先產生一條明確的移動路徑,再從這 條路徑上生出複數的分支,以此構成一張地圖,然後將移動路徑標 示在地圖指令上,視障玩家只需讀取移動路徑那一行,就能從地圖 的起點走到地圖的終點。 以下就說明做法。 首先,讓使用者先決定地圖的範圍,例如寬度 10,高度 10,則假 設地圖的最左上角座標是 (0, 0),那最右下角座標就是 (9, 9)。 (0, 0) ┌────┐ │ │ │ │ │ │ └────┘ (9, 9) 接下來假設將 (0, 0) 當成起點,然後做如下判斷: random(2)==1 ? nexts=({1,0}) : nexts=({0,1}); 它的意思就是說,從 (0, 0) 開始移動,50% 的機率往右走,50% 的機率往下走。假設是往右,那一開始的路徑就如下 x-x 假設是往下,那一開始的路徑就如下 x | x 接下來持續做以下的判斷: while(nexts!=ends) // 迴圈持續執行,直到抵達終點 { lasts=nexts; switch(random(4)) { // 往左或往右移動(y軸座標不變) case 0: nexts=({nexts[0]+1,nexts[1]}); break; case 1: nexts=({nexts[0]-1,nexts[1]}); break; // 往上或往下移動(x軸座標不變) case 2: nexts=({nexts[0],nexts[1]+1}); break; case 3: nexts=({nexts[0],nexts[1]+1}); break; } } 並且設計不走回頭路: // 如果移動點=上一座標點時,就重新跑新的點 if(lasts==nexts) { nexts=lasts; continue; } 我們以範圍 10 x 8 為例,展示某兩次的執行結果: █ ███████           █ █     █           █ █ █████           █ █ █               ███ █                   █                   █           ███     █           █ █ █████ ███       █ █ █     █ █       █ █ ███ ███ ███████ █ █   █ █         █ █ █   ███         ███ █                   █                   █ 移動路徑:2s e 2n 3e s 2w 3s 2w s e s e n e n e s 3e s e 3n e 4s ↑ 這一行就是給視障朋友看的 █                   █                   ███   ███             █   █ █             ███ █ █               █ █ █               ███ █████████                   █               █████               █                   █                   █               █████   ███         █       █ █         █████████ █ 移動路徑:s e s e s e 2n e 2s 4e s 2w 2s 2w s 4e n e s ↑ 這一行就是給視障朋友看的 我們並不是要找「最短路徑」,所以路徑有很多條;地圖範圍越 大,可產生出的路徑就越多,但相對的產生時間就會越久。 接著就以上面的圖為例,我們現在有了明確的起點與終點,也有 了明確的移動路徑(註: 並非指最短路徑)。 然後我們希望以這張圖為基礎,令它產生數條分支。分支的選擇 法我是採: 分支起點: 地圖邊界空白點 例如 (0, 7) 是空白的 分支終點: 地圖上隨機一個非空白點 例如 (3, 3) 不是空白 然後就可以重覆上面的迴圈判斷做法,以下是範例: 原地圖 產生第一條分支後的地圖 █                   █   ███   █         █                   █   █ █   █         ███   ███           ███ ███████           █   █ █             █   █ █             ███ █ █           ███████ █               █ █ █           █   █ █ █               ███ █████████   █ █████ █████████                   █   █ █     █       █             █████   ███     █   █████               █               █   █                   █               █ █ █                   █               █ █ █               █████   ███         █████   ███         █       █ █         █ █ █   █ █         █████████ █         █████████ █ 移動路徑:s e s e s e 2n e 2s 4e s 2w 2s 2w s 4e n e s ↑ 給視障朋友看的這一行是不會變的 這個意思就是說,雖然地圖上產生了一條分支,但視障朋友仍然 可以從原本的起點走原本的移動路徑來抵達原本的終點,走法是 一樣的,不管分支有幾條,都可以照原本的走法。 以下再 demo 第二條分支: 產生第一條分支後的地圖 產生第二條分支後的地圖 █   ███   █         █   ███   █         █   █ █   █         █   █ █   █         ███ ███████         ███ ███████           █   █ █             █   █ █           ███████ █           ███████ █           █   █ █ █           █   █ █ █           █ █████ █████████   █ █████ █████████   █ █     █       █   █ █     █       █   ███     █   █████   ███     █ █ █████           █   █         █     █ █ █ █ █           █ █ █       █████████████████           █ █ █       █   █   █ █ █               █████   ███ █ ███   █████   ███         █ █ █   █ █   █ █   █ █ █   █ █         █████████ █   ███   █████████ █ 移動路徑:s e s e s e 2n e 2s 4e s 2w 2s 2w s 4e n e s ↑ 給視障朋友看的這一行仍是不會變的 右邊那張圖,就很像是一般的區域地圖了。 以下是以 javascript 來寫的話,跑出來的樣子: https://i.imgur.com/auK92fK.jpg
這支程式我日後會將它放在我的網頁空間供所有人下載,對 sanc 來說,則是只需要 x-x 圖,就能透過 sanc 目前已存在的程式, 將 x-x 圖轉成區域所需要的所有房間,如下: 001 002-003 004 | | | | 005-006 007-008-009-010 | | | 011-012-013-014 015 | | | | 016 017-018-019 020-021-022-023-024 | | | | 025-026 027 028 029-030-031 | | | | | | 032-033-034-035-036-037-038-039-040 | | | | | 041 042-043 044-045-046 047-048 | | | | | | | 049-050 051-052-053-054-055 056 上面代表這是一張大小 10x8、擁有 56 個房間的區域。 以上一點分享,待續。 Laechan@Sanc --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.106.224
※ 文章網址: https://webptt.com/m.aspx?n=bbs/mud/M.1543224486.A.7DC.html ※ 編輯: laechan (122.117.106.224), 11/26/2018 17:29:04



※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: laechan (122.117.106.224), 11/26/2018 17:34:12
1F:→ laechan : 今天寫的很順利,我甚至沒看mud這邊的原始碼就寫了 11/26 17:35
2F:→ laechan : 明天繼續,至少要加兩顆按鈕,使這個東西變得更完美些 11/26 17:36
3F:→ laechan : 以下是隨便跑一張 30x25 的地圖例子 11/26 17:44
4F:→ laechan : https://i.imgur.com/tFqL0li.jpg 11/26 17:44
※ 編輯: laechan (122.117.106.224), 11/26/2018 17:45:15







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP