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燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP