查看: 3062|回复: 1

[已经解决] 属性对比脚本

[复制链接]
梦石
3
星屑
75
在线时间
200 小时
注册时间
2008-7-8
回帖
145
发表于 2015-9-20 11:13:13 | 显示全部楼层 |阅读模式

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

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

×
尝试在帮助窗口里加个属性对比的计算,期望效果是:找出两件装备所有的属性(不重复),并将属性相减结果不为零的量显示出来。
基础属性param的对比很好做,因为equip.param都是自带0~7号所有属性,直接用 equip.params.each_with_index{|x,y| param2.push[@params[y], x- equip2.params[y]]} 就可以了(大概?)
但是features中的三个属性就想不出用什么办法抽取出来并进行计算了,因为features里的元素都是零散的,没有的属性不是为0而是直接没有。
而且A装备有的features B装备不一定有,这种情况想默认将没有该属性的装备视作该属性为0也不知道应该怎么实现。
求解决思路..

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-9-20 12:04:59 | 显示全部楼层
本帖最后由 taroxd 于 2015-9-20 12:10 编辑

随手写的,可能出错,只看思路就好

[pre lang="ruby"]
# a, b 为两个具有 features 的物品
def compare_item(a, b)
  # 为了更快速地索引,
  # 制作一个 code => data_id => [value_a, value_b] 的表。
  # 返回值即为这个 hash
  result = Hash.new do |h1, code|
    h1[code] = Hash.new do |h2, data_id|
      h2[data_id] = []
    end
  end

  a.features.each do |feature|
    result[feature.code][feature.data_id][0] = feature.value
  end
  
  b.features.each do |feature|
    result[feature.code][feature.data_id][1] = feature.value
  end

  result

  # 获取结果后的用法:
  # result.each do |code, data_id2value|
  #   data_id2value.each do |data_id, (value_a, value_b)|
  #
  #     # value_a 和 value_b 可能为 nil。此时取 0 还是取 1 需要看情况判断。
  #     # 在这里按照你的要求取 0。
  #     value_a ||= 0
  #     value_b ||= 0
  #
  #     do_something_with code, data_id, value_a - value_b
  #   end
  # end
end
[/pre]

点评

这里用 hash 主要是为了给出默认值,以及防止 code 之间间隔过大浪费内存。迭代的方式和数组是一样的。  发表于 2015-9-20 12:45
非常感谢。我之前想的也是用嵌套.each的block来做,但用的是数组,直接出错...是只有hash可以这样嵌套吗?  发表于 2015-9-20 12:42

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部