【bug记录】一个在游戏中很容易被忽略的bug——错用数据类型

项目场景:

游戏内一个限时玩法,该玩法内提供NPC给玩家打,玩家对NPC造成的伤害,会根据一定的比例进行转换成积分,积分达到条件之后,玩家可以领取积分奖励


问题描述

部分账号,出现了积分变成负数,且无法领取积分奖励的问题


原因分析:

通过观察发现,并不是所有的账号都存在这种问题,而且出现该问题的账号,战力都很高,名次位于该限时活动积分排行榜的前几位,在活动中都是获取了大量的积分,所以可能是只有获取了很多积分的账号才存在这个问题。
为了验证这个想法,于是将伤害转换为积分的比例调高,测试在获取高额积分的情况下,是否会出现积分变成负数,且无法领奖的bug,最终结果的确如此,在获取较多积分的情况下,能够稳定复现bug。
随后将复现过程及结果告知技术,技术进行代码检查,发现是用于存储积分的数据类型用了int,其能存储的最大值为 2147483647(2^31-1),如果玩家获得的积分超过了最大值,就会产生溢出,结果积分变成负数,从而无法领取积分奖励。


解决方案:

将该活动中存储积分的数据类型由int改成double


思考:

虽然这个bug的影响范围不大,且危害性低,但是确实会对部分玩家的游戏体验造成一定程度上的影响,既然想要做出好玩的游戏,反思很有必要。
这个问题是否能够提前规避掉呢?答案是肯定的。单纯从游戏测试测功能的角度出发,可以将这个bug归为漏测了边界值。但是游戏中有各种各样的积分排行榜,很多都可以领取积分奖励,为什么只有这个排行榜出现了bug呢?后面我发现这个活动在数值上超出了其它活动,这点其实在做需求分析的时候应该考虑到理论上能够获取的积分范围是否合理,以及在积分范围内是否能够正常领取奖励。
另外,应该养成检查数据类型的习惯,避免此类问题再次发生,或者在下次发生时能够快递定位到问题,并进行修复。


学习:

为什么将数据类型改为double就可以了呢?如何测试?
已经知道int数据类型最大只能存储不到22亿的数,那么double数据类型呢,如果知道double数据类型可以表示的数据范围,再计算出理论上能够获得的积分最大值,进行比较就可以得到答案。
这里列出八种基本数据类型可以表示的数值范围:
byte: -2^7 ~ 2^7-1,即-128~127
short::-2^15 ~ 2^15-1,即-32768~32767
int: -2^31 ~ 2^31-1,即-2147483648~2147483647
long:-2^63 ~ 2^63-1
float:-2^128 ~ 2^128
double:-2^1024 ~ 2^1024
char:0 ~ 2^16-1,即0~65535
boolean:true 和 false

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值