一段网上找的代码突然爆了,项目出现大Bug!
本人是做游戏服务器开发的,碰到一个需求,给符合某些要求的玩家发送道具奖励,奖励的数量根据离线的天数计算。

图片来自 Pexels
这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。
public?static?int?differentDays(Date?date1,Date?date2)
????{
????????Calendar?cal1?=?Calendar.getInstance();
????????cal1.setTime(date1);
????????Calendar?cal2?=?Calendar.getInstance();
????????cal2.setTime(date2);
???????int?day1=?cal1.get(Calendar.DAY_OF_YEAR);
????????int?day2?=?cal2.get(Calendar.DAY_OF_YEAR);
????????int?year1?=?cal1.get(Calendar.YEAR);
????????int?year2?=?cal2.get(Calendar.YEAR);
????????if(year1?!=?year2)???//同一年
????????{
????????????int?timeDistance?=?0?;
????????????for(int?i?=?year1?;?i?????????????{
????????????????if(i%4==0?&&?i%100!=0?||?i%400==0)????//闰年????????????
????????????????{
????????????????????timeDistance?+=?366;
????????????????}
????????????????else????//不是闰年
????????????????{
????????????????????timeDistance?+=?365;
????????????????}
????????????}
????????????return?timeDistance?+?(day2-day1)?;
????????}
????????else????//不同年
????????{
????????????System.out.println("判断day2?-?day1?:?"?+?(day2-day1));
????????????return?day2-day1;
????????}
????}
https://www.cnblogs.com/0201zcr/p/5000977.html
把代码复制到项目里,调试下,发现没问题就直接用了,毕竟谷歌结果第一名,放心。
这段代码跑了几个月一直没问题,但是到了 2020-1-1 日那天,有玩家反馈收到了几百封奖励邮件,高兴坏了,但是出于对游戏的热爱,还是通知了运营人员。
运营把 Bug 反馈到服务器这边后我开始排查,百思不得其解的是最近几天都没有更新服务器, 而前几天服务器都稳稳地,怎么突然就出 Bug 了呢?
接下来就是分析玩家数据,结合代码逻辑确定问题所在,最终根据 Bug 的表现排除了所有可能性后,发现唯一可能出问题的地方就是那个网上复制过来的计算天数差的函数。
differentDays("2020-1-1","2019-12-25")
理论上这么调用正确的结果是 -7,但是因为函数有 Bug,调用结果是 358。
于是本来不用发奖励,因为这种特殊情况一下子发出去 358 份,严重影响了游戏某类道具的平衡性。
????public?static?int?differentDays(Date?date1,?Date?date2)?{
????????if?(date1?==?null?||?date2?==?null)?{
????????????throw?new?RuntimeException("日期不能为空");
????????}
????????LocalDate?localDate1?=?date2LocalDate(date1);
????????LocalDate?localDate2?=?date2LocalDate(date2);
????????return?Generic.long2int(localDate1.until(localDate2,?ChronoUnit.DAYS));
????}
????public?static?LocalDate?date2LocalDate(Date?date)?{
????????Instant?instant?=?date.toInstant();
????????ZoneId?zoneId?=?ZoneId.systemDefault();
????????LocalDate?localDate?=?instant.atZone(zoneId).toLocalDate();
????????return?localDate;
????}
至于补救方式就是统计名单,把发出去但还没有用掉的道具回收,用掉的就当福利,然后再发公告道歉,再送些其他物品弥补。
也幸好补救的及时,要是这些道具收不回来,游戏运营的策略都要大变了,我特么肯定没好果子吃了。
所以千万别在网上复制来路不明的代码乱用,如果真的要用,必须反复测试,否则哪一天突然暴雷有你受的。
https://github.com/aspwebchh
作者:陈宏鸿
编辑:陶家龙、孙淑娟
出处:https://www.cnblogs.com/aspwebchh/p/12220673.html

精彩文章推荐:
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 海南自贸港绘就开放新蓝图 7904468
- 2 22岁女生毕业后做团播三观震碎 7808340
- 3 赖清德已被台湾主流民意弹劾掉了 7713334
- 4 海南封关“圈粉”全球 7616155
- 5 刹车失灵狂奔490公里司机发声 7522120
- 6 男子在意大利说中文被本地阿姨回复 7423556
- 7 6人编造传播“杀人”谣言被查处 7330939
- 8 樊振东被记大功 7236990
- 9 男子养五步蛇当宠物 喂食被咬致截肢 7138636
- 10 6元面包摊爆火 老板一夜不睡做面包 7042780







51CTO技术栈
