Mud 版 (精华区)

发信人: Baggio (傻瓜牌生活), 信区: Mud
标  题: 如何实现十大富翁,高手排名              xiha 
发信站: 哈工大紫丁香 (Tue May  4 20:33:58 1999), 转信

发信人: BitMan (一位人), 信区: Mud_Builder

标  题: [转载] 为你的Mud加上十大富翁,高手排名(1)      Ranma (转寄)

发信站: 深大荔园晨风站 (Sun Apr  5 19:18:47 1998), 转信

【 以下文字转载自 BitMan 的信箱 】

【 原文由 BitMan.bbs@bbs.net.tsinghua.edu.cn 所发表 】

发信人: sadsong (烛光泪影), 信区: Mud_Builder

标  题: 为你的Mud加上十大富翁,高手排名(1)

发信站: BBS 水木清华站 (Sun Nov 30 11:56:59 1997)

以下程序为我在1997.5.20日左右实现,当时的考虑是玩家能够在连线

进入世界时,根据所有最近的玩家情况,排名,显示玩家是当前第几大

高手,未进入排名则没有显示。在实现的时候,曾听说中科大的mud中已经

有了类似的实现,由于我无法进入科大的mud,所以一直不知道那里是怎么

的实现,我当时只是通过那里的巫师anna zhang了解到了一些模糊的情况。

由于无法搞到类似的源代码,只好另起炉灶,根据自己的想象发挥了,其中

的一些实现搞的很复杂,不代表典型的操作,其中的bug在运行了6个月后,

基本上没有了。

由于富翁的操作更复杂,其中包括一些玩家身上的钱的操作,

考虑到篇幅,仅把它做为例子,加入高手排名,所要的修改在最后说明。

所新加的 函数,公共宏定义如下:

在/include/login.h中加入以下定义

#define GAOSHOU                 "/maxim/gaoshoudata"

#define RICHMAN                 "/maxim/tenrichman"

用于存储玩家的数据:

/maxim/gaoshoudata和/maxim/tenrichman

//事先要有如下定义:保证是10行。

//例如:

xing 楚衣辞 封山剑派第十四代弟子 100000000

cloud 萧西楼 浣花剑派第零代掌门人 2235228

blackcat 圆猫 步玄派第八代弟子 1218859

morphi 小旋子 侠客岛第四代弟子 1044364

zhan 我逍遥 武当派第三代弟子 1028088

vict 东方 星宿派第二代弟子 994035

lucky 李寒川 步玄派第八代弟子 891859

yahou 妙妙 武当派第二代弟子 822832

wuman 阿霞 步玄派第八代弟子 637152

chic 叶秋白 茅山派第六代弟子 495935

//以下是/adm/daemons/tenrichmand.c定义了一些基本函数:

//tenrichmand.c

///////////////////////////////////////////////////////////////////////////

/////////1997.5.20 finished

//by maxim@nju_mud

//1997.12.1重新整理

///////////////////////////////////////////////////////////////////////////

//////#include <login.h>

private string *gaoshou_status;

private string gaoshou_id_min;

private string gaoshou_name_min;

private    int gaoshou_exp_min;

private    int gaoshou_number_min;

private string gaoshou_title_min;

void create()

{

seteuid(geteuid());

}

// This function returns the status of an uid.

int set_rich(mixed ob, int exp)

{

        string uid, gaoshou_id,gaoshou_name,gaoshou_title;

        string  now_id,now_name,now_title;

        string *gaoshoulist,gaoshoulist2;

        int i,j,gaoshou_exp,now_exp;

        if( userp(ob) ) uid = getuid(ob);

        else if(stringp(ob))    uid = ob;

        else 

        return 0;

                

        gaoshoulist = explode(read_file(RICHMAN), "\n");

//RICHMAN is the file to be read

//在/include/login.h中有定义。

//由于没有判断文件读错的代码,所以事先要保证

//文件的格式正确。

        gaoshou_status = allocate(sizeof(gaoshoulist));

        for(i=0; i<10; i++) {

                if( sscanf(gaoshoulist[i], "%s %s %s %d", gaoshou_id,gaosho

u_name,gaoshou_title,gaoshou_exp)!=4 ) continue;                gaoshou_sta

tus[i] = (string)gaoshou_id+" "+                                 (string)ga

oshou_name+" "+                                 (string)gaoshou_title+" "+

                                 (string)gaoshou_exp;

              }

        for(i=0; i<9; i++){

            for(j=0;j<9-i;j++){     

                if( gaoshou_status[j][0]=='#' 

                || sscanf(gaoshou_status[j], "%s %s %s %d", gaoshou_id,gaos

hou_name,gaoshou_title,gaoshou_exp)!=4 ) continue;                if( gaosh

ou_status[j+1][0]=='#'                 || sscanf(gaoshou_status[j+1], "%s %

s %s %d", now_id,now_name,now_title,now_exp)!=4 ) continue;                

if(gaoshou_exp < now_exp){                      gaoshou_status[j]=now_id+" 

"+now_name+" "+now_title+" "+(string)now_exp;                       gaoshou

_status[j+1]=gaoshou_id+" "+gaoshou_name+" "+gaoshou_title+" "+(string)gaos

hou_exp;                     }

               }

            }

        gaoshou_exp_min=3000000000000;

//最富的人的钱要少于这个数目

        sscanf(gaoshou_status[4], "%s %s %s %d", gaoshou_id,gaoshou_name,ga

oshou_title,gaoshou_exp) ;         gaoshou_exp_min=gaoshou_exp;

//取得关键码最小值的数据信息     

        for(i=0; i<10; i++) {

                if( sscanf(gaoshou_status[i], "%s %s %s %d", gaoshou_id,gao

shou_name,gaoshou_title,gaoshou_exp)!=4 ) continue;              if(gaoshou

_exp < gaoshou_exp_min){                    gaoshou_id_min=gaoshou_id;

                    gaoshou_number_min=i;

                    gaoshou_name_min=gaoshou_name;

                    gaoshou_title_min=gaoshou_title;

                    gaoshou_exp_min=gaoshou_exp;

                        }

              }

        for(i=0; i<10; i++) {

                if( sscanf(gaoshou_status[i], "%s %s %s %d", gaoshou_id,gao

shou_name,gaoshou_title,gaoshou_exp)!=4 ) continue;              if(uid == 

gaoshou_id){                    gaoshou_id_min=gaoshou_id;

                    gaoshou_number_min=i;

                    gaoshou_name_min=gaoshou_name;

                    gaoshou_title_min=gaoshou_title;

                    gaoshou_exp_min=gaoshou_exp;

                    break;

                        }

              }

        gaoshou_name=(string)ob->query("name");

        gaoshou_title=(string)ob->query("title");

//更新已经存在的人的数据,或者把最小值的人的数据替代

  if( (int)exp > (int)gaoshou_exp_min || uid == gaoshou_id) {

             gaoshou_status[gaoshou_number_min]= 

               uid+" "+gaoshou_name+" "+gaoshou_title+" "+ (string)exp;

//由于数据已经改变,此处是重新排序

        for(i=0; i<9; i++){

            for(j=0;j<9-i;j++){     

                if( gaoshou_status[j][0]=='#' 

                || sscanf(gaoshou_status[j], "%s %s %s %d", gaoshou_id,gaos

hou_name,gaoshou_title,gaoshou_exp)!=4 ) continue;                if( gaosh

ou_status[j+1][0]=='#'                 || sscanf(gaoshou_status[j+1], "%s %

s %s %d", now_id,now_name,now_title,now_exp)!=4 ) continue;                

if(gaoshou_exp < now_exp){                      gaoshou_status[j]=now_id+" 

"+now_name+" "+now_title+" "+(string)now_exp;                       gaoshou

_status[j+1]=gaoshou_id+" "+gaoshou_name+" "+gaoshou_title+" "+(string)gaos

hou_exp;                      

                    }

               }

            }

//以下为写文件

        for(gaoshoulist2 = "", i=0; i<10; i++){

                if( gaoshou_status[i][0]=='#' 

                || sscanf(gaoshou_status[i], "%s %s %s %d", gaoshou_id,gaos

hou_name,gaoshou_title,gaoshou_exp)!=4 ) continue;

               gaoshoulist2+= gaoshou_id+" "+gaoshou_name+" "+gaoshou_title

+" "+(string)gaoshou_exp+"\n";                     }

        rm(RICHMAN);

        write_file(RICHMAN, gaoshoulist2);

//记录更新信息

        log_file( "static/tenrich", capitalize(uid)

         + " become 十大富翁之一: " + exp + " on " + ctime(time()) + "\n" )

;

//准备返回此玩家最新排名值

        for(i=0; i<10; i++) {

                if( sscanf(gaoshou_status[i], "%s %s %s %d", gaoshou_id,gao

shou_name,gaoshou_title,gaoshou_exp)!=4 ) continue;              if(uid == 

gaoshou_id){                         break;

                        }

              }

        return (i+1);

      }

  else return 0;

       

}

//以下是/adm/daemons/logind.c的改动,保证玩家能够在登录是

//了解到自己是否加入排名

//在此文件enter_world函数定义中

        CHANNEL_D->do_channel( this_object(), "sys",

                sprintf("%s由%s连线进入。", user->name(), query_ip_name(use

r)) );//的前面加入以下代码:

//其中所用到的变量定义是:

//

        int paiming;

        paiming=0;

            if(!wizardp(user) && (paiming=(int)RICHMAN_D->set_rich(user, ho

wmuch_money(user)) )){             if(paiming<=10)

                  tell_object(user,HIY"你名列最近天下富翁排行榜第"+chinese_

number(paiming)+"!\n"NOR);             }

//以下是/adm/daemons/logind.c中

//howmuch_money函数的定义

///////////////////////////////////////////////////////////////////////////

/////////1997.5.20 finished

//by maxim@nju_mud

//1997.12.1重新整理

///////////////////////////////////////////////////////////////////////////

//////int howmuch_money(object ob)

{

        int total;

        int total2;

        object gold, silver, coin;

        total = 0;

        total2 = 0;

        gold = present("gold_money",ob);

        silver = present("silver_money",ob);

        coin = present("coin_money",ob);

        if( gold ) total += gold->value();

        if( silver ) total += silver->value();

        if( coin ) total += coin->value();

        total2 = (int)ob->query("balance");

        if (!total2 || total2 < 0) {

                ob->set("balance", 0);

                      }

        total=total+total2;

        return total;

}

 //如果要加入十大高手,四大恶人的排名,或者其他功夫的排名

//可以

          if(!wizardp(user) && (paiming=(int)GAOSHOU_D->set_gaoshou(user, (

int)user->query("combat_exp")) )){               tell_object(user,HIW"你名列

最近名动江湖的第"+chinese_number(paiming)+"大高手!\n"NOR);

 //其它就类似了

 //还可以做成一本书:通过读文件

//来显示排名情况

//玩家可以随时买到最新排名情况

//如果有什么问题,请和nju bbs里的maxim jiang,或sad song联系

//如果加上了别忘了通知我,我也去参观参观偶.

烛光泪影

sad song

--

※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: a205mgq.nj

u.edu]--

※ 转载:.深大荔园晨风站 bbs.szu.edu.cn.[FROM: 202.192.140.221]--

※ 转寄:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 172.18.32.20]


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@fengyun.hit.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:206.660毫秒