目前,游戏已经到了收尾阶段,为了配合公测,特意做了一个问卷调查模块,用于收集玩家对游戏的反馈。下面使我们的设计历程。
设计之初,我们曾经想过使用数据库保存,为了实现这个模块将增加配置库里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,否则是一个对象。
最后学到一点设计的问题,必须检查玩家提交的结果:验证题号和答案的合法性。