[閒聊] 區域產生器
首先來一張簡單的 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
推
11/06 00:58, , 1F
11/06 00:58, 1F
→
11/06 01:00, , 2F
11/06 01:00, 2F
推
11/06 06:42, , 3F
11/06 06:42, 3F
→
11/06 07:50, , 4F
11/06 07:50, 4F
還沒寫,不過基本上要寫不難。
我想的 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)
推
11/06 23:12, , 5F
11/06 23:12, 5F
討論串 (同標題文章)
mud 近期熱門文章
PTT遊戲區 即時熱門文章