设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

请教计算自身携带物品中@description里被标记为"@药品"的数量

查看数: 2024 | 评论数: 9 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-5-31 05:49

正文摘要:

本帖最后由 taeckle 于 2022-5-31 05:57 编辑 大家好, 我在数据库物品一栏的物品说明中最后都增加了一个"@类别名称", 用于给物品栏具体细分类别, 类似于这样: "己方单体 HP 回复。@药品", 请问下如何计算自身 ...

回复

guoxiaomi 发表于 2022-6-9 17:45:59
本帖最后由 guoxiaomi 于 2022-6-9 17:54 编辑

我也做了个benchmark:https://godbolt.org/z/93d6q8f14
意料之中,带缓存的end_with?是最快的,但是xp里没有这个函数,要等到va才有,那么include?就最快。
猜测其他算法相对来说慢的原因:
1. split要创建字符串数组
2. 正则表达式会修改全局变量
3. 下标会创建截取部分的字符串

@RPGzh500223

点评

我没考虑这么细,只是看网上提到RUBY中 ”变量尽量使用字符串和数组,尽量减少新对象的生成“,我大概就记得这些了  发表于 2022-6-18 12:18

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武!

查看全部评分

RPGzh500223 发表于 2022-6-3 15:15:05
本帖最后由 RPGzh500223 于 2022-6-3 22:33 编辑

图片是关于本贴中一些方法的效率测试

除非方法在整个游戏中只调用一次,我更习惯把重复的部分“固定下来”
RUBY 代码复制
  1. module RPG  
  2.   class Item
  3.     def desc
  4.       @description.split("@")[1] || "普通物品"
  5.     end
  6.  
  7.     @@idx = {}
  8.     #直接设定默认值的话可以 @@idx = Hash.new{|hsh, key| hsh[key] = []}
  9.     data_items = load_data("Data/Items.rxdata")
  10.     data_items[1..-1].each do |item|
  11.       (@@idx[item.desc] ||= []) << item.id
  12.     end
  13.  
  14.     def self.idx
  15.       @@idx
  16.     end
  17.   end
  18. end
  19.  
  20. class Game_Party
  21.   def item_des_number(descr_para = "")
  22.     (RPG::Item.idx[descr_para] || []).inject{|sum, id|sum += @items[id] || 0}
  23.   end
  24. end

temp.png (41.3 KB, 下载次数: 22)

temp.png

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武! 我很赞同!

查看全部评分

taeckle 发表于 2022-6-3 04:08:35
灯笼菜刀王 发表于 2022-5-31 09:43
n  = 0
$game_party.instance_variable_get(:@items).each{|a,b| n += b if $game_items[a].description.sp ...

还有大神你这三行代码直接用会报错,貌似这个第二行有个方法没有被定义,惨不忍睹
taeckle 发表于 2022-6-3 03:32:42
本帖最后由 taeckle 于 2022-6-3 04:16 编辑

这是我自己的方法:
1. 在main上面增加这段代码:
RUBY 代码复制
  1. module RPG
  2.   class Item
  3.     def desc
  4.       desc = @description.split(/@/)[1]
  5.       return desc != nil ? desc : "普通物品"
  6.     end
  7.   end
  8. end



2.在 class Game_Party里面增加一个方法:
  1.   def item_des_number(descr_para="无")
  2.     item_d_num=0
  3.     for i in 1..999
  4.      if $data_items[i].desc.include?(descr_para) && $game_party.item_number(i) > 0
  5.       item_d_num+=$game_party.item_number(i)
  6.      end
  7.     end   
  8.     return item_d_num
  9.   end  
复制代码


3. 调用这个方法:
p $game_party.item_des_number("药品")

点评

好的,多谢大神指点!  发表于 2022-6-10 16:31
这个BUG是存在的,你要在04行之前写next if $data_items[i].nil?  发表于 2022-6-9 17:11
是我记错了……  发表于 2022-6-3 22:06
就算第100号物品是空的也不会出错啊, 其实咱还有更差劲但能达到目的的方法。。。  发表于 2022-6-3 17:41
BUG:编辑器中物品上限 <= 999 或 比如第100个是空的 无语,写出个最差的方法……,居然遍历$data_items,难道你一直在反向教学吗?  发表于 2022-6-3 15:08
taeckle 发表于 2022-6-2 07:42:01


还有大神那个.each{|a,b| n += b 中的a逗号b是神马意思啊?我猜b是每个被标记为药品的数量,a就猜不出是啥意思了。。

点评

多谢大神指点!原来each可以这么配合哈希表用  发表于 2022-6-3 03:26
@items是一个哈希表,each方法给块传递的参数是key和value,在这里对应物品id和数量  发表于 2022-6-2 22:47
alexncf125 发表于 2022-6-2 07:15:41
taeckle 发表于 2022-6-2 07:06
大神请问下为什么我在那个class Game_Party里面没有找到这个instance_variable_get方法呢? ...

https://blog.csdn.net/weixin_30835933/article/details/95456720

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武!

查看全部评分

taeckle 发表于 2022-6-2 07:06:26
灯笼菜刀王 发表于 2022-5-31 09:43
n  = 0
$game_party.instance_variable_get(:@items).each{|a,b| n += b if $game_items[a].description.sp ...


大神请问下为什么我在那个class Game_Party里面没有找到这个instance_variable_get方法呢?
RPGzh500223 发表于 2022-5-31 14:46:02
本帖最后由 RPGzh500223 于 2022-6-3 22:15 编辑
  1. class Game_Party
  2.   def medicine_number
  3.     @@medicine_idx ||= $data_items.inject([]) do |ary, item|
  4.       if item != nil
  5.         ary << item.id if item.description.include?("@药品")
  6.       end
  7.       ary  
  8.     end
  9.    
  10.     #下一行代码留着当个反面教材,当初应该可以写得更好的o(* ̄▽ ̄*)o
  11.     (@items.keys & @@medicine_idx).inject(0){|sum, idx| sum += @items[idx]}
  12.   end
  13.   
  14.   def num2
  15.     n = 0
  16.     @items.each{|a, b| n += b if $data_items[a].description.include?("@药品")}
  17.     return n
  18.   end
  19. end
复制代码


考虑到游戏物品越来越多,还是第一个思路好点

楼主有兴趣的话,可以试试图片上的测试

temp.jpg (46.97 KB, 下载次数: 20)

temp.jpg

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武!

查看全部评分

灯笼菜刀王 发表于 2022-5-31 09:43:37
n  = 0
$game_party.instance_variable_get(:@items).each{|a,b| n += b if $game_items[a].description.split(/@/)[1] == "药品"}
return n

点评

然后我就误以为是把那个@items换成$data_items了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。  发表于 2022-6-3 17:32
guoxiaomi三天前不就经已说了是$data_items  发表于 2022-6-3 12:18
大神你第二行那个$game_items不对,应该换成$data_items  发表于 2022-6-3 04:37
还有大神那个:@items以及那个b都是神马意思啊?完全看不懂。。。  发表于 2022-5-31 16:22
是$data_items  发表于 2022-5-31 12:38

评分

参与人数 2星屑 +50 +1 收起 理由
RyanBern + 50 认可答案
taeckle + 1 大神威武!

查看全部评分

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-28 10:27

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表