mud_sanc 板


LINE

※ [本文转录自 mud 看板 #1R-xocVS ] 作者: laechan (挥泪斩马云) 看板: mud 标题: [闲聊] 随机地图产生器 时间: Mon Nov 26 17:28:02 2018 网页好读版:https://webptt.com/cn.aspx?n=bbs/mud_sanc/M.1543224853.A.20C.html 以前曾写过相关的东西: ┌───────────────────────────────────┐ │ 文章代码(AID): #1EjMKNIx (mud) [ptt.cc] [闲聊] 区域产生器 │ │ 文章网址: https://webptt.com/cn.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/cn.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