查看: 1918|回复: 6

[通用发布] 分享几种系统没预留的计算方法(以及队伍平均等级脚本)

[复制链接]

矿工

梦石
0
星屑
134
在线时间
898 小时
注册时间
2012-10-5
回帖
1303
发表于 2013-11-22 22:05:03 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 876加几 于 2013-11-23 16:45 编辑

脚本:[pre lang="ruby" line="1"]class Numeric
  def sqr # 平方
    return self ** 2
  end
  def cube # 立方
    return self ** 3
  end
  def powten # 10 的 self 次方
    return 10 ** self
  end
  def sqrt # 开平方
    if self.abs != self
      raise ArgumentError.new("NaN")
    end
    num = self ** 0.5
    return num.truncate == num ? num.truncate : num
  end
  def cuberoot # 开立方
    if self.abs != self
      num = (self * (-1)) ** (1 / 3.0)
      return num.truncate == num ? -num.truncate : -num
    end
    num = self ** (1 / 3.0)
    return num.truncate == num ? num.truncate : num
  end
  def root(y) # 开任意次方
    if self.abs != self and y % 2 == 0
      raise ArgumentError.new("NaN")
    end
    if self.abs != self
      num = (self * (-1)) ** (1.0 / y)
      return num.truncate == num ? -num.truncate : -num
    end
    num = self ** (1.0 / y)
    return num.truncate == num ? num.truncate : num
  end
end
class Array
  def average(need_dec = true) # 平均数 (是否使用浮点数)
    if self.include?(nil)
      ary = self.compact
    else
      ary = self
    end
    num = 0
    if ary.size == 0
      raise ZeroDivisionError.new("divided by 0")
    end
    for i in 0...ary.size
      if ary.is_a?(Numeric)
        num += ary
      else
        raise TypeError.new("connot convert #{ary.class} into Numeric")
      end
    end
    num /= ary.size.to_f
    unless need_dec
      return num.truncate
    end
    return num.truncate == num ? num.truncate : num
  end
end
[/pre]演示:[pre lang="ruby" line="1"]p 8.sqr                              >= 64
p 2.cube                             >= 8
p 9.sqrt                             >= 3
p 125.cuberoot                       >= 5
p 65536.root(16)                     >= 2
p 3.powten                           >= 1000
p [3, 8, 1].average                  >= 4
p -8.sqr                             >= 64
p -2.cube                            >= -8
p -3.powten                          >= 0.001
p -125.cuberoot                      >= -5
p -512.root(9)                       >= -2
p [1, 0, 1].average                  >= 0.666666666666666666...
p [8, 32, 1].average(false)          >= 13
p [4, nil, 2].average                >= 3
p [[20, 10, 0].average, 80].average  >= 45
p -9.sqrt                            >= ArgumentError
p -65536.root(16)                    >= ArgumentError
p [].average                         >= ZeroDivisionError
p 8.root                             >= ArgumentError
p [32, "5"].average                  >= TypeError[/pre]17行以后是错误的方法,其它的全是正确的。
根据这个方法,我们还可以求出队伍中角色平均等级:[pre lang="ruby" line="1"]class Game_Party
  #--------------------------------------------------------------------------
  # ● 获取平均等级
  #--------------------------------------------------------------------------
  def average_level
    # 同伴人数为 0 的情况下 (避免除以零的错误)
    if @actors.size == 0
      return 0
    end
    level = 0
    actor_level = []
    for i in 0...@actors.size
      actor_level = @actors.level
    end
    return actor_level.average(false)
  end
end[/pre]

评分

参与人数 1星屑 +100 梦石 +1 收起 理由
怪蜀黍 + 100 + 1 奖励条例

查看全部评分

呃,发糖贴好冷清呀!

◇无限的妄想者◇

梦石
0
星屑
90
在线时间
1441 小时
注册时间
2012-7-14
回帖
2279
发表于 2013-11-22 22:34:47 | 显示全部楼层
Q1:负数可以开3次方以及任何奇数次方,不考虑添加?
Q2:过大数字、负数开方是否考虑结果包含e、i?
Q3:不考虑计算方差、相关度等更多统计计算方法?

点评

感觉方差和相关度的计算方法应该用处不小~  发表于 2013-11-22 22:47
赞同Q1。至于Q2、Q3,LZ还不到10岁,还没有学虚数、方差等。  发表于 2013-11-22 22:39

评分

参与人数 1星屑 +20 收起 理由
怪蜀黍 + 20 讨论鼓励。

查看全部评分


————————————————————————————————————
新坑Dreamoon酝酿中,预计短篇⑨完工发布。
————————————————————————————————————
如何调戏橙光文字的 高级UI 系列教程:  鉴赏页制作篇、背包系统制作篇
回复

使用道具 举报

矿工

梦石
0
星屑
134
在线时间
898 小时
注册时间
2012-10-5
回帖
1303
 楼主| 发表于 2013-11-22 22:47:37 | 显示全部楼层
本帖最后由 876加几 于 2013-11-23 08:05 编辑
幻想中的鸡蛋 发表于 2013-11-22 22:34
Q1:负数可以开3次方以及任何奇数次方,不考虑添加?
Q2:过大数字、负数开方是否考虑结果包含e、i?
Q3: ...


A1:已修正
A2:不会出现这样的情况
A3:目前我没研究这两种运算情况

点评

用sprintf的%e格式可以转为合适的科学计数格式:sprintf("%e", 3.0) #=>"3.000000e+00"  发表于 2013-11-23 10:25
先to_s,再用size测量字符串长度再减1,然后scan,接着挑选出非0的几位,然后点小数点写“e”,不过to不了i  发表于 2013-11-22 22:59
关于A2:计算结果的上限是多少= =?万一有人想算个10^100怎么办……(算了,正常情况不会有拿RM当计算器的= =)  发表于 2013-11-22 22:55
呃,发糖贴好冷清呀!
回复

使用道具 举报

八宝粥的基叔

梦石
0
星屑
4957
在线时间
5234 小时
注册时间
2009-4-29
回帖
14054

贵宾

发表于 2013-11-22 22:57:39 | 显示全部楼层
876加几 发表于 2013-11-22 22:47
A1:无法修正,因为如果修正后就会出现FloatDomainError
A2:不会出现这样的情况
A3:目前我没研究这两种 ...

你用计算器试试-27开3次方看看会不会出错。(-3)*(-3)*(-3) = -27,所以你懂的。
Q1可以修正的,多思考一下吧。

点评

Q1修正完毕  发表于 2013-11-23 08:03
《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复

使用道具 举报

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2013-11-23 12:58:22 | 显示全部楼层
i ** 0.5 (root)==

点评

Fundamental Theorem of Algebra  发表于 2013-11-24 02:06
(1+i)除以根号2  发表于 2013-11-23 17:01
²√i  发表于 2013-11-23 13:28
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2013-11-23 18:56:46 | 显示全部楼层
非常实用的系统!但是如果我还想要sin、cos、tan、sec、csc、cot等等的计算(3D游戏不用三角函数会做死吗···)呢?还有就是pai这个3.1415926·······的玩意要怎么解决呢?

点评

Math模块就足够了吧  发表于 2013-11-23 19:10
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
55
在线时间
416 小时
注册时间
2012-11-30
回帖
146
发表于 2013-11-23 19:12:23 | 显示全部楼层
能把 cos、sin弄出来吗????
x = a + r cos θ
  y = b + r sin θ
不需要解释了吧

点评

cos、sin在模块Math中已被定义了  发表于 2013-11-23 21:38
太逆天了,才几岁喵~数学都学到圆的的参数方程了?  发表于 2013-11-23 20:46

<object width="630" height="500" align="middle" id="reader" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-44455354000
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部