mud 板


LINE

看板 mud  RSS
比方現在有某一測驗系統,執行時會出現底下畫面 本次測驗共 10 道題目,每題 10 分,總分 100 分。 --測驗開始,請按 ENTER 鍵繼續-- 01.請問 bla bla bla bla 1. 2. 3. 4. 請選擇: _ 02.請問 bla bla bla bla 1. 2. 3. 4. 請選擇: ======================================================== 那麼,原則上我們需要一個題庫腳本檔或是題庫資料庫,一個 題庫匯入系統,以及一個測驗系統。 腳本檔的型式可以類似底下.. 請問 bla bla bla bla** 選項一** 選項二** 選項三** 選項四## 讀進該檔後假設為 cont,先做 explode(cont,"##"),再對每 一子項做 tmps=explode(sub_cont,"**"),則.. tmps[0] = 題目 tmps[1..sizeof(tmps)-1] = 各選項 則要新增題庫時,只要透過編輯該檔的方式,再用題庫匯入系 統重新匯入即可。 題庫資料庫的意思,一般則是指該資料庫具有資料即時 keyin 的能力,而且通常會與題庫匯入系統寫在一起,這時就規劃資 料型態如下 mapping test_data= ([ "t01":(["q01":({"題目01的內容","選項1","選項2","選項3","選項4"}), "q02":({"題目01的內容","選項1","選項2","選項3","選項4"}), . . ]); 這時候 tmps = test_data["t01"]["q01"]; tmps[0] = 題目 tmps[1..sizeof(tmps)-1] = 各選項 然後撰寫一個 random_sort 函數來對 tmps 做亂數排序,但 是不動第 1 個(題目),這樣就能產生亂數順序的選項。 tmps=sort_array(tmps,"random_sort",this_object()); int random_sort(string a,string b) { if(a[0..0]==設定題目有特殊標頭) return -1; // 永遠傳回該值 return -1+random(2); // 其它情況就傳回亂數 } 測驗系統一般可以做底下的架構... // 程式進入點 void main(string str) { // 依玩家所給的 key 值(如 t01)讀取測驗資料 mapping test_data=讀取測驗資料[str]; // 這時 test_data 內容類似 ([ "q01":({...}), "q02":({...}), ...]) string* tmps=([]); int j; tmps=keys(test_data); // 這時 tmps 的內容類似 ({"q01","q02",...}) // 對題目做亂數排序 tmps=sort_array(tmps,"random_sort",this_object()); j=sizeof(tmps); write(sprintf("本次測驗共 %d 道題目,每題 %d 分,總分 100 分.\n\n"+ "--測驗開始,請按 ENTER 鍵繼續--",j,100/j)); input_to("test_start",0,test_data,tmps,j,0,str); return 1; } int test_start(string str,mapping test_data,mixed tmps,int j,int s) { string* tmps2=([]); string choose; int i,k; if(s>0) { // 代表玩家已開始答題, 做答題的相關偵測 // 例如 atoi(str) = 玩家選擇了該題的第幾個選項 } if(s>=j || str=="q") { write("測驗結束。\n"); return 1; } // 隨機選 choose=tmps[random(j)]; tmps2=test_data[choose]; tmps2=sort_array(tmps2,"random_sort",this_object()); str=sprintf("%2d.%s\n",s+1,tmps2[0]); k=sizeof(tmps2); for(i=1;i<k;i++) str+=sprintf(" %d.%s\n",i,tmps2[i]); write(str+"請選擇: "); // 將需回答的題目減少 tmps-=({choose}); // 循環 input,s+1 代表玩家已回答幾題 input_to("test_start",0,test_data,tmps,j,s+1,str); return 1; } 上面純粹不進行答案校正及回答儲存,只讓玩家答完 10 題 在 s>0 的判斷部份,主要看各家 mud 的做法,以聖殿來說 一般我會將它存在玩家的 temp_data 區,做為玩家本次上線 時答題的狀況,例如玩家每答一題: // 玩家在 choose 這一題上回答的是第 atoi(str) 個選項 this_player()->set_temp("testing/"+choose,atoi(str)); 最後講一下測驗系統的核心重點,其實是在於題庫的擴充及 維護上,需注意幾個地方.. 一、題庫需易於擴充。 二、需設計題庫的簡易搜尋功能。 三、盡可能以匯入的方式而非人工手動 key-in 的方式維護 題庫 四、最好採取分散式儲存架構,避免 題庫.o 檔日後單一檔 案過於肥大的問題(因為題目都是中英文字混雜長度長) 聖殿有打算在玩家進階職業時做該職業的相關測驗,題庫可 能幾十題,每次隨機抽10題,玩家需得到一定分數才能得到 進階的資格這類的。 那因為玩家日後多半會自行建立所有題庫及答案的索引,所 以從這點來出發,我們 wiz 也就盡量不要太用心去設計題目 及測驗系統,簡單、方便就好,因此重點就在於「易於擴充 及維護」,比方某年某月某日你突然又增加 10 個題目到題 庫中,玩家就得再更新它的題庫答案索引,我想玩家遲早會 發現「與其每次都得辛苦地這樣做,不如老老實實地專心回 答問題」。 Laechan --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.61.157.53
1F:推 kyoe :老老實實地專心做BOT無誤 1.163.12.224 01/21 16:39
2F:→ laechan :理論上選項只要改幾個字,就得重寫bot 210.61.157.53 01/21 17:20
3F:推 QQmother :kyoe沒gg 123.192.148.71 01/21 18:59







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

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

TOP