升级 不用打怪只须发帖

技术与开发

读者 王风:我在某个论坛逛时,发现该论坛会员都有经验值之类的东西。我虽然泡论坛时间不算短,但平时很少注意这个,所以现在想知道,这个东西是怎么设计出来的呢?

小编:你说的是论坛的练级插件,用途类似于游戏的练级系统。获得经验的方式不是打怪,而是发帖,很有意思。

45-f14-1-1.jpg

论坛练级插件(插件下载地址:http://www.shudoo.com/bzsoft,本文以Discuz!论坛为例,适用于6.0以上的系统),是以论坛发帖数作为经验值的,所以先要获取用户的发帖数,然后将发帖数换算成经验值,计算出当前经验值所对应的等级以及达到下一等级所需要的经验值,最后将结果通过经验条显示出来,这样就完成了插件的制作。根据相似原理,我们还可以制作出在线时间升级插件等。

第一步 获取用户发帖数

因为是以发帖数作为经验值,所以我们必须先获得用户当前的发帖数,并将该发帖数用经验换算函数处理。打开论坛根目录下的viewthread.php页面,在该页代码“if($post['username']) {”前面输入以下代码:

$lev_fts=$post['posts'];//获得发帖数

$post['lev'] = dislev($lev_fts);//将发帖数发送到经验换算函数中

第二步 设计经验值转换功能

我们要把发帖数换算为经验值和对应的等级,这里我们的换算规则是1帖对应1点经验值,每级所需经验值为等级数乘以10。计算出该用户当前等级和距下一次升级所需要的经验值,并计算出对应的百分比用于制作经验值的图形效果。打开论坛inculde目录下的forum.func.php页面,在该页最后一行的“?>”前面输入代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

$lv_img_dir="./images/level";

$maxlv=100;//最高等级:100级

$lv=round((round($exp/2,0)-10)/10,0)+1;//计算用户当前等级

$lvNext=$lv+1;//下一等级

$exp1=$lvNext*10;//下一级所需经验值

$expNext=($exp1+10)*($lvNext/2);//下一级总经验值

$exp2=$exp1-($expNext-$exp);

$lvb=round($lv/$maxlv,2)*100;//等级的百分比

$expb=round($exp2/$exp1,2)*100;//距下一等级的经验值百分比

$expb1=round($exp/$expNext,2)*100;//总经验值的百分比

$levstr="〈p〉 当前等级: $lv / $maxlv 〈/p〉

〈div class=\"showlv\" 〉〈img src=\"$lv_img_dir/hong.gif\" width=\"$lvb%\" height=\"13\" /〉〈/div〉

〈p〉下一等级:$exp2 / $exp1〈/p〉

〈div class=\"showlv\" 〉〈img src=\"$lv_img_dir/hui.gif\" width=\"$expb%\" height=\"13\" /〉〈/div〉

〈p〉当前经验值: $exp / $expNext〈/p〉

〈div class=\"showlv\" 〉〈img src=\"$lv_img_dir/lv.gif\" width=\"$expb%\" height=\"13\" /〉〈/div〉";

return $levstr;

第三步 显示经验值效果图

最后我们需要将上一步换算好的经验值效果图显示出来,在论坛下的templates目录下找到default目录,然后打开viewthread.htm页面,在该页代码“〈p〉{eval showstars($post['stars']);}〈/p〉”后面加入以下代码:

〈p〉$post[lev]〈/p〉

在该目录下又找到模板css.htm(Discuz!6.0为css.htm,Discuz!6.1及以上版本是css_viewthread.htm),在该页面最后一行加入以下代码:

.showlv { border: 1px solid #000; width:140px; height:13px; padding: 0em; background: #FFF; margin-left:8px;margin-bottom:4px}

.showlv img {float:left;}

最后,在论坛的images目录中新建目录“level”,在目录“level”中放入插件所需要的图片(图片下载地址:http://www.shudoo.com/bzsoft)。

Discuz!6.0的论坛系统采用了缓存机制,如果在该论坛系统下实践,在修改页面完毕后需要到论坛后台更新缓存。

陈邓新:练级插件是一款很能挑起用户兴趣的插件,高等级的诱惑,会促使用户不断地发帖来获得经验值,这样不仅为论坛带来了丰富的内容,还能促进用户之间的竞争,提高论坛的活跃度。当然读者朋友们还可以改变经验值换算方式,以达到更好的练级效果,比如以用户在线时间、用户注册时间、用户对论坛的贡献度等换算经验值的方式来制作练级插件。

读者反馈

读者 朱可:看了上期的《红运当头,我中了论坛大奖》,我想请教小编,你们模仿设计的插件只能使少数人中奖,并不能调动起大家的积极性,我的设想是有几个人得大奖,而参与的人都有小奖,怎么改进这个插件?

小编:你可以在开奖的时候读取所有没有中奖的网友,然后利用SQL更新语句将小奖的金额加入到他们账户中即可。