Project1

标题: 分享几种系统没预留的计算方法(以及队伍平均等级脚本) [打印本页]

作者: 876加几    时间: 2013-11-22 22:05
标题: 分享几种系统没预留的计算方法(以及队伍平均等级脚本)
本帖最后由 876加几 于 2013-11-23 16:45 编辑

脚本:
RUBY 代码复制
  1. class Numeric
  2.   def sqr # 平方
  3.     return self ** 2
  4.   end
  5.   def cube # 立方
  6.     return self ** 3
  7.   end
  8.   def powten # 10 的 self 次方
  9.     return 10 ** self
  10.   end
  11.   def sqrt # 开平方
  12.     if self.abs != self
  13.       raise ArgumentError.new("NaN")
  14.     end
  15.     num = self ** 0.5
  16.     return num.truncate == num ? num.truncate : num
  17.   end
  18.   def cuberoot # 开立方
  19.     if self.abs != self
  20.       num = (self * (-1)) ** (1 / 3.0)
  21.       return num.truncate == num ? -num.truncate : -num
  22.     end
  23.     num = self ** (1 / 3.0)
  24.     return num.truncate == num ? num.truncate : num
  25.   end
  26.   def root(y) # 开任意次方
  27.     if self.abs != self and y % 2 == 0
  28.       raise ArgumentError.new("NaN")
  29.     end
  30.     if self.abs != self
  31.       num = (self * (-1)) ** (1.0 / y)
  32.       return num.truncate == num ? -num.truncate : -num
  33.     end
  34.     num = self ** (1.0 / y)
  35.     return num.truncate == num ? num.truncate : num
  36.   end
  37. end
  38. class Array
  39.   def average(need_dec = true) # 平均数 (是否使用浮点数)
  40.     if self.include?(nil)
  41.       ary = self.compact
  42.     else
  43.       ary = self
  44.     end
  45.     num = 0
  46.     if ary.size == 0
  47.       raise ZeroDivisionError.new("divided by 0")
  48.     end
  49.     for i in 0...ary.size
  50.       if ary[i].is_a?(Numeric)
  51.         num += ary[i]
  52.       else
  53.         raise TypeError.new("connot convert #{ary[i].class} into Numeric")
  54.       end
  55.     end
  56.     num /= ary.size.to_f
  57.     unless need_dec
  58.       return num.truncate
  59.     end
  60.     return num.truncate == num ? num.truncate : num
  61.   end
  62. end
演示:
RUBY 代码复制
  1. p 8.sqr                              >= 64
  2. p 2.cube                             >= 8
  3. p 9.sqrt                             >= 3
  4. p 125.cuberoot                       >= 5
  5. p 65536.root(16)                     >= 2
  6. p 3.powten                           >= 1000
  7. p [3, 8, 1].average                  >= 4
  8. p -8.sqr                             >= 64
  9. p -2.cube                            >= -8
  10. p -3.powten                          >= 0.001
  11. p -125.cuberoot                      >= -5
  12. p -512.root(9)                       >= -2
  13. p [1, 0, 1].average                  >= 0.666666666666666666...
  14. p [8, 32, 1].average(false)          >= 13
  15. p [4, nil, 2].average                >= 3
  16. p [[20, 10, 0].average, 80].average  >= 45
  17. p -9.sqrt                            >= ArgumentError
  18. p -65536.root(16)                    >= ArgumentError
  19. p [].average                         >= ZeroDivisionError
  20. p 8.root                             >= ArgumentError
  21. p [32, "5"].average                  >= TypeError
17行以后是错误的方法,其它的全是正确的。
根据这个方法,我们还可以求出队伍中角色平均等级:
RUBY 代码复制
  1. class Game_Party
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取平均等级
  4.   #--------------------------------------------------------------------------
  5.   def average_level
  6.     # 同伴人数为 0 的情况下 (避免除以零的错误)
  7.     if @actors.size == 0
  8.       return 0
  9.     end
  10.     level = 0
  11.     actor_level = []
  12.     for i in 0...@actors.size
  13.       actor_level[i] = @actors[i].level
  14.     end
  15.     return actor_level.average(false)
  16.   end
  17. end

作者: 幻想中的鸡蛋    时间: 2013-11-22 22:34
Q1:负数可以开3次方以及任何奇数次方,不考虑添加?
Q2:过大数字、负数开方是否考虑结果包含e、i?
Q3:不考虑计算方差、相关度等更多统计计算方法?
作者: 876加几    时间: 2013-11-22 22:47
本帖最后由 876加几 于 2013-11-23 08:05 编辑
幻想中的鸡蛋 发表于 2013-11-22 22:34
Q1:负数可以开3次方以及任何奇数次方,不考虑添加?
Q2:过大数字、负数开方是否考虑结果包含e、i?
Q3: ...


A1:已修正
A2:不会出现这样的情况
A3:目前我没研究这两种运算情况
作者: 怪蜀黍    时间: 2013-11-22 22:57
876加几 发表于 2013-11-22 22:47
A1:无法修正,因为如果修正后就会出现FloatDomainError
A2:不会出现这样的情况
A3:目前我没研究这两种 ...

你用计算器试试-27开3次方看看会不会出错。(-3)*(-3)*(-3) = -27,所以你懂的。
Q1可以修正的,多思考一下吧。
作者: 英顺的马甲    时间: 2013-11-23 12:58
i ** 0.5 (root)==
作者: chd114    时间: 2013-11-23 18:56
非常实用的系统!但是如果我还想要sin、cos、tan、sec、csc、cot等等的计算(3D游戏不用三角函数会做死吗···)呢?还有就是pai这个3.1415926·······的玩意要怎么解决呢?
作者: 1091160905    时间: 2013-11-23 19:12
能把 cos、sin弄出来吗????
x = a + r cos θ
  y = b + r sin θ
不需要解释了吧




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