资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
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) 处理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编后语23MUD是一种网络游戏,是英文Multiple User Dimension、Multiple User Dungeon或Multiple User Dialoguede 缩写,可以翻译为多人世界,多人地下城或多人对话,我们俗称为“泥巴”。MUD的基本部分是运行于UNIX系统上,其实现编译语言就是将要介绍给您的LPC语言。其实,如果您已经对UNIX的一些基本指令有所了解的话,exp:ls,mkdir,rm,mv,cp等等,那么您应该知道如何进入一个mud中的文字编译环境,编一个小程序并存储它了。这里还需要说明一下,那就是lpc编译出的语言在结构上非常类似于我们所学的C语言编译程序,但是lpc与C语言还是有相当的差距的。总之,我想说明的意思就是关键是要掌握编程的核心,即编译原理,知道了原理和方法,程序指令是死的,只要多下工夫,是能够弄好弄精的。这里,我想通过初级篇和进阶篇的一些内容来向您说明LPC以及怎样运用这门语言,不过程序是要多实践的,光通过材料来学习还是不行的,多看看代码,多编些东西,多动手实践一下就会越来越熟悉它了。本教程选取的是Descartes of Borg于1993年编写的基础lpc和中级lpc教程的内容.在这些教材的基础上我做了一些改动,以供您更方便容易的学习LPC这门语言. 第一章: 编程环境基本介绍 1.1 UNIX 基本结构 Mudlib编程语言lpc 使用的是基本的 UNIX 命令及档案结构,因此我们有必要想了解一下UNIX方面的知识和相关内容.与我们常用的DOS系统一样, UNIX 也使用阶层式的目录结构. 所有的次目录都附属于根目录之下. 而每个次目录之下同样可以有更多的次目录. 一个目录可以有两种表示方法: 1) 用目录的全名 (full name), 或称作绝对名称 (absolute name). 2) 使用相对名称 (relative name).绝对名称就是从根目录一路写下来, 直到该目录的名字为止.exp:/daemon/skills/sword.c 就是根目录下daemon目录下的 skills目录下的sword.c程序.相对名称使用的是相对於其他目录的名字. 以上面的例子来说, 相对於/daemon,存在目录skills,不难得出,绝对目录是从根目录开始的,而相对目录则灵活的多,随便一个几极的子目录都可以成为确定另一个目录的相对根目录.这里还要确定一下,上述举例中的/daemon/skills/我们都称为路径,而sword.c就是我们所说的档案名。怎么样,和DOS差不多吧,其实树形目录结构是很多系统共同的部分。1.2 UNIX 基本命令LPmud使用许多UNIX的指令,比较典型的指令有:ls,cd,rm,mv,edit等等.这些指令对于我们维护和使用LPC的编程环境是非常有用的.这里先举一些常用的指令供您参考: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 进入编程模式的指令.从上面的初次接触中我们不难发现,无论是环境还是指令和我们常用的系统都是差不多的,原理是一样的。第二章: LPC 程序及其资料形态2.1 程序特点我们使用LPC编写程序的所写的内容可以统称为物件(objects).一般来说,我们运行一个程序的时候,是有开始和结束的.换句话说,就是所有的程序开始执行的时候,总有一个开头的地方和结束的地方,程序执行后就终止了.而LPC的程序不同,整个mudlib的driver系统运行的是我们用LPC编写出来的一个个程序,这些程序在不同的时间和情况下被不断的调用,虽然都是运行程序,但是LPC的程序在mudlib中是不存在绝对的触发点和结束点的。这一点需要我们注意。2.2程序的即时性本来整个mud游戏可以全部用C语言来写.这样游戏的执行速度将会快上很多, 然而这样却让mud缺乏可塑性,使巫师在游戏正在执行的时候无法即时加入新东西.DikuMUD就是全部用C语言写成的.而LPMUD的理论就是driver不该决定游戏内容,而游戏内容应该决定于游戏中的个别事物,并能够在游戏执行时加上东西.这就是为什麽LPMUD使用LPC程式语言.它能让你用LPC定义游戏内容,交给主运行系统根据需要读取并执行.当我们用LPC写了一个程序(假设是用正确的LPC),当你上传(send)成功后,一旦游戏中的东西参考它,他就会即时发生作用.这就是使用LPC语言做到的即时性编程效果.2.3 电脑是怎样认识程序的我们使用的任何一种编程语言,电脑都不能直接接受它,必须通过转化才行.电脑语言是由0与1组成的一系列排列有序的代码组成的.而我们所用的BASIC、C、C+、Pascal等等,这些电脑语言全都是过渡语言. 这些电脑语言让你能把想法组织起来, 让思考更易转换成电脑的 0 与 1 语言.而转换是通过我们常挂在嘴边所说的编译来实现的.不过对于不同类型的数据,电脑把他转化过来存储起来的时候将不是直接的0和1的形式,就是说,每一个LPC变量都有变量型态指导如何转换资料.比方说我们事先说明int x,就是说明x是一个整形的量值,通过对资料形态的说明,可以让电脑明白每组0,1系列的数据的明确意思. 2.4 LPC 的资料型态 LPMud driver具有以下的资料型态: void,status,int,string,object,int *,string *,object *,mixed *有一些资料型态是我们经常使用的,具有非常重要的作用: float,mapping float *,mapping *.现在我们所用的LPmud的driver一般都是MUDOS,其中的资料形态和上面所例举的差不多.第三章: 函数 (functions)3.1 什麽是函数? 同任何函数一样,LPC函数获得输入值,然后返回输出值.记得Pascal语言是把过程(procedure)和函数区分开来.LPC并不这样做,采用另外一种形式来区分.Pascal称为过程的东西,在LPC就是无返回值(void)型态的函数.也就是说,程序或无返回值函数不传回输出值.Pascal称为函数的东西,就是有传回输出值的.在LPC里,最短的正确函式是:void do_nothing(),这个函数不接受输入,没有任何指令,也不传回任何值. 要写出正确的 LPC 函数有三个部分: 1) 宣告 (declaration) 2) 定义 (definition) 3) 呼叫 (call) 就像变数一样, 函数也要宣告. 这样一来, 就可以让我们的driver知道: 1) 函数输出的资料是什麽型态 2) 有多少个输入的资料以及它们的型态为何. 比较普通的讲法称这些输入值为参数.所以,宣告一个函数的格式如下: 返回值型态 函数名称 (参数 1, 参数 2, ., 参数 N);这样是形式我们在很多编程语言中都遇见过,所以是不难理解和运用的.需要说明一点的是: 哪一个函数定义在前都没有关系. 这是因为函数并不是由前往后连续执行的. 函数只有被呼叫时才会执行. 唯一的要求是, 一个函数的宣告必须出现在函数的定义之前, 而且也必须在任何函数定义呼叫它之前.我们不妨举出write_vals() 和 add()两个函数的例子,仅供参考:/* 首先, 是函式宣告. 它们通常出现在物件码的开头. */ void write_vals(); int add(int x, int 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: this_player(), write(), say(), this_object().等等,这些看起来很像函数的式子其实就是外部函数.外部函数的价值在于它们比LPC函数要快得多, 因为它们是事先就以电脑可以直接读取和运行的二进制码的格式存在着.这些外部函数是早就被定义和宣告好的内容,需要时您只需要直接呼叫调用它们就可以了. 创造外部函数是为了处理普通的、每天都需要使用到的函数呼叫、处理 internet socket 的输出与输入、其他用LPC难以处理的事情的完成和实现.它们是在 driver 内以 C 写成的, 并与 driver 一起编译在 mud 开始之前, 这样它们执行起来会快得多. 但是对您来说, 外部函数呼叫就像对您的函数呼叫一样,它们还是需要知道两件重要的事: 1) 它的返回值是什么, 2) 它需要什么参数.外部函数的详细资料及其形态,可以在你的 mud 中的 /doc/efun 目录找到. 不过因为每种 d
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号