LPC基础教程.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《LPC基础教程.doc》由会员分享,可在线阅读,更多相关《LPC基础教程.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、LPC基础教程作者:Larkin日期:2004-11-0123目 录第一章: 编程环境基本介绍1.1 UNIX 基本结构11.2 UNIX 基本命令1第二章: LPC 程序及其资料形态22.1 程序特点22.2程序的即时性22.3 电脑是怎样认识程序的32.4 LPC 的资料型态3第三章: 函数 (functions)33.1 什麽是函数?33.2 外部函数 (efuns)43.3 如何定义你自己的函数4第四章: 基础的继承44.1 从一个小程序开始44.2 物件导向程式设计(object oriented programming)54.3 继承的作用5第五章: 变数 (variable) 处
2、理55.1 数值与物件55.2 区域 (local) 和全域 (global) 变数65.3 处理变数的值65.4 复杂的运算式65.5 LPC 运算子7第六章: 流程控制 (flow control)96.1 LPC 流程控制叙述96.2if()106.3 while() 和 do while()126.4 for() 回圈126.5叙述: switch()136.6 改变函式的流程和流程控制叙述14第七章: 网络编程167.1 Socket模式 -167.2创建Socket -187.3 客户端/服务器模型 -197.4 绑定到一个端口 -207.5 安全 -217.6 监听连接 -22编
3、后语23MUD是一种网络游戏,是英文Multiple User Dimension、Multiple User Dungeon或Multiple User Dialoguede 缩写,可以翻译为多人世界,多人地下城或多人对话,我们俗称为“泥巴”。MUD的基本部分是运行于UNIX系统上,其实现编译语言就是将要介绍给您的LPC语言。其实,如果您已经对UNIX的一些基本指令有所了解的话,exp:ls,mkdir,rm,mv,cp等等,那么您应该知道如何进入一个mud中的文字编译环境,编一个小程序并存储它了。这里还需要说明一下,那就是lpc编译出的语言在结构上非常类似于我们所学的C语言编译程序,但是l
4、pc与C语言还是有相当的差距的。总之,我想说明的意思就是关键是要掌握编程的核心,即编译原理,知道了原理和方法,程序指令是死的,只要多下工夫,是能够弄好弄精的。这里,我想通过初级篇和进阶篇的一些内容来向您说明LPC以及怎样运用这门语言,不过程序是要多实践的,光通过材料来学习还是不行的,多看看代码,多编些东西,多动手实践一下就会越来越熟悉它了。本教程选取的是Descartes of Borg于1993年编写的基础lpc和中级lpc教程的内容.在这些教材的基础上我做了一些改动,以供您更方便容易的学习LPC这门语言. 第一章: 编程环境基本介绍 1.1 UNIX 基本结构 Mudlib编程语言lpc
5、使用的是基本的 UNIX 命令及档案结构,因此我们有必要想了解一下UNIX方面的知识和相关内容.与我们常用的DOS系统一样, UNIX 也使用阶层式的目录结构. 所有的次目录都附属于根目录之下. 而每个次目录之下同样可以有更多的次目录. 一个目录可以有两种表示方法: 1) 用目录的全名 (full name), 或称作绝对名称 (absolute name). 2) 使用相对名称 (relative name).绝对名称就是从根目录一路写下来, 直到该目录的名字为止.exp:/daemon/skills/sword.c 就是根目录下daemon目录下的 skills目录下的sword.c程序.
6、相对名称使用的是相对於其他目录的名字. 以上面的例子来说, 相对於/daemon,存在目录skills,不难得出,绝对目录是从根目录开始的,而相对目录则灵活的多,随便一个几极的子目录都可以成为确定另一个目录的相对根目录.这里还要确定一下,上述举例中的/daemon/skills/我们都称为路径,而sword.c就是我们所说的档案名。怎么样,和DOS差不多吧,其实树形目录结构是很多系统共同的部分。1.2 UNIX 基本命令LPmud使用许多UNIX的指令,比较典型的指令有:ls,cd,rm,mv,edit等等.这些指令对于我们维护和使用LPC的编程环境是非常有用的.这里先举一些常用的指令供您参考
7、:pwd 显示你目前所在的工作目录.cd 改变你目前的工作目录.ls 列出一个目录里面所有的档案.(相当于DOS中的dir)rm 删除指定的档案.(相当于DOS中的del)mv 更改指定档案的档案名.(相当于DOS中的rename)cp 拷贝一个档案到指定目录的命令.(相当于DOS中的copy)mkdir 建立一个新的目录.(相当于DOS中的md)rmdir 删除一个目录,不过该目录必须是空目录.(相当于DOS中的rd)more 如果一个程序太长了,使用这个指令可以分页显示该档案代码.(相当于DOS中的type|more)edit 进入编程模式的指令.从上面的初次接触中我们不难发现,无论是环境
8、还是指令和我们常用的系统都是差不多的,原理是一样的。第二章: LPC 程序及其资料形态2.1 程序特点我们使用LPC编写程序的所写的内容可以统称为物件(objects).一般来说,我们运行一个程序的时候,是有开始和结束的.换句话说,就是所有的程序开始执行的时候,总有一个开头的地方和结束的地方,程序执行后就终止了.而LPC的程序不同,整个mudlib的driver系统运行的是我们用LPC编写出来的一个个程序,这些程序在不同的时间和情况下被不断的调用,虽然都是运行程序,但是LPC的程序在mudlib中是不存在绝对的触发点和结束点的。这一点需要我们注意。2.2程序的即时性本来整个mud游戏可以全部用
9、C语言来写.这样游戏的执行速度将会快上很多, 然而这样却让mud缺乏可塑性,使巫师在游戏正在执行的时候无法即时加入新东西.DikuMUD就是全部用C语言写成的.而LPMUD的理论就是driver不该决定游戏内容,而游戏内容应该决定于游戏中的个别事物,并能够在游戏执行时加上东西.这就是为什麽LPMUD使用LPC程式语言.它能让你用LPC定义游戏内容,交给主运行系统根据需要读取并执行.当我们用LPC写了一个程序(假设是用正确的LPC),当你上传(send)成功后,一旦游戏中的东西参考它,他就会即时发生作用.这就是使用LPC语言做到的即时性编程效果.2.3 电脑是怎样认识程序的我们使用的任何一种编程
10、语言,电脑都不能直接接受它,必须通过转化才行.电脑语言是由0与1组成的一系列排列有序的代码组成的.而我们所用的BASIC、C、C+、Pascal等等,这些电脑语言全都是过渡语言. 这些电脑语言让你能把想法组织起来, 让思考更易转换成电脑的 0 与 1 语言.而转换是通过我们常挂在嘴边所说的编译来实现的.不过对于不同类型的数据,电脑把他转化过来存储起来的时候将不是直接的0和1的形式,就是说,每一个LPC变量都有变量型态指导如何转换资料.比方说我们事先说明int x,就是说明x是一个整形的量值,通过对资料形态的说明,可以让电脑明白每组0,1系列的数据的明确意思. 2.4 LPC 的资料型态 LPM
11、ud driver具有以下的资料型态: void,status,int,string,object,int *,string *,object *,mixed *有一些资料型态是我们经常使用的,具有非常重要的作用: float,mapping float *,mapping *.现在我们所用的LPmud的driver一般都是MUDOS,其中的资料形态和上面所例举的差不多.第三章: 函数 (functions)3.1 什麽是函数? 同任何函数一样,LPC函数获得输入值,然后返回输出值.记得Pascal语言是把过程(procedure)和函数区分开来.LPC并不这样做,采用另外一种形式来区分.Pa
12、scal称为过程的东西,在LPC就是无返回值(void)型态的函数.也就是说,程序或无返回值函数不传回输出值.Pascal称为函数的东西,就是有传回输出值的.在LPC里,最短的正确函式是:void do_nothing(),这个函数不接受输入,没有任何指令,也不传回任何值. 要写出正确的 LPC 函数有三个部分: 1) 宣告 (declaration) 2) 定义 (definition) 3) 呼叫 (call) 就像变数一样, 函数也要宣告. 这样一来, 就可以让我们的driver知道: 1) 函数输出的资料是什麽型态 2) 有多少个输入的资料以及它们的型态为何. 比较普通的讲法称这些输入
13、值为参数.所以,宣告一个函数的格式如下: 返回值型态 函数名称 (参数 1, 参数 2, ., 参数 N);这样是形式我们在很多编程语言中都遇见过,所以是不难理解和运用的.需要说明一点的是: 哪一个函数定义在前都没有关系. 这是因为函数并不是由前往后连续执行的. 函数只有被呼叫时才会执行. 唯一的要求是, 一个函数的宣告必须出现在函数的定义之前, 而且也必须在任何函数定义呼叫它之前.我们不妨举出write_vals() 和 add()两个函数的例子,仅供参考:/* 首先, 是函式宣告. 它们通常出现在物件码的开头. */ void write_vals(); int add(int x, in
14、t y); /* 接着是定义 write_vals() 函式. 我们假设这函式将会在物件以外被呼叫. */ void write_vals() int x; /* 现在我们指定 x 为呼叫 add() 的输出值. */ x = add(2, 2); write(x+n); /* 最後, 定义 add() */ int add(int x, int y) return (x + y); 3.2 外部函数 (efuns) 也许你已经听过有人提过外部函数.它们是外部定义的函数.外部函数是由mud driver所定义.如果您已经编写LPC程序代码很久, 那么实际上您已经接触到了很多函数,exp: th
15、is_player(), write(), say(), this_object().等等,这些看起来很像函数的式子其实就是外部函数.外部函数的价值在于它们比LPC函数要快得多, 因为它们是事先就以电脑可以直接读取和运行的二进制码的格式存在着.这些外部函数是早就被定义和宣告好的内容,需要时您只需要直接呼叫调用它们就可以了. 创造外部函数是为了处理普通的、每天都需要使用到的函数呼叫、处理 internet socket 的输出与输入、其他用LPC难以处理的事情的完成和实现.它们是在 driver 内以 C 写成的, 并与 driver 一起编译在 mud 开始之前, 这样它们执行起来会快得多.
16、但是对您来说, 外部函数呼叫就像对您的函数呼叫一样,它们还是需要知道两件重要的事: 1) 它的返回值是什么, 2) 它需要什么参数.外部函数的详细资料及其形态,可以在你的 mud 中的 /doc/efun 目录找到. 不过因为每种 driver 的外部函数都不相同,所以无法给出一个详细的类型表分类,不过,你可以通过man或help指令 (视 mudlib 而定) 找到详细的资料. 例如指令man write会给你 write 外部函式的详细资料.当然,more /doc/efun/write也可以. 3.3 如何定义你自己的函数虽然在档案中, 函数次序的先后是没有什么关系的, 但是定义一个函数
17、的程式代码的先后顺序却非常重要.当一个函数被呼叫时, 函数定义中的程式代码按照出现的先后顺序执行. 例如在4.1中的 write_vals() 中, 这个指令: x = add(2, 2);如果你想看到 write() 使用正确的 x 值, 就必须把它放在 write() 呼叫之前. 函数要返回一个值时, 由return指令之后跟着与函数相同资料型态的值来完成返回. 在先前的 add() 之中, 指令return (x+y);把 (x+y) 的值传回给write_vals()并指定给 x.也就是说return停止执行函数, 并返回程式代码执行的结果给呼叫此函数的另一个函数.另外,它将跟在它后面
18、任何式子的值传回呼叫的函数. 因此,要停止执行失去控制的无返回值函数, 使用 return就可以了; 而后面不应加上任何东西. 这里需要提醒您一点的是,使用return传回任何函数的资料型态必须与函数式本身的资料型态相符合,这是一一对应的关系.第四章: 基础的继承4.1 从一个小程序开始我们来看下面这个小程序,它实现的是一个房间:inherit ROOM; void create() set(short,日月园);set(long, 这是江南的工作室,其实就是一个盛开着各种花卉的小花园n);set(exits, ( down:/d/xyj/kezhan, north:/u/power/door
19、room, );setup(); 从这个简单的程序中,我们不难得出以下几点也存在几个问题:1) create() 是函数的定义.2) 它呼叫set()、set_exits(), 而这两个函数在这段程序代码中并没有宣告或定义. 3) 最上面有一行, 不是宣告变数或函式, 也不是函式定义 ! 问题: 1) 为什麽没有宣告 create() ? 2) 为什麽set() 、set_exits() 已经宣告并定义过可以直接使用了? 3) 程序最上面一句话究竟是什么意思,产生什么作用呢? 这就是本章将要介绍的基础的继承,下面我们开始.4.2 物件导向程式设计(object oriented program
20、ming)继承(inheritance)是定义真正物件导向程式设计的特性之一. 它让你创造通用的程式码, 能以多种用途用於许多不同的程式中.一个 mudlib 所作的,就是创造这些通用的档案(物件), 然后我们通过调用这些档案来帮助我们制造特定物件. 如果你必须把定义前面工作室全部所需要的程式码写出来,大概必须要写 1000 行程式码才能得到一个房间所有的功能.显然那是不切实际的. 再者,这种程式码与玩家和其他房间的互动性很差, 因为每一个创造者都写出自己的函式以作出一个房间的功能. 所以, 你可能使用 query_long() 写出房间的长叙述, 其他的巫师可能使用 long() . 这就是
21、 mudlib 彼此不相容最主要的原因, 因为它们使用不同的物件互动协定.因此OOP的出现克服了这些问题.前面的工作室中,inherit ROOM表示你已经继承了ROOM的函数ROOM拥有普通房间所需要的全部函式定义其中. 当你要制造一个特定的房间, 你拿这个房间档案中定义好的通用函式功能, 并加上你自己的函式create()就可以很轻松地制造一个独特的房间. 4.3 继承的作用例举上面这个房间的例子,inherit ROOM使你调用出了ROOM这个已经宣告好的函数,该函数包含了许多房间函数,如set()和set_exit()等等,正是基于这些函数都是实现宣告并定义好的,所以我们可以直接利用它
22、们来进行我们的代码编辑工作.在你的 creat() 函式里, 你呼叫那些函式来设定你房间一开始的值. 这些值让你的房间不同於别的房间, 却保留与记忆体中其他房间互动的能力. 由于mudlib之间还存在差异性,所以不同的mudlib就各有一套不同的标准函数供我们使用,例如F_SSERVE和SSERVE其实是同一个标准函数.因此在coding之前我们需要弄清楚我们所处的mudlib的环境以及提供的标准函数的一些具体情况再开始编程.第五章: 变数 (variable) 处理5.1 数值与物件基本上, mud 里头的物件都不一样的原因有两个: 1) 有的物件拥有不同的函式 2) 所有的物件都有不同的数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LPC 基础教程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内