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