mud 板


LINE

看板 mud  RSS
假设某游戏有 100 个任务,那可以简单用一个字串来代表 "111111101110110100010101100100100001010001000......" 为此我们必须先定义一个 array 类似底下 string *quests=({ "与村里的人们打招呼", "猎杀20只怪物", . . }); 则上面字串的第一个字元"1"就代表玩家已完成「与村里的 人们打招呼」的这项任务(或成就)。 则我们需要几个函数来处理,底下就简单以 set_quest 为 例,ppl 代表玩家,quest_name 代表任务名称,quest 为 存在玩家 ppl 身上的标记(ppl->query("quest")) void set_quest(object ppl,string quest_name) { int i,s; string tmp,new_tmp; // 先依 quest_name 找出是第几个任务 i = member_array(quest_name,quests); if(i==-1) return 0; // 读取玩家身上的 quest 标记 tmp = ppl->query("quest"); // 1.先判断该字串的长度, 若长度较小要补 0 // 例如原先字串是 "1001" 而现在所解的是第 8 个任务 // 则 "1001" 要先变成 "10010000" s=strlen(tmp); if(s<i+1) while(s++<=i) tmp+="0"; // 2.再将这个任务标记设进去 if(tmp[i..i]=="0") new_tmp=tmp[0..i-1]+"1"; } 而 check 的方法也很简单 int check_quest(object ppl,string quest_name) { int i; string tmp; // 一样是先依 quest_name 找出是第几个任务 i = member_array(quest_name,quests); if(i == -1) return -1; // 然後一样读取玩家身上的 quest 标记 tmp = ppl->query("quest"); // 然後先判断玩家没解过这个任务的情况 // 首先字串长度小於 i+1 的情况肯定没解过 if(strlen(tmp)<i+1) return 0; // 再来就是 tmp[i..i] = 0 的情况也是没解过 if(tmp[i..i]=="0") return 0; // 能来到这里自然就是有解过啦 return 1; } 至於 list_quest 则如下.. void list_quest(object ppl) { string tmp,str="任务的已解/未解列表:\==============================\n"; int sp,sq,i; tmp=ppl->query("quest"); sp = strlen(tmp); sq = sizeof(quests); for(i=0;i<sq;i++) { if(i<=sp) { if(tmp[i..i]=="1") str+=sprintf("%-20s 已解\n",quests[i]); else str+=sprintf("%-20s 未解\n",quests[i]); } else str+=sprintf("%-20s 未解\n",quests[i]); } str+="==============================\n"); write(str); } 这麽做有以下几个好处.. 一、用一个字串就解决所有任务的标记。 二、字串长度 100 看似很长,不过跟玩家 data 档案大小比起来 其实还好。 三、wiz 可以制作方便的工具 foreach(ppl in users()) write(ppl->query("name")+" "+ppl->query("quest")+"\n"); 马上能列出线上玩家的 quest 字串,就能做即时的简易比对 ,如下.. laechan 1110010100101010101010101010 norr 11001010101010101000010010010001010 highelf 10001010100101001000101010 . ^ ^ ^ <- 这三人都有解过的任务 . 四、它一样可以做前置任务的判断 例如要解第 i 个任务,需要先解第 x 个任务跟第 y 个任务 ,那只需要判断 tmp[x..x]==1 && tmp[y..y]==1 即可,在前 置任务的判断上相当地简易。 一点心得,分享给各位。 Laechan --



※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 210.61.157.53 (06/14 16:17)
1F:推 eplis:强烈建议变数命名要有意义且初始化 06/14 16:58
2F:→ eplis:其实也可以用两个字串,一个代表解过一个未解过 06/14 16:59
3F:→ eplis:每个任务有唯一的qid,不是让开发者更容易辨识吗 06/14 16:59
4F:→ eplis:一堆1001010感觉不方便看是哪一个任务 06/14 17:00
5F:→ eplis:若是要用一个字串,我会建议用map之类的方式来做而不是array 06/14 17:02
这是以节省储存空间为考量,以这种方式要新增新的任务 也方便,quests 多添加一个元素,函数即会自动替玩家的 quest 参数初始化(在呼叫到 set_quest 时)。 基本原则是 1.每个任务的阵列顺序是确定的 2.但是每个任务的相对顺序是可以自订的 3.任务标记平常「其实一点用也没有就只是储存用而已」 ,因此只需要在用到时(例如在做 list 时)呼叫出来处 理即可. 就算是 111010101010101 只要呼叫专门处理函 数即可马上处理成为看得懂的资料. ※ 编辑: laechan 来自: 122.117.11.103 (06/14 18:29)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP