-宝箱抽奖模块与代码设计
Posted kakashi8841
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-宝箱抽奖模块与代码设计相关的知识,希望对你有一定的参考价值。
第二章-宝箱抽奖模块与代码设计(二)
简要 | 信息 |
---|---|
作者 | 卡卡 |
博客 | http://blog.csdn.net/kakashi8841 |
邮箱 | john.cha@qq.com |
本文所属专栏 | http://blog.csdn.net/column/details/12687.html |
上集回顾
由于本文章关联性较强,因此建议先阅读前一篇文章http://blog.csdn.net/kakashi8841/article/details/52300476
在我们快下班的时候,策划留下了两个问题,然后挥挥手自己就下班了。
1. 每种宝箱有可能不是消耗对应的资源。比如,白银宝箱可能也可以消耗黄金来开启。
2. 10连抽现在只是简单的循环抽了10次,需要改成10连抽里面9次是正常抽的,而有1次会掉落更高级的东西。
快速实现需求1
都快下班了,还来需求,这不是闹嘛?!等下还要去约会呢。
不管了,这时候先快速实现再说。先来做第1个需求。这个需求感觉还是比较简单的,直接在ConfigLottery中增加一个costType字段,用于表示该抽奖消耗什么类型的资源。即在ConfigLottery中增加代码清单1.1.1中的代码:
代码清单 1.1.1
private int costType; // 抽奖需要消耗的资源类型
public int getCostType()
return costType;
public void setCostType(int costType)
this.costType = costType;
然后修改LotteryService中tryCostResource方法。修改后的代码如代码清单1.1.2:
代码清单 1.1.2
private boolean tryCostResource(Player player, ConfigLottery configLottery)
return player.alterResource(configLottery.getCostType(), -configLottery.getCost());
嗯。貌似很简单啊。这时候我们不得不开始佩服自己一开始,把所有资源统一处理的做法。想象一下,如果没有统一资源。那么tryCostResource现在的代码可能如代码清单1.1.3中所展示的,而不像代码清单1.1.2中那么简洁:
代码清单 1.1.3
private boolean tryCostResource(Player player, ConfigLottery configLottery)
switch(configLottery.getCostType())
case Player.RESOURCE_SLIVER:
return player.alterSliver(-configLottery.getCost());
case Player.RESOURCE_GOLD:
return player.alterGold(-configLottery.getCost());
case Player.RESOURCE_DIAMOND:
return player.alterDiamond(-configLottery.getCost());
default:
throw new Exception("Unsupport cost type : "+configLottery.getCostType());
大家可以切换为 step-1-1-1 分支中的代码。即这一步的代码。
快速实现需求2
需求2:10连抽现在只是简单的循环抽了10次,需要改成10连抽里面9次是正常抽的,而有1次会掉落更高级的东西。
只剩几分钟就要开车了,哦不,要到约会时间了。之前我们如果一个配置要求抽10次,我们的做法是直接在LotteryService的dropItem方法中循环了10次。而现在策划要求里面有9次是根据之前配置进行掉落,但是10次里面有一次会掉一些比较好的。比如可能一般一次次抽大部分都是掉蓝色装备,如果10连抽,则必掉紫色装备。虽然在这个时候提出这种需求,但是好像这个需求也不过分。
为了快点能去约会,我觉得先暴力实现这个方法。我们将LotteryService中的dropItem修改为代码清单1.2.1中所示。
代码清单 1.2.1
private void dropItem(ConfigLottery configLottery)
Random rand = new Random();
if (configLottery.getTimesType() == 1)
dropOnce(rand, configLottery);
else if (configLottery.getTimesType() > 1)
for (int i = 0; i < configLottery.getTimesType() - 1; i++)
dropOnce(rand, configLottery);
dropOnce(rand, getConfigLottery(configLottery.getLotteryType(), 0));
这段代码简单地对抽奖进行判断。比如判断到要抽奖为1次,那么则调用dropOnce掉落一次。如果是抽N次(N大于1)以上的,那么前N-1次依然循环抽,抽完N-1次后,还会额外抽取一次特殊的。那么,根据这个实现,你需要和策划说明配置的方法:
1. 如果想要配置LotteryType为1,10连抽(即TimesType为10)的抽奖第10次出现特殊的道具,那么需要在之前配置的基础上增加一条LotteryType为1,TimesType为0的配置。这样,程序就会读取这个配置作为第10次抽奖的掉落配置。
2. 什么?你要求这个特殊配置不要固定在第10次出现,可能是第一次或第三次出现。我服务器才不管呢,反正10连抽的数据一次性发给客户端,客户端随机顺序取出来显示就可以了。
对了,忘记看dropOnce这个方法的代码。代码如1.2.2所示。
代码清单 1.2.2
private void dropOnce(Random rand, ConfigLottery configLottery)
List<ConfigLotteryItem> items = configLottery.getItems();
int totalWeight = 0;
for (ConfigLotteryItem item : items)
totalWeight += item.getWeight();
int randNum = rand.nextInt(totalWeight);
for (ConfigLotteryItem item : items)
if (randNum < item.getWeight())
System.out.println("Drop item " + item.getModelID() + ", " + item.getNum());
break;
randNum -= item.getWeight();
可以看到这个方法的代码基本就是上一章中dropItem方法中循环里面的代码。这就不详细介绍了,忘记的同学可以看上一章。
人生总有各种悬念
好了,至此我们也开心地实现了需求2的功能。功能是实现了,但是我们还可以给自己多提一点问题:
1. 如果某些抽奖需要同时消耗两种资源怎么办
2. 感觉需求2的实现好像不是很通用,能不能把抽1次和抽10次的代码统一化,这样不需要if分支。
3. 10连抽的时候能不能不要刻意去区分前九次抽奖和第10次抽奖。
这些问题先给大家想想,我先去约会去了。再不走要迟到了。88~
最终代码分支
- 项目git地址 https://github.com/johncha/CodeDesign-1
- step-1-2-1 分支中获得本章最终代码。
如果你对本文有什么建议或意见,可以发邮件到john.cha@qq.com或到blog.csdn.net/kakashi8841中留言。
以上是关于-宝箱抽奖模块与代码设计的主要内容,如果未能解决你的问题,请参考以下文章