【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

第二章-宝箱抽奖模块与代码设计(二)

原创 2016年08月31日 00:40:07

第二章-宝箱抽奖模块与代码设计(二)

简要 信息
作者 卡卡
博客 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~

最终代码分支

  1. 项目git地址 https://github.com/johncha/CodeDesign-1
  2. step-1-2-1 分支中获得本章最终代码。

如果你对本文有什么建议或意见,可以发邮件到john.cha@qq.com或到blog.csdn.net/kakashi8841中留言。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

第三章-宝箱抽奖模块与代码设计(三)

宝箱抽奖模块与代码设计(三)作者 卡卡 博客 http://blog.csdn.net/kakashi8841 邮箱 john.cha@qq.com上集回顾* 由于本文章关联性较强,因此建议先阅读...

系统中的邮件子模块-设计

最近在做新系统,又遇到了发送邮件的问题,我们这个系统有一定的特殊性,可能需要发送邮件的地方比较多。于是想着怎么做的灵活一点,更能响应以后的需求变化,于是有了现在的这个实现。   总的来说,使用了spring的aop的触发机制,在不同的点来触发发送邮件这个业务,并根据这个点发送相应的邮件。而发送邮件这个模块也使用了spring包装过的javamail,不同的邮件则使用了velocity模板。呵呵,也算是现时比较流行的一个实现了!     下面是邮件子系统的简单结构图:   <img src='
  • kino
  • kino
  • 2008-07-02 00:07
  • 961

第三章-宝箱抽奖模块与代码设计(三)

宝箱抽奖模块与代码设计(三)作者 卡卡 博客 http://blog.csdn.net/kakashi8841 邮箱 john.cha@qq.com上集回顾* 由于本文章关联性较强,因此建议先阅读...

编程小结之代码规范——设计模块和过程

Visual Basic是一种可视化语言,因此,相当一部分工作是设计各种用户界面。不过,你仍然必须编写相应的代码,模块和过程是指应用程序代码的框架,而建立这样的框架必须进行慎密的考虑。模块和过程的一般概念:</spa

Java设计模式之从[游戏中开启宝箱]分析中介者(Mediator)模式

假设我们正在设计一个游戏房间,房间里有两个按钮和一个宝箱,如果我们按下了按钮1,则按钮2和宝箱均不可使用;如果我们按下了按钮2,则按钮1和宝箱均不可使用;如果我们打开宝箱,则按钮1不可按下。   在...

项目日志2-系统降级模块设计

1.系统降级的概念 系统降级的是指当系统由于某种原因(可能是网络外部系统不稳定或程序内部bug导致)不稳定时,系统可以平滑的过渡到一个备选方案上来,使系统处于半可使用状态 2.为什么要做系统降级 当有新功能模块发布以后,一些隐藏较深的问题可能过一段时间才能展示出来,当这些问题发生而且会比较严重时,如果不及时对出问题的模块作操作,很可能导致大批的错误数据产生,而排查问题需要一定的时间的,如何将发现问题到解决问题过程中产生的错误数量降低到最低,这个就是系统降级需要处理的事情,可以简单的理解成一个个backup的功能点,当主功能
  • jgsj
  • jgsj
  • 2011-04-20 00:12
  • 118

开发日记]图片抽奖软件的原型设想及界面设计-打算用PowerPoint结合Vc++完美实现 (进展二)-于11月7日完工

技术独特,希望共同探讨!

重构-改善既有代码的设计

    最近在看这本书,个人感觉非常有用,提高个人对程序的认识,与大家分享下,等看完,理解后再来发表感想。   作者:Martin Fowler,Kent Beck,John Brant ,William Opdyke ,Don Roberts 翻译:侯捷、熊节 <span style="color: #354278

代码整洁之道笔记 - 第二章 有意义的命名

命名的几个规则 1.名副其实  变量、函数或类的命名应该囊括了所有的大的问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。  如果名称需要注释来补充,那就不算是名副其实。 2.避免误导  程序...

模块简单设计——socket.io聊天代码

参照网上的各种教程和代码实现一个简易在线聊天器,支持定向发消息 服务器端 app.js(使用express搭建静态服务,socket.io建立服务器端监听)   var app = require('express')() , express = require('express') , server = require('http').cr
  • ciaos
  • ciaos
  • 2013-01-11 17:29
  • 1193
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)