mud_sanc 板


LINE

這東西我有想過怎麼做比較好,它大致有兩種做法 一、生成 m x n 格圖,然後依一定的規則隨機挖空 二、先生成一個點,然後採遞迴做法(設定邊界)讓它向外隨機擴散 若是第一種做法,「規則」雖是重點,但其實規則也沒那麼重要, 因為可以用 re-check 來確保點與點之間至少都存在兩個連結。 (不過這個 re-check 會寫得很複雜,所以還是回到確立規則上) 若是第二種做法,倒是不一定要用遞迴,比方讓它每一秒自我呼叫 一次時就擴散一次,這樣差不多就能達到要求,缺點是它很難避免 「中心點」的存在,而並非所有地圖都有中心點。 根據以上,初步結論看起來是採第一種做法。 但是上面兩種方法我都不想用。 ====== 假設以下格圖 以及我最終希望看到的格圖 x-x-x-x-x x-x-x x | | | | | | | x-x-x-x-x x-x x | | | | | | | x-x-x-x-x x-x-x x | | | | | | | x-x-x-x-x x-x-x-x 實際上依我先前規劃的各種隨機做法,都不可能產生右邊的格圖, 除非我制定一種規則叫做先決定起點與終點,然後再令它去爬,才 有可能,這東西看似複雜,其實它有簡單的做法: 比方起點是 (0,0) 終點是 (4,0) 這樣的設計,題目就變成這兩點 之間在邊界範圍 4, 3 之下可拉出多少條線的問題: starts=({0,0}); ends=({4,0}); // 首先決定下一點是往右還是往下 random(2)==1 ? nexts=({0+1,0}); : nexts=({0,0+1}); starts+=({nexts}); s=1; over_bound=0; // 然後就可以隨機了 while(starts[s]!=ends) // 實際上不會這樣子寫 { x=starts[s][0]-starts[s-1][0]; y=starts[s][1]-starts[s-1][1]; // 這裡只有一個規則: 不能走回頭路 if(random(2)==1) // 橫移 { if(x!=0) // 代表上次是橫移 { // 就只能往同方向再橫移 nexts=({starts[s][0]+x,starts[s][1]}); } else // 上次不是橫移, 那往哪個方向都可 nexts=({random(2)==1 ? starts[s][0]-1 : starts[s][0]+1,starts[s][1]}); } else // 直移 { if(y!=0) // 代表上次是直移 { // 就只能往同方向再直移 nexts=({starts[s][0],starts[s][1]+y}); } else // 上次不是直移, 那往哪個方向都可 nexts=({starts[s][0],random(2)==1 ? starts[s][1]-1 : starts[s][1]+1}); } // 先檢測 nexts 有沒有在 starts 內, 有的話就是重跑 if(member_array(nexts,starts)!=-1) continue; // 檢測 nexts 有沒有超過邊界 if(nexts[0]<0 || nexts[0]>4 || nexts[1]<0 || nexts[1]>3) { over_bound++; if(over_bound>10) // 保險值 break; // 中斷 continue; // 在保險值內就再一次 } // 都沒超過邊界就是安全的 starts+=({nexts}); s++; over_bound=0; // 繼續跑迴圈 } // 最後列出跑出來的 starts write(identify(starts)+"\n"); 以下是跑出來的幾次結果: ({ ({ 0, 0 }), ({ 1, 0 }), ({ 2, 0 }), ({ 3, 0 }), ({ 4, 0 }) }) 這個再明顯不過就是一直橫移過去 x-x-x-x-x ({ ({ 0, 0 }), ({ 0, 1 }), ({ 0, 2 }), ({ 1, 2 }), ({ 2, 2 }), ({ 3, 2 }), ({ 3, 1 }), ({ 3, 0 }), ({ 4, 0 }) }) x x-x | | x x | | x-x-x-x ({ ({ 0, 0 }), ({ 0, 1 }), ({ 0, 2 }), ({ 0, 3 }), ({ 1, 3 }), ({ 2, 3 }), ({ 3, 3 }), ({ 4, 3 }), ({ 4, 2 }), ({ 4, 1 }), ({ 4, 0 }) }) x x | | x x | | x x | | x-x-x-x-x ({ ({ 0, 0 }), ({ 1, 0 }), ({ 1, 1 }), ({ 0, 1 }), ({ 0, 2 }), ({ 0, 3 }), ({ 1, 3 }), ({ 1, 2 }), ({ 2, 2 }), ({ 3, 2 }), ({ 3, 3 }), ({ 4, 3 }), ({ 4, 2 }), ({ 4, 1 }), ({ 4, 0 }) }) x-x x | | x-x x | | <= 這張大致就是我們要的形式 x x-x-x x | | | | x-x x-x 上面打了一堆其實重點是: 一、單一路線型隨機地圖是可行的 二、過往我要自己產生 m x n 的圖後再自己挖洞,現在可以讓 程式幫我挖。 三、原本需要自己選出哪一張地圖較適合,現在可以用「產生出 幾%以上的點」來做為一種指標,例如以上面產生的那張圖 為例為 15點/總共20點 = 75%,15 點其實就像一張正常的 地圖了的意思。 這時甚至可以設定讓它跑出更多的點,例如以下是 17 點: ({ ({ 0, 0 }), ({ 1, 0 }), ({ 1, 1 }), ({ 0, 1 }), ({ 0, 2 }), ({ 0, 3 }), ({ 1, 3 }), ({ 2, 3 }), ({ 2, 2 }), ({ 2, 1 }), ({ 2, 0 }), ({ 3, 0 }), ({ 3, 1 }), ({ 3, 2 }), ({ 4, 2 }), ({ 4, 1 }), ({ 4, 0 }) }) x-x x-x x | | | | x-x x x x | | | | x x x-x | | x-x-x 以上只是先證明這構想是可 work 的,後面的回文都會以上面 為基礎繼續下一步的 write & run。 PS、這東西如果我不是先前持續在寫 code 以及最近清淡飲食 ,要寫出來有點難度。 Laechan --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.106.224
※ 文章網址: https://webptt.com/m.aspx?n=bbs/mud_sanc/M.1542444349.A.5C0.html
1F:→ laechan : 如果以上叫做隨機地圖第一工序,它其實就能應用在一 11/17 16:46
2F:→ laechan : 些地方,例如股票漲跌、颱風路徑的預測 11/17 16:46
3F:→ laechan : 也能用在如何找出a點到b點之間的最短路徑上 11/17 16:51
4F:→ laechan : 因為它其實是暴力破解法的一種做法 11/17 16:52
5F:→ laechan : 它是建立在從有限的範圍中找出非唯一符合我們所要的 11/17 16:53
6F:→ laechan : 結果的前提之上所建構的做法 11/17 16:53
※ 編輯: laechan (122.117.106.224), 11/17/2018 16:54:52







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燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP