查看: 2475|回复: 6

[已经解决] 脚本求教

[复制链接]
梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
回帖
155
发表于 2013-12-31 21:44:21 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 timiesea 于 2013-12-31 21:46 编辑

我今天晚上花了一些时间利用脚本实现了一个功能,但是不知道这个脚本是否简便,运行是否高效,特意贴出来供大家看看。如果有更好的建议或者意见欢迎提出。

功能:这个脚本实现了在战斗开始前根据参战角色的属性在一定范围内随机设置某一些怪物的属性。

[pre lang="ruby" line="1"]
  #随机设置森林小精灵的数值:名称+ID:数值范围(根据参战角色的属性和)
  #森林小精灵(彩)43:0.5-1.5
  #森林小精灵(红)44:0.6-1.4
  #森林小精灵(绿)45:0.7-1.3
  #森林小精灵(蓝)46:0.8-1.2
  def Random_Fairy
    total = Array[0,0,0,0,0,0,0,0];#新建一个数组用来存储属性
    battleActors = $game_party.battle_members;#获取所有参战的成员
    len = battleActors.length;#获取参战人员数目
    for i in [0,1,2,3]#设置一个循环变量i,从0开始循环一直到3,总共4次。
      if battleActors != nil then#如果第i位有队友则取其属性
        for j in [0,1,2,3,4,5,6,7]#依次获取全体参战成员的各个属性和
          total[j]+=battleActors.param_base(j)+battleActors.param_plus(j);
        end
      else
        break;
      end
    end
    #除了体力上限和魔力上限以外,其余属性取平均值
    for i in [2,3,4,5,6,7]
      total = total / len;
    end
    for i in [43,44,45,46]#进行循环设置4种怪物的随机属性
      case i
      when 43#当开始处理43号怪物时
        for j in [0,1,2,3,4,5,6,7]
          ab = rand(101).to_f / 100;
          abc = ab + 0.5;
          $data_enemies.params[j] = (abc * total[j]).to_i;
        end
      when 44#当开始处理44号怪物时
        for j in [0,1,2,3,4,5,6,7]
          ab = rand(81).to_f / 100;
          abc = ab + 0.6;
          $data_enemies.params[j] = (abc * total[j]).to_i;
        end
      when 45#当开始处理45号怪物时
        for j in [0,1,2,3,4,5,6,7]
          ab = rand(61).to_f / 100;
          abc = ab + 0.7;
          $data_enemies.params[j] = (abc * total[j]).to_i;
        end
      when 46#当开始处理46号怪物时
        for j in [0,1,2,3,4,5,6,7]
          ab = rand(41).to_f / 100;
          abc = ab + 0.8;
          $data_enemies.params[j] = (abc * total[j]).to_i;
        end
      end
    end
    #测试输出
    p $data_enemies[43].params;
    p $data_enemies[44].params;
    p $data_enemies[45].params;
    p $data_enemies[46].params;
  end[/pre]

希望大家给出建议或意见

唉!目前还不知道控制语句的具体写法,只会for的这一种。我看了帮助文档,也只看懂了这一种。
游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-12-31 21:48:14 | 显示全部楼层
作为一个优雅的Ruby党我表示不试着把for循环换成each、times?

点评

我表示还没看懂each和times的用法,能给个例子吗?  发表于 2013-12-31 22:02
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-12-31 22:10:53 | 显示全部楼层
本帖最后由 喵呜喵5 于 2013-12-31 22:15 编辑
  1. 8.times do |i|
  2. p i
  3. end
复制代码
  1. [0,1,2,3,4,5,6,7].each do |i|
  2. p i
  3. end
复制代码
  1. for i in [0,1,2,3,4,5,6,7]
  2. p i
  3. end
复制代码
  1. p rand(61).to_f / 100
复制代码
  1. p rand(61) / 100.0
复制代码
回复

使用道具 举报

梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
回帖
155
 楼主| 发表于 2013-12-31 22:24:07 | 显示全部楼层
喵呜喵5 发表于 2013-12-31 22:10

受教啦!我已经记下了!
游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-12-31 23:27:46 | 显示全部楼层
本帖最后由 喵呜喵5 于 2013-12-31 23:31 编辑

未经测试:
  1.   def Random_Fairy
  2.    
  3.     total = Array.new(7,0)#新建一个数组用来存储属性
  4.     $game_party.battle_members.each do |actor|
  5.       7.times do |i|
  6.         total[i] += actor.param(i)#依次获取全体参战成员的各个属性和
  7.       end
  8.     end
  9.    
  10.     (2..7).each do |i|#除了体力上限和魔力上限以外,其余属性取平均值
  11.       total[i] = total[i] / $game_party.battle_members.size
  12.     end
  13.    
  14.     FAIRY_ID = [43,44,45,46]
  15.     FAIRY_RANGE = [(50..150),(60..140),(70..130),(80..120)]
  16.    
  17.     FAIRY_ID.each_with_index do |fairy_id, i|#进行循环设置4种怪物的随机属性
  18.       7.times do |j|
  19.         temp = FAIRY_RANGE[i].sort_by{rand}
  20.         $data_enemies[fairy_id].params[j] = ((temp[0] /100.0) * total[j]).to_i
  21.       end
  22.     end
  23.    
  24.     FAIRY_ID.each do |i|#测试输出
  25.       p $data_enemies[i].params;
  26.     end
  27.    
  28.   end
复制代码

点评

不难阅读吧,都是挺基础的语法。 顺便我也是个无聊的人,第10行:2.upto(7) {|i| total[i] /= $game_party.battle_members.size }  发表于 2014-1-1 19:14
果然灵活!不过我感到难以阅读,可能是因为对语法不够熟悉吧。  发表于 2014-1-1 02:41

评分

参与人数 1星屑 +20 收起 理由
无脑之人 + 20 语法糖什么的最好吃了

查看全部评分

回复

使用道具 举报

梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
回帖
155
 楼主| 发表于 2014-1-1 12:14:24 | 显示全部楼层
本帖最后由 timiesea 于 2014-1-1 12:22 编辑
  1.   #随机设置森林小精灵的数值
  2.   #森林小精灵(彩)43:0.5-1.5
  3.   #森林小精灵(红)44:0.6-1.4
  4.   #森林小精灵(绿)45:0.7-1.3
  5.   #森林小精灵(蓝)46:0.8-1.2
  6.   def Random_Fairy
  7.     total = Array[0,0,0,0,0,0,0,0];#新建一个数组用来存储属性
  8.     levelTotal = 0;#新建一个变量用来存储队伍的等级和
  9.     battleActors = $game_party.battle_members;#获取所有参战的成员
  10.     len = battleActors.length;#获取参战人员数目
  11.     for i in [0,1,2,3]#设置一个循环变量i,从0开始循环一直到3,总共4次。
  12.       if battleActors[i] != nil then#如果第i位有队友则取其属性
  13.         for j in [0,1,2,3,4,5,6,7]#依次获取全体参战成员的各个属性和
  14.           total[j]+=battleActors[i].param_base(j)+battleActors[i].param_plus(j);
  15.         end
  16.       else
  17.         break;
  18.       end
  19.       levelTotal = levelTotal + battleActors[i].level;#获取参战人员的等级和
  20.     end
  21.     #除了体力上限和魔力上限以外,其余属性取平均值
  22.     for i in [2,3,4,5,6,7]
  23.       total[i] = total[i] / len;
  24.     end
  25.     fairyId = Array[43,44,45,46];#设置一个循环变量存储怪物的ID
  26.     fairyRange = Array[(50..150),(60..140),(70..130),(80..120)]#设置怪物的属性范围
  27.     randomRange = Array.new(4);#生成长度为4的空数组用来存放随机数的范围
  28.     [0,1,2,3].each do |i|#进行4次循环设置4种怪物的属性
  29.       temp = fairyRange[i].sort;#将Range进行排序并且转化为数组
  30.       randomRange[i] = temp;#将新转化的数组添加到随机数范围数组的末尾
  31.       8.times do |j|#进行8次循环设置怪物的8种属性
  32.         #从对应的随机数数组中随机抽取一个数作为属性相关因素
  33.         ran = (randomRange[i].sample.to_f) / 100;
  34.         #将统计好的属性*相关因素再转化为整数就是怪物的属性
  35.         $data_enemies[fairyId[i]].params[j] = (ran * total[j]).to_i;
  36.       end
  37.       ran = (randomRange[i].sample.to_f) / 100;#继续取随机数用来设置金钱掉落
  38.       #金钱掉落的设置跟队伍等级和有关
  39.       $data_enemies[fairyId[i]].gold = (ran * levelTotal).to_i;
  40.       ran = (randomRange[i].sample.to_f) / 100;#再一次取随机数用来设置经验掉落
  41.       #经验掉落和金钱掉落有关
  42.       $data_enemies[fairyId[i]].exp = ($data_enemies[fairyId[i]].gold * ran * 10).to_i;
  43.     end
  44.     #开始战斗前补充怪物的体力值和魔力值
  45.     $game_troop.members.each do |enemy|
  46.       enemy.hp = enemy.mhp;
  47.       enemy.mp = enemy.mmp;
  48.     end
  49.     #测试输出
  50.     fairyId.each do |i|#测试输出
  51.       p $data_enemies[i].params;
  52.       p $data_enemies[i].gold;
  53.       p $data_enemies[i].exp;
  54.     end
  55.   end
复制代码
根据沙发君,3楼君和5楼君的指点,优化了一下脚本。个人总体觉得在写法上有一定的简化,但是也发现了一个问题:在这个脚本中,从一个范围(例如50-150)中取随机数采用排序和sample函数。关键就是这个排序,个人感觉有点耗费资源。不知道大家对于从范围中取随机数有没有什么更好的解决办法。
游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-1-1 12:24:41 | 显示全部楼层
def rand_between(min, max)
    min + rand(max - min + 1)
end

点评

这这。。。唉!记得很久以前一直有用到来着,脑袋年久失修了。太感谢你了。  发表于 2014-1-1 13:07

评分

参与人数 1星屑 +200 梦石 +1 收起 理由
熊喵酱 + 200 + 1 认可答案

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部