《魔兽世界》风格C++货币系统Balance()方法的优化与Bug修复求助
《魔兽世界》风格C++货币系统Balance()方法的优化与Bug修复求助
大家好!我最近在做一个仿照《魔兽世界》的C++货币系统,包含金(Gold)、银(Silver)、铜(Copper)三种货币,兑换规则很简单:100铜兑换1银,100银兑换1金。
我先定义了这样一个结构体来处理货币:
struct Money { Money(); Money(int copper, int silver, int gold); Money(Money& m); Money operator + (Money const& obj); Money operator - (Money const& obj); void operator += (Money const& obj); void operator -= (Money const& obj); void Balance(); void Print(); int c, s, g; };
现在我遇到的问题是Balance()方法的实现——这个方法的作用是把所有货币规整成符合兑换规则的格式:正数的话自动向上兑换(比如150铜转成1银50铜),负数的话要向上借位,避免出现中间层级的负数(比如(50g 10s -1c)要转换成(50g 9s 99c),绝对不能出现(50g -9s -2c)这种混乱的格式,要求只有最底层的货币可能为负,或者说负数只能通过向上借位来消解,直到最高级货币如果是负的才保留)。
我自己写了一个Balance()的实现,但总觉得性能堪忧,而且还发现了bug:当g>0、s=0但c<0的时候,代码不会正确借位,导致铜的数值还是负数,无法转换成正常的格式。
我的当前实现代码如下:
void Money::Balance() { if (c > 99) { s += c / 100; c = c % 100; } if (s > 99) { g += s / 100; s = s % 100; } if (c < 0 && s >= 0 && g > 0) { (c += ((c / 101) + 1) * 100); s -= (c / -101) + 1; } if (s < 0 && g > 0) { (s += ((s / 101) +1) * 100); g -= (c / -101) + 1; } }
补充说明一下:我写的最后两个if块是用来处理负数借位的,但明显逻辑有问题,比如刚才提到的s=0时的情况就处理不了。而且我总觉得这个实现的逻辑太零散,性能上也不够高效。
我想要的效果其实很明确:不管是正数还是负数,最终都要把货币转换成最规整的格式,正数自动进位,负数自动借位,不会出现中间层级的负数。现在我的代码虽然能处理部分情况,但bug和性能问题都存在,有没有大佬能帮我优化这个方法,同时修复bug呀?
备注:内容来源于stack exchange,提问作者JMelter
相关产品推荐
相关产品推荐

