Project1

标题: 请教关于脚本读取文本里的数据 [打印本页]

作者: 上贺茂润    时间: 2013-5-25 11:23
标题: 请教关于脚本读取文本里的数据
基于一个问答系统,也就是NPC提出问题,显示选项,玩家选择,对错和对话,每个问题包涵以下几个部分:

1-问题
2-选项
3-答案

对错可以用分歧来写
这样的话就能在TXT或者Excel里用表格的形式批量录入题目了,请教如何利用脚本获取这些数据?
作者: 八云紫    时间: 2013-5-25 15:09
本帖最后由 八云紫 于 2013-5-25 15:13 编辑

最好的办法就是自定义一个格式, 比如说

问题||答案||选项1||选项2||选项3..........

脚本读取的话, 大致模板:
  1. subject = [];
  2. File.open(保存题目的TXT文件名, "r") do |fp|
  3.   subject = fp.readline;
  4. end
复制代码
然后拆掉格式, 也就是上面说的:
  1. subject.each_index do |index|
  2.   subject[index] = subject[index].split("||");
  3. end
复制代码
这样题目1的问题就是 subject[0][0], 答案是 subject[0][1],  选项是 subject[0][2] 类推.

感觉写的很乱. 不过现在没有 VX , 所以无法写比较系统点的脚本. 谅解.
作者: 上贺茂润    时间: 2013-5-25 18:46
八云紫 发表于 2013-5-25 15:09
最好的办法就是自定义一个格式, 比如说

问题||答案||选项1||选项2||选项3..........

大体上明白了,但是运行还有难度,团长五百高寿,能做一个问1+1=?,选项1和2的小饭粒吗?
作者: 八云紫    时间: 2013-5-25 23:46
上贺茂润 发表于 2013-5-25 18:46
大体上明白了,但是运行还有难度,团长五百高寿,能做一个问1+1=?,选项1和2的小饭粒吗?  ...

抱歉, Vx 早已丢进回收站了.
作者: 上贺茂润    时间: 2013-5-26 01:09
八云紫 发表于 2013-5-25 23:46
抱歉, Vx 早已丢进回收站了.

555
作者: 八云紫    时间: 2013-5-26 14:43
本帖最后由 八云紫 于 2013-5-26 16:37 编辑

只是一个例子, 这不是完整的脚本

Subject_Text.rar

355.39 KB, 下载次数: 122


作者: 怪蜀黍    时间: 2013-5-26 16:25
八云紫 发表于 2013-5-26 14:43
只是一个例子, 这不是完整的脚本

直接和下方的小朋友对话,出现:

假如我选择第三个答案后确定,又会重复出现这题。
也就是说,只能不断重复这题,不能进行到下一题。
作者: 八云紫    时间: 2013-5-26 16:38
protosssonny 发表于 2013-5-26 16:25
直接和下方的小朋友对话,出现:

假如我选择第三个答案后确定,又会重复出现这题。

已修复. 范例也微微的改进了那么一点点点带你.....

范例更新在楼上的楼上
作者: 上贺茂润    时间: 2013-5-27 23:41
八云紫 发表于 2013-5-26 16:38
已修复. 范例也微微的改进了那么一点点点带你.....

范例更新在楼上的楼上 ...


运行您的脚本时不时会弹出这个,而且这个问题我经常遇到,诚心请教您作何解?
作者: 铃仙·优昙华院·因幡    时间: 2013-5-28 00:26
上贺茂润 发表于 2013-5-27 23:41
运行您的脚本时不时会弹出这个,而且这个问题我经常遇到,诚心请教您作何解? ...

这个脚本只是演示, 不能当做正式的脚本来使用, 很多细节咱都没有处理好, 这里只能说抱歉.

这个错误的原因是, 需要获取数组的元素长度的时候, 给脚本传递的是一个 空数字(nil) , 所以就找不到这个方法, 所以出错了.
作者: 上贺茂润    时间: 2013-5-28 10:47
铃仙·优昙华院·因幡 发表于 2013-5-28 00:26
这个脚本只是演示, 不能当做正式的脚本来使用, 很多细节咱都没有处理好, 这里只能说抱歉.

这个错误的原 ...

传递了一个空的数值?为什么会发生这种情况呢?按脚本的顺序来说读取data数组里的数据都是有具体数值的,不应该会出现空的才对呀……如果是这样的话应该如何避免呢?
作者: 上贺茂润    时间: 2013-5-28 11:41
八云紫 发表于 2013-5-26 16:38
已修复. 范例也微微的改进了那么一点点点带你.....

范例更新在楼上的楼上 ...
  1. class Scene_Subject < Scene_Base
  2.   
  3.   def initialize(subject_index)
  4.     @subject = [];
  5.     @index_subject = 0;
  6.     File.open("Subject#{subject_index}.txt","r") do |fp|
  7.       @subject = fp.readlines;
  8.     end
  9.     @subject.each_index do |index|
  10.       @subject[index].chomp!
  11.       @subject[index] = @subject[index].split("||");
  12.     end
  13.     @max_index        = @subject.size;          # 题目最大数量
  14.     @type             = 0;                      # 抽题类型
  15.     @answer           = [];                     # 答题卡
  16.     @title_index      = [];                     # 剩下的题目序号
  17.     for i in 0..@max_index
  18.       @title_index << i;
  19.     end
  20.     @subject_subindex = rand( @subject.size);                     # 题号
  21.   end
  22.   
复制代码
我在您的原有的脚本基础上添加了随机选题的功能,但是发现运行混乱,题目对错乱分:
最后那个题号的部分是产生随机数,请问是不是要在另一个地方也设置这个@subject.size,现在的情况是对错混乱。
作者: 铃仙·优昙华院·因幡    时间: 2013-5-28 13:54
上贺茂润 发表于 2013-5-28 11:41
我在您的原有的脚本基础上添加了随机选题的功能,但是发现运行混乱,题目对错乱分:
最后那个题号的部分 ...

其实随机就好的办法是这样的:


  1. # 类似题库的作用
  2. @subjects = [];
  3. # 初始化题库
  4. for i  in  [email protected]
  5.   @subjects << i;
  6. end

  7. # 题库里随机一个题目出来
  8. index = rand(@subjects.size);
  9. # 为了防止重复取一道题, 所以把取得的题目从题库里删掉
  10. @subjects.delete_at(index);

复制代码
这样就很好的可以复制重复选择, 还有胡乱选择了.
作者: 上贺茂润    时间: 2013-5-28 21:49
铃仙·优昙华院·因幡 发表于 2013-5-28 13:54
其实随机就好的办法是这样的:这样就很好的可以复制重复选择, 还有胡乱选择了. ...

如果按这样运行的话原来的脚本应该修改哪些? 润的脚本转型能力太弱……
  1. #==============================================================================
  2. # ■ Scene_Subject
  3. #------------------------------------------------------------------------------
  4. #  考试类。
  5. #==============================================================================

  6. class Scene_Subject < Scene_Base
  7.   
  8.   def initialize(subject_index)
  9.     @subject = [];
  10.     @index_subject = 0;
  11.     File.open("Subject#{subject_index}.txt","r") do |fp|
  12.       @subject = fp.readlines;
  13.     end
  14.     @subject.each_index do |index|
  15.       
  16.       @subject[index].chomp!
  17.       @subject[index] = @subject[index].split("||");
  18.     end
  19.     @max_index        = @subject.size;          # 题目最大数量
  20.     @type             = 0;                      # 抽题类型
  21.     @answer           = [];                     # 答题卡
  22.     @title_index      = [];                     # 剩下的题目序号
  23.     for i in 0..@max_index
  24.       @title_index << i;
  25.     end
  26.    @subject_subindex = -1;                 # 题号
  27.   end
  28.     #--------------------------------------------------------------------------
  29.   # ● 开始处理
  30.   #    Subject_index  : 考题库
  31.   #    type           : 抽题类型, 0 按顺序, 1 随机
  32.   #--------------------------------------------------------------------------
  33.   def start
  34.     create_menu_background
  35.     next_subject
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 更新
  39.   #--------------------------------------------------------------------------
  40.   def update
  41.     super
  42.     update_menu_background
  43.     update_subject_window
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 更新考卷
  47.   #--------------------------------------------------------------------------
  48.   def update_subject_window
  49.     @subject_window.update
  50.     if Input.trigger?(Input::C)
  51.       @answer.pushAnswer(@subject_subindex, @subject_window.index); # 填写答题卡, [题目序号, 答案]
  52.       next_subject;   # 下一题
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 计算得分
  57.   #--------------------------------------------------------------------------
  58.   def hand_paper
  59.     code = 0;                            # 分数
  60.     @answer.each do |answers|
  61.       right_answer = @subject[answers[0]][1];
  62.       code += 1 if right_answer.to_i == answers[1] + 1;
  63.     end
  64.     $game_player.result = code == @answer.size ? 100.0 : code.to_f / @answer.size * 100
  65.     $scene = Scene_Map.new
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 结束处理
  69.   #--------------------------------------------------------------------------
  70.   def terminate
  71.     super
  72.     dispose_menu_background
  73.     @subject_window.dispose;
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # ● 下一题
  77.   #--------------------------------------------------------------------------
  78.   def next_subject
  79.     @index_subject += 1;
  80.     if @index_subject < 2
  81.       case @type
  82.       when 0
  83.         @subject_subindex += 1;  
  84.       end
  85.       @subject_window.dispose if @subject_window;
  86.       @subject_window = Window_Subject.new(@subject[@subject_subindex]);
  87.     else
  88.       hand_paper
  89.     end
  90.   end
  91. end
复制代码

作者: 铃仙·优昙华院·因幡    时间: 2013-5-28 22:28
本帖最后由 铃仙·优昙华院·因幡 于 2013-5-28 22:52 编辑
  1. case @type
  2.       when 0
  3.         @subject_subindex += 1;  
  4.       end
复制代码
这里添加 when 1 什么的 随机取得 @subject_subindex 的值就好


其实一开始写这个脚本的时候有添加过随机选题, 不过由于很懒, 外加某播放器的问题就坑掉了. >_<

作者: 上贺茂润    时间: 2013-5-29 11:54
本帖最后由 上贺茂润 于 2013-5-29 11:56 编辑
铃仙·优昙华院·因幡 发表于 2013-5-28 22:28
这里添加 when 1 什么的 随机取得 @subject_subindex 的值就好


发生了返回空值错误 我对这个问答系统真的是……无力了……我还是尝试别看看……
作者: 铃仙·优昙华院·因幡    时间: 2013-5-29 12:00
上贺茂润 发表于 2013-5-29 11:54
发生了返回空值错误  我对这个问答系统真的是……无力了……我还是尝试别看看…… ...

其实咱的脚本只是一个不完全的例子, 提供一个思路罢了.

如果真的要写一个完整的话, 可以参考咱的写法, 自己重新写一遍.
作者: 574656549    时间: 2017-12-6 14:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: 2256538860    时间: 2018-2-16 12:29
活抓大神萌新时期帖子一只~
作者: xieritian    时间: 2018-4-10 16:43
学习学习




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1