Re: [轉載] [蟑螂賀新年] 基礎 LPC 簡介+1~7章
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間17年前 (2009/03/06 14:07)推噓0(0推 0噓 0→)留言0則, 0人參與討論串2/2 (看更多)
各位 wiz 大多已有 80% 以上初階 LPC 的功力,spoke 翻譯的文章
裡頭講的東西各位就算原先不知它的來龍去脈,也幾乎都會用了。
這裡拿幾個需要特別提出來的地方來講。
LPC 是一種非常易於學習的程式語言
有心的話很快就可以學會它,通常如果摸超過五年,就會想把它
應用在現實生活中;摸超過十年,就會想說它能不能對工作有幫
助。會 asp 與簡易 c/vb/java1 的人上手特別快。
雖然一個物件裡面並沒有規定要從一個固定的地方開始執行程式, driver 卻要
先找到一個固定的地方並執行之, 才能初始化一個物件. 在精簡模式的 driver
上, 這是一個叫作 reset() 的函式. 在原始模式 mud 中, 則是 create().
這個是泛指大部份的情況,聖殿的物件通常會有個 create 函數
通常就是透過 create 函數去做初始的設定。
但這個並不是必要的,以聖殿為例,設定一個房間就像底下...
inherit ROOM;
void create()
{
::create();
set("short","一間房間");
}
但這樣的房間也可以用底下的東西來實現...
mapping data=(["short":"一間房間"]);
mapping query_ob_data() { return data; }
mixed query(label) { return _query(data,label);
因為一般的房間只要宣告 data 這個變數,並定義兩個方法給
它: query_ob_data 以及 query,就可以是房間了,因為這樣
的房間假設叫 ob,我們可以 ob->query_ob_data() ,也可以
ob->query(xxx) (大部份讀物件資料都是靠這樣子讀)
不過一般會建議若要採簡易寫法,最好還是..
inherit ROOM;
mapping data=([ 看要塞啥資料給它再塞 ]);
也就是繼承 room 會有的一些函數庫與變數,然後再自定變數
的資料給它,各位可以 more /std/ob/room.c 來看一個房間
大概定義了哪些基本的函數給它。
這裡延伸了一個概念。假設我們弄了一個房間出來,然後我們
不允許這個房間的資料(data變數)被修改,簡易的做法就是..
inherit ROOM;
mapping data=([ 看要塞啥資料給它再塞 ]);
void set(string label,mixed value) { }
void add(string label,mixed value) { }
void delete(string label,mixed value) { }
這樣對這個房間的 set、add、delete 等動作就會失效。
函式庫
通常一個系統包含幾個部份...
1)資料庫
2)函式庫
3)程式集
函數與程式集的差異通常只在 return 值的部份,例如說底
下的東西..
string query_ppl_name(object ppl)
{
return ppl->query("name");
}
這東西硬要去分它是函式庫的函數或是一個副程式沒啥意義
,用功能去區分,這函數是讀 ppl 的 name,只用來讀 ppl
的 name 而已也沒做啥,寫這東西出來是要給系統裡頭幾個
地方用的(例如很多地方都必須讀玩家的 name)..
那它就比較像函數,而其實所謂函數就是我們丟給它一個東
西,它會出現別的東西(例如 y = f(x), 丟 x 給 f, 它會給
我們 y)
副程式就類似底下..
void set_ppl_name(object ppl,string names)
{
ppl->set("name",names);
}
就是我們希望它做啥事,然後系統裡頭很多地方都需要做同
樣的事時,就可以把它獨立出來寫成副程式。
我最近會開始講家族系統,並且解開 /adm/group 的可讀權
限,大概就會講到類似的東西。
迴圈
使用 while 之類的迴圈語法時,要注意一件事,就是要設定
它的終止條件。沒有中止條件的迴圈就類似底下..
while(1)
{
...
}
因為 1 這東西代表的是 true,每迴一次它都判斷其為真,
一直為真,就一直迴圈。
迴圈中止條件一般有兩種常見設法..
while(在這裡設定中止條件)
或者
while()
{
在某個地方設定中止條件;
}
例如拿同一件事來說,要跑 1 + 2 + ... +100,寫法一是..
i=1; sum=0;
while(i++<100)
sum=sum+i;
寫法二是..
i=0; sum=0;
while(i++)
{
sum=sum+i;
if(i==100) break;
}
比較要注意的是,以上面的 i==100 break 為例,個人寫程式
多年,個人的經驗就是,寧願給它 range 較大的限制範圍,也
不要太執著於把程式寫的很精準。
例如我的寫法通常就是 if(i>=100) break;
這是為了以防萬一。另外寫在迴圈內的終止條件,如果是一個
大迴圈 or 多層式迴圈,終止條件也可以考慮給兩個以上。
而大部份 do {} 能做的事情 while 也能做,聖殿 do 用的比較
少。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.170.228.153
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
15
19