新的 map 指令 - 聖殿英雄傳說 MUD

Table of Contents

這東西我已經在 tmi2_v3_改 實裝,不過 sanc 使用的版本我打算
重新寫。新的 map 指令同樣只適用在新型態區域,這是趨勢。

這個指令的構想很簡單,玩家從未到過的區域,剛從入口進去時,
按 map 指令只會顯示比方如下

o-
|

假設該玩家向右移動了一格,按 map 指令時則會顯示如下

x-o-
|

也就是說,隨著玩家的不斷探索,看到的地圖才會越大,而且會不
斷紀錄玩家走過的點。

以一個有 2xx 個房間的地圖來說就代表有 2xx 個點,我依稀記得
的印象是我將 2xx 先除以 n,它就會分成很多段: 1~n、n+1~..,
然後有走過的點以 1 替代,沒走過的點以 0 替代。

然後去對像是這樣的東西做運算:

(11111111) = 255
2 10

也就是說 255 這個數字就代表 11111111 = 玩家這八格有走過,
而 10110011 = 這八格玩家有走過的有五格,沒走過的有三格。

這時候 10101110101010101111...........01010101
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 長度 2xx

就可以拆解為以下存起來

({201, 192, 303, ...... })
^^^^^^^^^^^^^^^^^^^^^^^^^^ 長度 < 2xx

因此重點是選取適當的 n 值。

還原的部份只要簡單寫個函數就能辦到:

varargs string a_to_b(int n,string tmp)
{
if(!tmp) { tmp=""; }
n>0 ? return a_to_b(n/2,""+(n%2)+tmp) : tmp;
}

> call here;a_to_b;63
房間(/u/l/laechan/workroom)-> a_to_b( 63 ) = "111111"

call here;a_to_b;200
房間(/u/l/laechan/workroom)-> a_to_b( 200 ) = "11001000"

b_to_a 函數也類似的寫法。


這個是 belldandy 提供的點子,下一次的月例大賽,會有跟這個
類似的東西出現。


LAechan

--

All Comments

Hedda avatarHedda2018-12-05
邊吃泡麵邊簡單打一下這篇