[wizs] 新的 map 指令

作者: laechan (揮淚斬馬雲)   2018-12-03 12:01:57
這東西我已經在 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

Links booklink

Contact Us: admin [ a t ] ucptt.com