作者laechan (小太保)
看板mud
标题[闲聊] 区域产生器
时间Sun Nov 6 00:32:16 2011
首先来一张简单的 m x n 的地图(底下是 7x7)
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
| | | | | | |
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-x
| | | |
x-x-x-x-x x
| | | | |
x-x-x-x-x-x
| | |
x x-x-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
接着依这个地图产生出区域房间..
> ls
1 001.c 1 007.c 1 013.c 1 019.c 1 025.c 1 031.c 1 037.c
1 002.c 1 008.c 1 014.c 1 020.c 1 026.c 1 032.c 1 038.c
1 003.c 1 009.c 1 015.c 1 021.c 1 027.c 1 033.c 1 039.c
1 004.c 1 010.c 1 016.c 1 022.c 1 028.c 1 034.c
1 005.c 1 011.c 1 017.c 1 023.c 1 029.c 1 035.c
1 006.c 1 012.c 1 018.c 1 024.c 1 030.c 1 036.c
最後,确认产生的地图有没有错误
> runmap
> 地图产生完成...
│
对照区
│
口─口─口─口 口─口─口 │ 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
以上结果全部用程式产生。这麽做有几项好处..
一、节省制作区域的人工及时间
二、不需要向玩家徵地图稿
三、区域产生的同时地图也自动画好,不需手动画
四、不会产生地图矛盾情况(不应该重叠的两格却重叠在一起)
最大的好处是今天假设我用这程式产生一个区域叫「破魔洞窟」
,我在 11/06 日开放它,我可以在一周後的 11/13 号,再用程
式产生另一张地图→区域,把入口连结到这个新区域,名字一样
叫破魔洞窟,然後每个礼拜我就换一张新图,这就是一种专门对
付万年自走型机器人用的方法,起码它很难一个万年触发就可以
从 001 走到 039。
因为图片产生後还可以修改, 最终位置 039 不一定要在右下..
035 036-037-038-
039
↓
035 036-
039-038-037
改完图再产生区域就可(也就是还可任意变更001->039的走法)
适合的区域类型
一、类似 D2 ACT.1、ACT.2 里头跟洞窟、下水道有关的任务
二、类似仙剑奇侠传里头跟地下、洞窟有关的区域
三、类似 RO 里头跟转职有关,封闭型、画面单调的区域
四、类似神龙之谜里头蕾娜一行人要取得大破邪咒文所走的地下区域
五、想要经常变换路线图的区域
一点心得,跟大家做个分享。
Laechan@Sanc
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.253.164.97
1F:推 cholid:推推~真的超有心的 按个赞XD 是说房间叙述才是难点XD 11/06 00:58
2F:→ cholid:然後想的超辛苦的 说不定玩家也没在看XDD 11/06 01:00
3F:推 sephirx:所以全都是同一个叙述 这里是破魔洞窟 四周一片阴暗 明显. 11/06 06:42
4F:→ laechan:房间叙述有一个 solution, 只是我还没写 11/06 07:50
还没写,不过基本上要写不难。
我想的 solution 是「三段叙述生成法」,它的概念很简单..
string *desc1=([]),*desc2=([]),*desc3=([]);
desc1=({"这里是一个阴暗的洞窟,",
"这里看起来很阴暗,",
"洞窟里头非常的昏暗,",......});
desc2=({"洞窟内不时传来腥臭的味道,",
"洞窟内不时传来恐怖的气息,",
"洞窟内不时传来奇特的声响,",......});
desc3=({"四周的洞壁疑似留有人类与怪物打斗过的痕迹。",
"地面上偶尔还会踢到一些人类或是生物的残骸。",
"似乎前方存在着什麽危险的怪物正在虎视着你。",......});
void init()
{
if(!query("long"))
{
string str="",str2="";
int i,j;
str+=desc1[random(sizeof(desc1))];
取第一段讯息
str+=desc2[random(sizeof(desc2))];
取第二段讯息
str+=desc3[random(sizeof(desc3))];
取第三段讯息
j=strlen(str);
for(i=0;i<j;i=i+56) // 假设一行定为 56/2 = 28个中文字宽度
str2+=str[i..i+55]+"\n"; // 分行
str2+=str[i..j-1]+"\n";
/*
这时出来的讯息就类似底下
这里是一个阴暗的洞窟,洞窟内不时传来恐怖的气息,似乎前方
存在着什麽危险的怪物正在虎视着你。
*/
set("long",str2);
}
}
也就是说,该房间只有生物进入时(触发 init)才产生出 long,
而这个 long 会存在一段时间直到房间被 reset。
(也就是说这次出现的 long 跟下次的 long 会不一样)
这时候 desc1、desc2、desc3 储存的资料量越多,房间叙述就
可以越多样性,而且多个性质类似的洞窟还可以共用同一个资料
库。
※ 编辑: laechan 来自: 111.253.164.97 (11/06 08:14)
5F:推 fr373969:推 专业 11/06 23:12