作者laechan (小太保)
看板mud_sanc
标题Re: [转载] [蟑螂贺新年] 基础 LPC 简介+1~7章
时间Fri Mar 6 14:07:25 2009
各位 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