查看: 4074|回复: 3

[已经过期] 关于随机属性装备脚本的权重与随机率的问题

[复制链接]
梦石
0
星屑
160
在线时间
11 小时
注册时间
2010-1-30
回帖
2
发表于 2013-2-6 10:42:53 | 显示全部楼层 |阅读模式

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

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

×
请问如何在随机属性装备脚本里面
添加上多项比率选一的脚本?
实现高权重的物品被随机到的概率小,低权重的物品随机到的概率大?
[pre lang="ruby" line="1"]#encoding:utf-8
#==============================================================================
# ■ 随机属性装备 By wyongcan
#==============================================================================

module Equipplus
#得到随机属性装备方法:gainequip(装备ID,属性数)
#~ 前缀结构:
#~ ①权重(1-100) 越大越重要
#~ ②名称(多个名称用","分开,会随机取其中一个添加到武器名前)
#~ ③属性数组  提供两种方式:
#~ 1.[属性ID,增加值]    属性ID参考说明增强脚本 增加了9号属性“极品出现率” ID为8,影响前缀的好坏 1 - 100
#~ 2.与装备特性相同[code,data_id,value]  code,data_id参考说明增强脚本
  @maxparamplus = 3 #最大前缀数
  @moneyrate = 10 #物品价格计算公式为:原价格 + 前缀权重 * @moneyrate
  @transpose = [*1..100].reverse #用于把1变成100,100变成1
  @paramsplus = [           #暂时只写了三个前缀,可以自己添加,参照前缀结构
  [10,"力量",[[2,10]]], #物理攻击加10
  [20,"活力",[[0,200],[1,200]]], # HP和MP各加200
  [60,"战神",[[21,2,2]]] #物理攻击双倍
  ]
  $商店随机 = true #商店买装备时出随机属性
  $战斗随机 = true #战斗后获得随机属性装备
  def self.getname(paramsplus)
    name = ""
    paramsplus.is_a?(Array) ? paramsplus.each{|a| @temp = []; a[1].scan(/^[\u4e00-\u9fa5|\w]*|,[\u4e00-\u9fa5|\w]*/){|b| @temp.push b.gsub(","){}}; name += @temp[rand(@temp.size)]} : paramsplus[1].scan(/^[\u4e00-\u9fa5|\w]*|,[\u4e00-\u9fa5|\w]*/){|b| @temp = [] if @temp == nil ;@temp.push b.gsub(","){}}
    name += @temp[rand(@temp.size)] if paramsplus.is_a?(Array) != true
    name += "的"
  end
  def self.getluck #获得极品出现率
    luck = 0
    $game_party.all_members.each{|a| a.weapons.each{|a| luck += a.params[8] if a.params.size == 9};a.armors.each{|a| luck += a.params[8] if a.params.size == 9}}
    luck
  end
  def self.getnewequip(xequip,params = nil) #提供两个参数  装备(RPG::Equip类下的)和附加前缀数,不填则为随机
    return unless xequip.is_a?(RPG::EquipItem)
    #xparamplus为前缀数
    xequip.paramsplus = [] if xequip.paramsplus == nil
    return if xequip.paramsplus.size >= @maxparamplus
    params != nil ? xparamplus = params :  xparamplus = rand(@maxparamplus * 110) / 100
    xparamplus = xparamplus.to_int
    return xequip if xparamplus == 0
    equip = xequip.dup
    paramsplus = equip.paramsplus.dup  #无奈的方法,不这样改一个装备所有同父装备的装备都会变
    newparams = equip.params.dup
    newfeatures = equip.features.dup
    aparamsplus = @paramsplus.collect{|a| [a[0] = @transpose[a[0]-1],a[1],a[2]]}.sort_by{|a| a[0]}
    while paramsplus.size < xparamplus
      temp = rand(aparamsplus[-1][0])
      temp = [temp - getluck,0].max
      x = []
      for i in aparamsplus
        x.push i if i[0] >= temp && paramsplus.include?(i) != true
      end
      if x != []
        a = [(x.size-1)*100 - getluck,0].max
        a = (rand(a)/100).to_int
        paramsplus.push x[a]
      end
    end
    equip.name = getname(paramsplus) + equip.name #更新名称
    paramsplus.each{|a| equip.price += @transpose[a[0] - 1] * @moneyrate} #更新价格
    paramsplus.select{|a| a[2].select{|a| a.size == 2}.each{|a| newparams[a[0]] += a[1]}} #更新属性
    #以下为更新特性
    features = []
    paramsplus.each{|a| a[2].each{|a| features.push a if a.size == 3}}
    while features.size > 0
      i = features.pop
      newfeatures.select{|a| a.code == i[0] && a.data_id == i[1]}.size == 0 ? newfeatures.push(RPG::BaseItem::Feature.new(i[0],i[1],i[2])) : newfeatures.each_with_index{|a,b| newfeatures.value += i[2] if a.code == i[0] && a.data_id == i[1]}
    end
    if equip.is_a?(RPG::Weapon)
      equip.id = $data_weapons.size
      $data_weapons.insert $data_weapons.size,equip
      $data_weapons[equip.id].paramsplus = paramsplus
      $data_weapons[equip.id].params = newparams
      $data_weapons[equip.id].features = newfeatures
    else
      equip.id = $data_armors.size
      $data_armors.insert $data_armors.size,equip
      $data_armors[equip.id].paramsplus = paramsplus
      $data_armors[equip.id].params = newparams
      $data_armors[equip.id].features = newfeatures
    end
    equip
  end
  def self.gainequip(id,params = nil)
    $game_party.gain_item(Equipplus.getnewequip($data_weapons[id],params)),1,true)
  end
end
if $商店随机 == true
  class Scene_Shop < Scene_MenuBase
    def do_buy(number)
      $game_party.lose_gold(number * buying_price)
      if @item.is_a?(RPG::EquipItem)
        x = number
        loop do
          break if x <= 0
          x -=1
          $game_party.gain_item(Equipplus.getnewequip(@item), 1)        
          end
      else
        $game_party.gain_item(@item,number)
      end
    end
  end
end
if $战斗随机 == true
  module BattleManager
    def self.gain_drop_items
      $game_troop.make_drop_items.each do |item|
        item.is_a?(RPG::EquipItem) ? xitem = Equipplus.getnewequip(item) : xitem = item
        $game_party.gain_item(xitem, 1)
        $game_message.add(sprintf(Vocab::ObtainItem, xitem.name))
      end
      wait_for_message
    end
  end
end
class RPG::EquipItem < RPG::BaseItem
  alias old initialize
  def initialize
    old
    @paramsplus #前缀  
  end
  attr_accessor :paramsplus
end[/pre]

与[pre lang="ruby" line="1"]#--------------------------------------------------------------------------
# 多项比率选一(Ratios) By.Clov
# 使用 Ratios.Co({对象=>比率},分比数)
#--------------------------------------------------------------------------
$imported["RatiosClov"] = true  
module Ratios
  def self.Co(data = {}, b = 100)
    r = rand b;n = data.keys;f = data.values;arr = [];mii = []
    f.each {|v| if v >= r;arr.push v;else;arr.push nil;end}
    unless arr.compact.empty?
      arr.each {|a|
      if a;mii.push a - rand(a) - r
      else;mii.push b;end}
      x = mii.index mii.min
    else
        x = f.index f.max
    end
    return [n[x],f[x]]
  end
end
[/pre]
梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
回帖
1526
发表于 2013-2-6 11:22:25 | 显示全部楼层
我没看脚本喔!先声明一下,实际的改法我没有,
是提一个个人的想法,如果一般用随机的方式去取值,
那每一个值的机率都是相同的,所以不如取两个随机数,
然后判断两个随机数哪个较小就用哪个,
也就是说,rand(1...100) 取两次,
若取得值为 50 70,那就选择 50,
若取得值为 30 15,那就选择 15,
这样子低数值的机率势必远大于高数值,
不过,95~100 这个值恐怕低到几乎不可能了。
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复

使用道具 举报

梦石
0
星屑
160
在线时间
11 小时
注册时间
2010-1-30
回帖
2
 楼主| 发表于 2013-2-6 11:28:41 | 显示全部楼层
j433463 发表于 2013-2-6 11:22
我没看脚本喔!先声明一下,实际的改法我没有,
是提一个个人的想法,如果一般用随机的方式去取值,
那每一 ...

多项比率选一(Ratios) By.Clov
这段代码就是设计随机率。
但是,不知道这两个如何整合。
回复

使用道具 举报

梦石
0
星屑
245
在线时间
2 小时
注册时间
2013-12-30
回帖
1
发表于 2014-1-2 17:59:21 | 显示全部楼层
我也很想知道,哪位大神能够指教一下
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部