Re: [轉載] [蟑螂賀新年] 基礎 LPC 簡介+1~7章

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間17年前 (2009/03/06 14:07), 編輯推噓0(000)
留言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
文章代碼(AID): #19iBsVnl (mud_sanc)
文章代碼(AID): #19iBsVnl (mud_sanc)