目前,遊戲已經到了收尾階段,爲了配合公測,特意做了一個問卷調查模塊,用於收集玩家對遊戲的反饋。下面使我們的設計歷程。
設計之初,我們曾經想過使用數據庫保存,爲了實現這個模塊將增加配置庫裏2-3個表,因爲考慮到這個模塊屬於不大重要的模塊(一次性使用),這樣做增加了數據庫的維護了成本,我們的遊戲的配置表已經很多了很多了。
於是我們使用文件來保存問卷調查的配置信息:
題目的類別: 1: 單選;2: 多選 3:問答
題號 => array(
'subject' => '問卷調查的題目',
'type' => '題目的類別',
'options' => array(
題號 . 序號 => '題目的答案',
),
),
如以下的格式:return array(
2 => array(
'subject' => '你覺得目前遊戲在美術方面存在哪些不足?(多選)',
'type' => 2,
'options' => array(
201 => '裝備道具貿易品等不夠華麗',
202 => '港口場景畫不夠寫實',
203 => '港口場景畫不夠寫實',
),
),
);
注意:題號和序號的必須聯合 ,這樣才能保證題目對應相應的答案,這是構造這個數組的特別需要注意的地方。
所有的玩家都能參加這次問卷,也就是說這個表不涉及到分庫的問題,於是我們在”全局庫“中建立一張表,每個用戶一條記錄,字段有id ,uid, result。result是用戶問卷調查的結果的序列化,使用json_encode序列化。
知識點:
1)獲取一個文件中的數組,使用include。
2) 構建一個合理的數組
3)問卷調查的設計思路
這次問卷調查的主要需求:
1)每個玩家只做一次問卷調查
2)只有問卷調查所有的題目做完才能提交
針對第一個需求,在提前之前檢測一下玩家是否已經提交。對於第2個問題,我們是這樣做的:使用一個json保存玩家的選擇 格式爲{題號:答案},最後統計這個json的長度,和問卷調查的總長度對比,就可以知道題目是否做完,最後,通過ajax把json對象傳到服務器,即可統計玩家的選擇了。
獲取單選題答案
$(".radio1").each(function () {
var questionId = $(this).attr('subject');
var answerId = $("input[type='radio']:checked", this).val();
if (answerId) {
result[questionId] = answerId;
}
});
知識點:
1) $.each() 和 $(‘').each()的區別
2)$(':checked')和$(":checked", this)的區別
3)需要驗證答案是否爲空,因爲即使獲取不到答案,也會追加到result中
4)動態構建json的方法。
5) $(this).find('')這個函數使用
獲取多選題答案:
// 獲取多選題答案
$(".checkbox2").each(function () {
var questionId = $(this).attr('subject');
var answerId = [];
// 循環讀取多個選擇項
$("input[type='checkbox']:checked", this).each(function () {
answerId.push($(this).val());
});
if (answerId.length -> 0) {
result[questionId] = answerId;
}
});
知識點:1)多選題多選,比單選題,多一次循環
2)判斷數組爲空的方法
獲取json的長度,沒有專門的函數,只能循環json
// 獲取json的長度
var j = 0;
for (var i in result) {
j++;
}
提交json到服務器,這裏讓我想到了,在URL中,可以直接把JS數組傳到服務器中,那可不可以把json對象直接傳入到URL中呢,最後測試不可以。於是想到了遍歷json,自己構建合法的URL,還有一個方法就是 使用jquery $_get() 第二個參數,把json直接傳入到服務器。
在做這個模塊的時候,還遇到一個知識點就是 使用json_decode()把json轉成數組,需要加入第二個參數並設置爲true,否則是一個對象。
最後學到一點設計的問題,必須檢查玩家提交的結果:驗證題號和答案的合法性。