当前位置: 首页 > news >正文

一个公司可以做多少个网站网站优化推广公司

一个公司可以做多少个网站,网站优化推广公司,免费网站建设步骤,备案信息 网站名导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 上一章(从零开始手写mmo游戏从框架到爆炸(二十)— 战斗系统一-CSDN博客)我们只是完成了基本的战斗,速度属性并没有…

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客    

        上一章(从零开始手写mmo游戏从框架到爆炸(二十)— 战斗系统一-CSDN博客)我们只是完成了基本的战斗,速度属性并没有真正的发生作用。现在我们加入速度属性。上一章我们说过,比如速度是1000的时候是每隔2秒钟攻击一次,但是服务器不能真的等两秒再计算攻击的结果,那么这个战斗的时长将会超过几分钟,用户也可能等这么久。那么这里要解决几个问题:

        第一个就是速度和出手间隔的换算,我们使用一个比较简单的公式,就是

interval = 500 + (int) (((1 - (speed) * 1.0 / (2000 + speed)) * (1 - (speed) * 1.0 / (2000 + speed))) * 5000);

        这样可以保证最短的出手时间是500,最长也不会超过5000。

       第二个问题就是根据速度插入到队列的问题,首先我们看下对于LinkedList队列的插入demo

public class Main {public static void main(String[] args) {LinkedList<Integer> queue = new LinkedList<>(); // 创建一个空的队列// 添加初始元素for (int i = 1; i <= 5; i++) {queue.addLast(i);}System.out.println("原始队列:" + queue);int targetIndex = 2; // 目标索引为2(从0开始计算)int elementToInsert = 99; // 要插入的元素值ListIterator<Integer> iterator = queue.listIterator();while (iterator.hasNext()) {if (targetIndex == 0) {iterator.next(); // 跳过第一个元素break;} else {iterator.next();targetIndex--;}if (!iterator.hasNext() && targetIndex > 0) {throw new IndexOutOfBoundsException("目标索引超出了队列长度");}}iterator.add(elementToInsert); // 在指定位置插入新元素System.out.println("插入元素后的队列:" + queue);}
}

运行后结果如下:

原始队列:[1, 2, 3, 4, 5]
插入元素后的队列:[1, 2, 3, 99, 4, 5]

那么根据这个方法我们来尝试改造战斗引擎。

       首先Action接口中增加一个interval()的方法,用于获取时间间隔,这个时间间隔是预计攻击时间距离战斗开始时间的间隔,例如计算出来的攻击间隔是500,那么每次计算的结果就是500,1000,1500,2000...以此类推。

public interface Action {boolean run();/**** 是否继续* @return*/boolean checkContinue();int speed();/***** @return*/int intervalTime();
}

   同时创建一个抽象类来抽象部分功能:

public abstract class Attack implements Action{private int intervalTime;private int speed;public int getIntervalTime() {return intervalTime;}public void setIntervalTime(int intervalTime) {this.intervalTime = intervalTime;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}@Overridepublic int intervalTime() {return intervalTime;}@Overridepublic int speed() {return speed;}public int computeInterval(int speed) {return 500 + (int) (((1 - (speed) * 1.0 / (2000 + speed))* (1 - (speed) * 1.0 / (2000 + speed))) * 5000);}
}

         修改 GroupAttack 在创建的时候要不是速度和间隔两个字段

public class GroupAttack extends Attack {private Hero heroA;private List<Hero> defenceList;public GroupAttack(Hero heroA, List<Hero> defenceList) {this.heroA = heroA;this.defenceList = defenceList;setIntervalTime(computeInterval(heroA.getSpeed()));setSpeed(heroA.getSpeed());}@Overridepublic boolean run() {// 自己血量少于0 返回if(heroA.getHp() > 0) {        // 遍历并找到血量最少的攻击defenceList = defenceList.stream().filter(e -> e.getHp() > 0).collect(Collectors.toList());if (!CollectionUtils.isEmpty(defenceList)) {defenceList.sort(Comparator.comparing(Hero::getHp));heroA.attack(defenceList.get(0));return true;}}return false;}@Overridepublic boolean checkContinue() {return heroA.getHp() > 0 && defenceList.stream().anyMatch(e -> e.getHp() > 0);}}

 最后我们再创建一个战斗服务:

public class BattleManyToManyTwo {// 队列不变private final LinkedList<Attack> actions = new LinkedList<>();private int addAction(Attack action){actions.offer(action);return actions.size();}public void fight(List<Hero> listA, List<Hero> listB) throws InterruptedException {// 先初始化listA.sort(Comparator.comparing(Hero::getSpeed).reversed());for (int i = 0; i < listA.size(); i++) {addAction(new GroupAttack(listA.get(i),listB));}// 再放入listBlistB.sort(Comparator.comparing(Hero::getSpeed).reversed());for (int i = 0; i < listB.size(); i++) {GroupAttack attack = new GroupAttack(listB.get(i), listA);insertAction(attack);}// 如果A集合和B集合的生命值都还大于0while(listA.stream().anyMatch(e -> e.getHp() > 0) && listB.stream().anyMatch(e -> e.getHp() > 0)) {Attack pop = actions.pop();boolean run = pop.run();if(run) {// 再放进去if (pop.checkContinue()) {// 要重新计算interval的时间pop.setIntervalTime(pop.getIntervalTime() + pop.computeInterval(pop.speed()));insertAction(pop);}// 打印System.out.println("A集团 :" + JSON.toJSONString(listA));System.out.println("B集团 :" + JSON.toJSONString(listB));}}if(listA.stream().anyMatch(e -> e.getHp() > 0)) {System.out.println("A集团 获胜:" + JSON.toJSONString(listA));}else{System.out.println("B集团 获胜:" + JSON.toJSONString(listB));}}private void insertAction(Attack attack) {int intervalTime = attack.getIntervalTime();// 如果第一个就大于attack的intervalif(actions.get(0).getIntervalTime() > attack.intervalTime()){// 在头插入一个actions.push(attack);}else {ListIterator<Attack> iterator = actions.listIterator();while (iterator.hasNext()) {Attack next = iterator.next();if (next.getIntervalTime() > intervalTime) {break;}}// 在指定位置插入新元素iterator.add(attack);}}public static void main(String[] args) throws InterruptedException {BattleManyToManyTwo battle = new BattleManyToManyTwo();Hero A = new Hero("A");Hero B = new Hero("B");B.setSpeed(2000);B.setAttack(20);Hero C = new Hero("C");C.setSpeed(500);C.setAttack(20);Hero D = new Hero("D");D.setSpeed(10);D.setAttack(15);battle.fight(Arrays.asList(A,C),Arrays.asList(B,D));}}

 运行main方法,查看效果:

B攻击,C生命值减少20
B攻击,C生命值减少20
C攻击,B生命值减少20
A攻击,B生命值减少10
B攻击,C生命值减少20
D攻击,C生命值减少15
C攻击,B生命值减少20
B攻击,C生命值减少20
B攻击,C生命值减少20
B攻击,A生命值减少20
A攻击,B生命值减少10
D攻击,A生命值减少15
B攻击,A生命值减少20
B攻击,A生命值减少20
B攻击,A生命值减少20
A攻击,B生命值减少10
D攻击,A生命值减少15
B集团 获胜:[{"attack":20,"hp":30,"name":"B","speed":2000},{"attack":15,"hp":100,"name":"D","speed":10}]Process finished with exit code 0

全部源码详见:

gitee : eternity-online: 多人在线mmo游戏 - Gitee.com

分支:step-11

请各位帅哥靓女帮忙去gitee上点个星星,谢谢!

http://www.yidumall.com/news/35613.html

相关文章:

  • 泸州做网站的公司网站怎样优化关键词好
  • 番禺网站建设报价seo赚钱暴利
  • rar在线解压网站百度网站收录入口
  • 网站优化软件下载成功的软文推广
  • 做网站运营需要学什么网站seo哪里做的好
  • 农产品的网站建设方案书范文什么是seo站内优化
  • 有没有做西餐的视频网站种子搜索神器在线引擎
  • 互联网站建设 天津网站优化怎么操作
  • 做服装行业网站怎么每天更新内容网站注册流程
  • 郑州网站建设qicaizz广州抖音推广
  • 免费购物商城网站建设网站如何推广运营
  • wordpress前台登录注册文章优化关键词排名
  • 为什么百度搜不到我的网站怎么根据视频链接找到网址
  • 仿 手机 网站模板html源码下载河南网站推广电话
  • 上海企业网站建设补贴好视通视频会议app下载安装
  • 学编程后悔死了长沙seo排名公司
  • 青岛开发区网站建设app开发平台
  • 重庆招标信息网官网查询seo优化专员
  • 网站模板做的比较好的四川企业seo推广
  • qq空间网站域名怎么做的杭州优化建筑设计
  • 闵行网站建设付费推广有几种方式
  • 江苏省建设协会网站福州短视频seo公司
  • 专门做二维码的网站整合营销案例举例说明
  • 北京网络网站建设seowhy
  • c .net怎么做网站企业seo自助建站系统
  • 网站建设选择什么模式网页制作的软件有哪些
  • 灵犀科技 高端网站建设背景图三明网站seo
  • 做网站都需要考虑哪些sem是什么意思呢
  • 金融网站建设内容建站推广
  • 网站里的地图定位怎么做友妙招链接