Browse Source

银月:通过模板导入装备词条库

tangbin 1 year ago
parent
commit
349f589708

+ 1 - 1
logic/excel-logic/src/main/java/com/iohao/mmo/excel/kit/ConvertKit.java → logic/a-logic-common/src/main/java/com/iohao/mmo/common/kit/ConvertKit.java

@@ -1,4 +1,4 @@
-package com.iohao.mmo.excel.kit;
+package com.iohao.mmo.common.kit;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 40 - 0
logic/a-logic-common/src/main/java/com/iohao/mmo/common/kit/RandomKit.java

@@ -2,6 +2,7 @@ package com.iohao.mmo.common.kit;
 
 import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Random;
 import java.util.concurrent.ThreadLocalRandom;
 
@@ -62,4 +63,43 @@ public class RandomKit {
                 .intValue();
 
     }
+
+    /**
+     * 根据权重随机
+     * @param prizeWeightArr 权重集合
+     * @return 命中下标
+     *
+     */
+    public static int weightRandom(Integer[] prizeWeightArr) {
+        int random = -2;
+        try{
+            double sumWeight = 0;
+            //计算总权重
+            for(int prizeWeight : prizeWeightArr){
+                sumWeight += prizeWeight;
+            }
+            double randomNumber;
+            randomNumber = Math.random();
+            double d1 = 0;
+            double d2 = 0;
+
+            for(int i=0;i<prizeWeightArr.length;i++){
+                d2 += Double.parseDouble(String.valueOf(prizeWeightArr[i]))/sumWeight;
+                if(i==0){
+                    d1 = 0;
+                }else{
+                    d1 +=Double.parseDouble(String.valueOf(prizeWeightArr[i]))/sumWeight;
+                }
+                if(randomNumber >= d1 && randomNumber <= d2){
+                    random = i;
+                    break;
+                }
+            }
+        }catch(Exception e){
+            System.out.println(e.getMessage());
+            random = -1;
+        }
+        return random;
+    }
+
 }

+ 5 - 5
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipEntryTemplate.java

@@ -47,13 +47,13 @@ public class EquipEntryTemplate {
     String code;
     /** 描述 */
     String description;
-    /** 出现概率 */
-    BigDecimal hitProb;
+    /** 出现权重 */
+    int prizeWeight;
     /** 支持装备部位 */
     List<String> positionList;
-    /** 同一装备最多出现次数 */
-    int maxExist;
+    /** 同一批随机最多出现次数 */
+    int prizeAmount;
     /** 装备属性 */
-    @Singular(value = "entryProperty")
+//    @Singular(value = "entryProperty")
     List<EquipEntryProperty> entryPropertyList;
 }

+ 31 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/kit/EquipRandomKit.java

@@ -1,9 +1,13 @@
 package com.iohao.mmo.equip.kit;
 
 import com.iohao.mmo.common.kit.RandomKit;
+import com.iohao.mmo.equip.entity.EquipEntryTemplate;
+import com.iohao.mmo.equip.service.MathRandom;
 import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author 唐斌
@@ -60,14 +64,39 @@ public class EquipRandomKit {
 
     }
 
-
     /**
      * 本次是否生成极品
-     * @param addExcellentRate 极品率 0.0000-1.0000
+     * @param addExcellentRate 增益的极品率 0.000000-1.000000
      *
      * @return boolean
      */
     public static boolean isExcellent(BigDecimal addExcellentRate) {
         return RandomKit.isLuck(excellentRate.add(addExcellentRate));
     }
+
+    /**
+     * 根据权重随机
+     * @param equipEntryTemplateList 候选词条
+     * @param count 随机数量
+     * @return
+     */
+    public static List<EquipEntryTemplate> weightRandom(List<EquipEntryTemplate> equipEntryTemplateList,int count) {
+        //取出权重值数组
+        Integer[] prizeWeightArr = equipEntryTemplateList.stream().map(EquipEntryTemplate::getPrizeWeight).toArray(Integer[]::new);
+
+        List<EquipEntryTemplate> results = new ArrayList<>();
+        int[] indexCount = new int[equipEntryTemplateList.size()];
+
+        for (int i = 0; i <= count; i++)// 打印100个测试概率的准确性
+        {
+            int index = RandomKit.weightRandom(prizeWeightArr);
+            if(equipEntryTemplateList.get(index).getPrizeAmount()<=indexCount[index]){
+                i--;
+                continue;
+            }
+            indexCount[index] = indexCount[index] + 1;
+            results.add(equipEntryTemplateList.get(index));
+        }
+        return results;
+    }
 }

+ 35 - 120
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipEntryTemplateService.java

@@ -19,9 +19,11 @@
 package com.iohao.mmo.equip.service;
 
 import com.iohao.mmo.common.config.GameCode;
+import com.iohao.mmo.common.kit.ConvertKit;
 import com.iohao.mmo.common.provide.item.ItemTypeIdConst;
 import com.iohao.mmo.equip.entity.*;
 import com.iohao.mmo.equip.enums.PropertyNameEnum;
+import com.iohao.mmo.equip.kit.EquipRandomKit;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
@@ -31,7 +33,9 @@ import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 装备词条库
@@ -82,140 +86,51 @@ public class EquipEntryTemplateService {
         mongoTemplate.remove(query, EquipEntryTemplate.class);
     }
 
-
-    /**
-     * 初始化装备词条库(临时方法,后期移除改为从运营数据中导入)
-     */
-    public void initEquipTemplate() {
-//        // 初始化一些装备配置,后期将移到 excel 中做。
-//        EquipEntryTemplate equipEntryTemplate = EquipEntryTemplate.builder()
-//                .name("根骨")
-//                .code(PropertyNameEnum.GENGU.getCode())
-//                .description("根骨")
-//                .hitProb(BigDecimal.valueOf(0.10))
-//                .entryProperty(
-//                        EquipEntryProperty.builder()
-//                                .levelMin(1)
-//                                .levelMax(10)
-//                                .countType(1) // 属性计算方式(1装备加,2装备增加百分比,3全身增加百分比)
-//                                .showType(1) // 显示方式(1原值显示,2小数转百分比)
-//                                .effectPropertyName(PropertyNameEnum.GENGU.getCode())
-//                                .propertyValueMin(BigDecimal.valueOf(1))
-//                                .propertyValueMax(BigDecimal.valueOf(5))
-//                                .build()
-//                )
-//                .entryProperty(
-//                        EquipEntryProperty.builder()
-//                                .levelMin(11)
-//                                .levelMax(20)
-//                                .countType(1)
-//                                .showType(1)
-//                                .effectPropertyName(PropertyNameEnum.GENGU.getCode())
-//                                .propertyValueMin(BigDecimal.valueOf(4))
-//                                .propertyValueMax(BigDecimal.valueOf(10))
-//                                .build()
-//                )
-//                .entryProperty(
-//                        EquipEntryProperty.builder()
-//                                .levelMin(21)
-//                                .levelMax(30)
-//                                .countType(1)
-//                                .showType(1)
-//                                .effectPropertyName(PropertyNameEnum.GENGU.getCode())
-//                                .propertyValueMin(BigDecimal.valueOf(7))
-//                                .propertyValueMax(BigDecimal.valueOf(15))
-//                                .build()
-//                )
-//                .build();
-//        mongoTemplate.save(equipEntryTemplate);
-    }
-
     /**
-     * 根据装备等级、部位、数量 随机词条
-     * @param level 等级
+     * 根据装备部位、数量 随机词条模板
      * @param position 部位
      * @param count 随机数量
      * @return
      */
-    public List<EquipEntry> randomEquipBatch(int level,String position,int count){
+    public List<EquipEntryTemplate> randomEntryTemplateBatch(String position,int count){
         // 创建条件对象
         Criteria criteria = new Criteria();
-
-        criteria.and("levelMin").gte(level);
-        criteria.and("levelMax").gte(level);
         criteria.and("positionList").is(position);
 
         Query query = new Query();
         query.addCriteria(criteria);
 
-//        // 总记录数
-//        long total = mongoTemplate.count(query, EquipEntryTemplate.class);
-//        //查询返回指定字段 (自定义列表)
-//        query.fields().include("name", "code");
-//        // 分页
-//        query.with(PageRequest.of(bo.getPageNum() - 1, bo.getPageSize(),
-//        // 排序
-//        Sort.by(Sort.Order.desc("code"))));
+        List<EquipEntryTemplate> equipEntryTemplateList = mongoTemplate.find(query,EquipEntryTemplate.class);
+
+        return EquipRandomKit.weightRandom(equipEntryTemplateList,count);
+    }
 
-        List<EquipEntryTemplate> equipEntryList = mongoTemplate.find(query,EquipEntryTemplate.class);
+    /**
+     * 根据装备等级、部位、数量 随机词条
+     * @param level 等级
+     * @param position 部位
+     * @param count 随机数量
+     * @return
+     */
+    public List<EquipEntry> randomEntryBatch(int level,String position,int count){
+        List<EquipEntry> equipEntryList = new ArrayList<>();
+        List<EquipEntryTemplate> equipEntryTemplateList = randomEntryTemplateBatch(position,count);
+        for(EquipEntryTemplate equipEntryTemplate:equipEntryTemplateList){
+            EquipEntry equipEntry = ConvertKit.sourceToTarget(equipEntryTemplate, EquipEntry.class);
+            //筛选出符合条件的list
+            List<EquipEntryProperty> newEntryPropertyList = filterByStream(equipEntryTemplate.getEntryPropertyList(),level);
+            equipEntry.setEntryPropertyList(newEntryPropertyList);
+            equipEntryList.add(equipEntry);
+        }
+
+        return equipEntryList;
+    }
 
-        return null;
+    public List<EquipEntryProperty> filterByStream(List<EquipEntryProperty> equipEntryPropertyList,int level) {
+        return equipEntryPropertyList.stream()
+                .filter(equipEntryProperty -> equipEntryProperty.getLevelMin()<=level)
+                .filter(equipEntryProperty -> equipEntryProperty.getLevelMax()>=level)
+                .collect(Collectors.toList());
     }
 
-//    /**
-//     * 根据装备库列表批量随机新的装备
-//     * @param itemTypeIdList 物品分类标识列表
-//     * @param userId 用户id
-//     * @return
-//     */
-//    public List<Equip> randomEquipBatch(List<String> itemTypeIdList,long userId){
-//        List<Equip> equipList = itemTypeIdList.stream()
-//                .map(itemTypeId -> randomEquip(itemTypeId,userId))
-//                .toList();
-//        return equipList;
-//    }
-
-//    /**
-//     * 根据装备库随机一件新的装备
-//     * @param itemTypeId itemTypeId
-//     * @param userId 用户id
-//     * @return
-//     */
-//    public Equip randomEquip(String itemTypeId, long userId){
-//        //取到装备库
-//        EquipTemplate equipTemplate = findByItemTypeId(itemTypeId);
-//        GameCode.objNotFound.assertTrue(equipTemplate!=null,"找不到对应装备库");
-//        //将装备库属性拷贝到装备中
-//        Equip equip = copyTemplate2Equip(equipTemplate);
-//        equip.setUserId(userId);
-//        mongoTemplate.save(equip);
-//        return equip;
-//    }
-//
-//    /**
-//     * 根据需要拷贝装备库属性到装备
-//     * @param equipTemplate 装备库
-//     * @return
-//     */
-//    public Equip copyTemplate2Equip(EquipTemplate equipTemplate){
-//
-//        return Equip.builder()
-//                .itemTypeId(equipTemplate.getItemTypeId())
-//                .quality(0) //品质
-//                .fixedEquipProperty(
-//                        FixedEquipProperty.randomFixed(equipTemplate.getFixedEquipPropertyMin(),
-//                                equipTemplate.getFixedEquipPropertyMax())) //装备固定属性
-//                .attrTotal(0)
-//                .undistributedAttr(0)
-//                .elseEquipProperty(EquipPropertyElse.resetElseEquipProperty()) //初始化分配的具体属性点
-//                .position(equipTemplate.getPosition())
-//                .level(equipTemplate.getLevel())
-//                .identifyCount(0)
-//                .fixedEquipPropertyMin(equipTemplate.getFixedEquipPropertyMin())
-//                .fixedEquipPropertyMax(equipTemplate.getFixedEquipPropertyMax())
-//                .totalAttrMin(equipTemplate.getTotalAttrMin())
-//                .totalAttrMax(equipTemplate.getTotalAttrMax())
-//                .equipTemplateId(equipTemplate.getItemTypeId())
-//                .build();
-//    }
 }

+ 23 - 17
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipTemplateService.java

@@ -19,9 +19,11 @@
 package com.iohao.mmo.equip.service;
 
 import com.iohao.mmo.common.config.GameCode;
+import com.iohao.mmo.common.kit.RandomKit;
 import com.iohao.mmo.common.provide.item.ItemTypeIdConst;
 import com.iohao.mmo.equip.entity.*;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
@@ -41,6 +43,8 @@ public class EquipTemplateService {
 
     final MongoTemplate mongoTemplate;
 
+    final EquipEntryTemplateService equipEntryTemplateService;
+
     /**
      * 通过id查询装备库
      * @param id 装备库id
@@ -162,24 +166,26 @@ public class EquipTemplateService {
      * @return
      */
     public Equip copyTemplate2Equip(EquipTemplate equipTemplate){
-
+        int count = RandomKit.randomFromInt(equipTemplate.getEquipPropertyRandomMin(),equipTemplate.getEquipPropertyRandomMax());
+        List<EquipEntry> equipEntryList =equipEntryTemplateService.randomEntryBatch(equipTemplate.getLevel(),equipTemplate.getPosition(),count);
         return Equip.builder()
-//                .itemTypeId(equipTemplate.getItemTypeId())
-//                .quality(0) //品质
-//                .fixedEquipProperty(
-//                        FixedEquipProperty.randomFixed(equipTemplate.getFixedEquipPropertyMin(),
-//                                equipTemplate.getFixedEquipPropertyMax())) //装备固定属性
-//                .attrTotal(0)
-//                .undistributedAttr(0)
-//                .elseEquipProperty(EquipPropertyElse.resetElseEquipProperty()) //初始化分配的具体属性点
-//                .position(equipTemplate.getPosition())
-//                .level(equipTemplate.getLevel())
-//                .identifyCount(0)
-//                .fixedEquipPropertyMin(equipTemplate.getFixedEquipPropertyMin())
-//                .fixedEquipPropertyMax(equipTemplate.getFixedEquipPropertyMax())
-//                .totalAttrMin(equipTemplate.getTotalAttrMin())
-//                .totalAttrMax(equipTemplate.getTotalAttrMax())
-//                .equipTemplateId(equipTemplate.getItemTypeId())
+                .itemTypeId(equipTemplate.getItemTypeId())
+                .position(equipTemplate.getPosition())
+                .level(equipTemplate.getLevel())
+                .quality(equipTemplate.getQuality())
+                .durability(equipTemplate.getDurability())
+                .identifyBasicCount(0)
+                .identifyEntryCount(0)
+                .equipPropertyBasicMin(equipTemplate.getEquipPropertyBasicMin())
+                .equipPropertyBasicMax(equipTemplate.getEquipPropertyBasicMax())
+                .equipPropertyBasic(
+                        EquipPropertyBasic.randomFixed(
+                            equipTemplate.getEquipPropertyBasicMin(),
+                            equipTemplate.getEquipPropertyBasicMax()))
+                .equipPropertyFixedList(equipTemplate.getEquipPropertyFixedList())
+                .equipPropertyRandomMin(equipTemplate.getEquipPropertyRandomMin())
+                .equipPropertyRandomMax(equipTemplate.getEquipPropertyRandomMax())
+                .equipPropertyRandomList(equipEntryList)
                 .build();
     }
 }

+ 17 - 43
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/MathRandom.java

@@ -27,8 +27,7 @@ public class MathRandom {
      * @return int
      *
      */
-    public int PercentageRandom(List<RewardPrize> prizes) {
-        DecimalFormat df = new DecimalFormat("######0.00");
+    public int WeightRandom(List<RewardPrize> prizes) {
         int random = -2;
         try{
             double sumWeight = 0;
@@ -38,7 +37,6 @@ public class MathRandom {
             }
             double randomNumber;
             randomNumber = Math.random();
-//            System.out.println("randomNumber是:" + randomNumber);
             double d1 = 0;
             double d2 = 0;
 
@@ -51,8 +49,6 @@ public class MathRandom {
                 }
                 if(randomNumber >= d1 && randomNumber <= d2){
                     random = i;
-//                    System.out.println("d1是:" + d1);
-//                    System.out.println("d2是:" + d2);
                     break;
                 }
             }
@@ -70,42 +66,28 @@ public class MathRandom {
      * @param agrs
      */
     public static void main(String[] agrs) {
-        int i = 0;
         MathRandom a = new MathRandom();
         List<RewardPrize> prizes = new ArrayList();
+        List<RewardPrize> results = new ArrayList();
         prizes.add(new RewardPrize(10000,"一等奖",1,5));
-        prizes.add(new RewardPrize(10001,"二等奖",1,10));
-        prizes.add(new RewardPrize(10002,"四等奖",1,30));
-        prizes.add(new RewardPrize(10003,"三等奖",1,20));
-        prizes.add(new RewardPrize(10004,"安慰奖",1,35));
-//        for(int m=0;m<100;m++){
-//            RewardPrize rp = new RewardPrize();
-//            rp.setPrize_amount(10);//每个奖品数量设置10个
-//            rp.setPrize_weight(1);//每个奖品的权重都设置成1,也就是每个奖品被抽到的概率相同(可根据情况自行设置权重)
-//            prizes.add(rp);
-//        }
-        int num1Count = 0;
-        int num2Count = 0;
-        int num3Count = 0;
-        int num4Count = 0;
-        int num5Count = 0;
-        for (i = 0; i <= 1000000; i++)// 打印100个测试概率的准确性
+        prizes.add(new RewardPrize(10001,"二等奖",5,10));
+        prizes.add(new RewardPrize(10002,"四等奖",1000000,30));
+        prizes.add(new RewardPrize(10003,"三等奖",1000000,20));
+        prizes.add(new RewardPrize(10004,"安慰奖",1000000,35));
+
+        int[] indexCount = new int[prizes.size()];
+
+        for (int i = 0; i <= 850000; i++)// 打印100个测试概率的准确性
         {
-//            System.out.println(a.PercentageRandom(prizes));
-            int index = a.PercentageRandom(prizes);
-            if(index==0){
-                num1Count++;
-            }else if(index==1){
-                num2Count++;
-            }else if(index==2){
-                num3Count++;
-            }else if(index==3){
-                num4Count++;
-            }else if(index==4){
-                num5Count++;
+            int index = a.WeightRandom(prizes);
+            if(prizes.get(index).getPrize_amount()<=indexCount[index]){
+                i--;
+                continue;
             }
+            indexCount[index] = indexCount[index] + 1;
+            results.add(prizes.get(index));
         }
-        System.out.println(num1Count+"---"+num2Count+"---"+num3Count+"---"+num4Count+"---"+num5Count);
+        System.out.println(indexCount[0]+"---"+indexCount[1]+"---"+indexCount[2]+"---"+indexCount[3]+"---"+indexCount[4]);
 
     }
     public static class RewardPrize  {
@@ -114,14 +96,6 @@ public class MathRandom {
         private int prize_amount;//数量
         private int prize_weight;//权重
 
-        public int getRewardId() {
-            return rewardId;
-        }
-
-        public void setRewardId(int rewardId) {
-            this.rewardId = rewardId;
-        }
-
         public String getRewardName() {
             return rewardName;
         }

+ 0 - 170
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/WeightRandomTemplate.java

@@ -1,170 +0,0 @@
-package com.iohao.mmo.equip.service;
-
-/**
- * @author 唐斌
- * @date 2023-08-31
- * @description:
- */
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ThreadLocalRandom;
-
-/**
- * @author:linxu
- * @Date:2020-7-24 00:09:54
- */
-public class WeightRandomTemplate {
-
-    public static void main(String[] args) {
-        List<DefaultWeightWrap> rewardWraps = new ArrayList<>();
-        rewardWraps.add(new RewardWrap(12881, "一等奖", 1, 1, 5));
-        rewardWraps.add(new RewardWrap(12882, "二等奖", 1, 2, 10));
-        rewardWraps.add(new RewardWrap(12883, "三等奖", 1, 3, 25));
-        //默认奖励,如果抽不到奖,默认抽中安慰奖【参与奖】
-        RewardWrap rewardWrap = new RewardWrap(12884, "安慰奖", 1, 4, 60);
-        rewardWraps.add(rewardWrap);
-
-        WeightRandom<DefaultWeightWrap> weightRandom = new WeightRandom<>(rewardWraps);
-        int num1Count = 0;
-        int num2Count = 0;
-        int num3Count = 0;
-        int num4Count = 0;
-        //模拟抽奖二十次【第一种方式调用】
-        for (int i = 0; i < 1000000; i++) {
-            RewardWrap rewardWrapRandom = (RewardWrap) weightRandom.randomWeightWrap();
-            if(rewardWrapRandom.rank==1){
-                num1Count++;
-            }else if(rewardWrapRandom.rank==2){
-                num2Count++;
-            }else if(rewardWrapRandom.rank==3){
-                num3Count++;
-            }else if(rewardWrapRandom.rank==4){
-                num4Count++;
-            }
-        }
-        System.out.println(num1Count+"---"+num2Count+"---"+num3Count+"---"+num4Count);
-        int num11Count = 0;
-        int num12Count = 0;
-        int num13Count = 0;
-        int num14Count = 0;
-        //模拟抽奖二十次【第二种方式调用】
-        for (int i = 0; i < 1000000; i++) {
-            RewardWrap rewardWrapRandom = (RewardWrap) weightRandom(new IWeightRandom<DefaultWeightWrap>() {
-                @Override
-                public List<DefaultWeightWrap> applyWraps() {
-                    return rewardWraps;
-                }
-                @Override
-                public DefaultWeightWrap applyDefaultWrap() {
-                    return rewardWrap;
-                }
-            });
-            if(rewardWrapRandom.rank==1){
-                num11Count++;
-            }else if(rewardWrapRandom.rank==2){
-                num12Count++;
-            }else if(rewardWrapRandom.rank==3){
-                num13Count++;
-            }else if(rewardWrapRandom.rank==4){
-                num14Count++;
-            }
-//            System.out.println(rewardWrapRandom.toString());
-        }
-        System.out.println(num11Count+"----"+num12Count+"----"+num13Count+"----"+num14Count);
-
-    }
-
-    //测试实现类
-    public static class RewardWrap extends DefaultWeightWrap {
-        private int rewardId;//奖励id
-        private String rewardName;//奖励名称
-        private int rewardValue;//数量
-        private int rank;//奖励排名1等奖,2等奖
-        public RewardWrap(int rewardId, String rewardName, int rewardValue, int rank, int weight) {
-            this.rewardName = rewardName;
-            this.rewardValue = rewardValue;
-            this.rewardId = rewardId;
-            this.rank = rank;
-            this.weight = weight;
-        }
-        public int getRewardId() {
-            return rewardId;
-        }
-        public void setRewardId(int rewardId) {
-            this.rewardId = rewardId;
-        }
-        public int getRank() {
-            return rank;
-        }
-        public void setRank(int rank) {
-            this.rank = rank;
-        }
-        @Override
-        public String toString() {
-            return "Reward{" +
-                    "rewardId=" + rewardId +
-                    ", rewardName='" + rewardName + '\'' +
-                    ", rewardValue=" + rewardValue +
-                    ", rank=" + rank +
-                    '}';
-        }
-    }
-
-    /**
-     * 方式1【创建对象调用的方式】
-     *
-     * @param <T>
-     */
-    public static class WeightRandom<T extends DefaultWeightWrap> {
-        private List<T> content;//目标集合数据
-
-        public WeightRandom(List<T> content) {
-            this.content = content;
-        }
-
-        public T randomWeightWrap() {
-            int s = content.stream().mapToInt(DefaultWeightWrap::getWeight).sum();
-            int r = ThreadLocalRandom.current().nextInt(s);
-            Optional<T> o = content.stream().filter(t -> {
-                int result = r - t.getWeight();
-                return result < 0;
-            }).findFirst();
-            return o.orElse(null);
-        }
-    }
-    /**
-     * 方式2【静态方法,内部实现接口方式的调用】
-     *
-     * @param iWeightRandom
-     * @param <T>
-     * @return
-     */
-    public static <T extends DefaultWeightWrap> T weightRandom(IWeightRandom<T> iWeightRandom) {
-        int s = iWeightRandom.applyWraps().stream().mapToInt(DefaultWeightWrap::getWeight).sum();
-        int r = ThreadLocalRandom.current().nextInt(s);
-        Optional<T> o = iWeightRandom.applyWraps().stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();
-        return o.orElse(iWeightRandom.applyDefaultWrap());
-    }
-    public interface IWeightRandom<T extends WeightRandomTemplate.DefaultWeightWrap> {
-        List<T> applyWraps();//目标集合数据
-
-        T applyDefaultWrap();//默认返回值【参与奖励】
-    }
-
-    //权重包装基类
-    public static abstract class DefaultWeightWrap {
-        public int weight;//权重
-
-        public int getWeight() {
-            return weight;
-        }
-
-        @Override
-        public String toString() {
-            return "DefaultWeightWrap{" +
-                    "weight=" + weight +
-                    '}';
-        }
-    }
-}

+ 0 - 172
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/WeightRandomTemplate2.java

@@ -1,172 +0,0 @@
-package com.iohao.mmo.equip.service;
-
-/**
- * @author 唐斌
- * @date 2023-08-31
- * @description:
- */
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ThreadLocalRandom;
-
-/**
- * @author:linxu
- * @Date:2020-7-24 00:09:54
- */
-public class WeightRandomTemplate2 {
-
-    public static void main(String[] args) {
-        List<DefaultWeightWrap> rewardWraps = new ArrayList<>();
-        rewardWraps.add(new RewardWrap(12881, "一等奖", 1, 1, 5));
-        rewardWraps.add(new RewardWrap(12882, "二等奖", 1, 2, 10));
-        rewardWraps.add(new RewardWrap(12883, "三等奖", 1, 3, 25));
-        //默认奖励,如果抽不到奖,默认抽中安慰奖【参与奖】
-        RewardWrap rewardWrap = new RewardWrap(12884, "安慰奖", 1, 4, 60);
-        rewardWraps.add(rewardWrap);
-
-        WeightRandom<DefaultWeightWrap> weightRandom = new WeightRandom<>(rewardWraps, rewardWrap);
-        int num1Count = 0;
-        int num2Count = 0;
-        int num3Count = 0;
-        int num4Count = 0;
-        //模拟抽奖二十次【第一种方式调用】
-        for (int i = 0; i < 1000000; i++) {
-            RewardWrap rewardWrapRandom = (RewardWrap) weightRandom.randomWeightWrap();
-            if(rewardWrapRandom.rank==1){
-                num1Count++;
-            }else if(rewardWrapRandom.rank==2){
-                num2Count++;
-            }else if(rewardWrapRandom.rank==3){
-                num3Count++;
-            }else if(rewardWrapRandom.rank==4){
-                num4Count++;
-            }
-        }
-        System.out.println(num1Count+"---"+num2Count+"---"+num3Count+"---"+num4Count);
-        int num11Count = 0;
-        int num12Count = 0;
-        int num13Count = 0;
-        int num14Count = 0;
-        //模拟抽奖二十次【第二种方式调用】
-        for (int i = 0; i < 1000000; i++) {
-            RewardWrap rewardWrapRandom = (RewardWrap) weightRandom(new IWeightRandom<DefaultWeightWrap>() {
-                @Override
-                public List<DefaultWeightWrap> applyWraps() {
-                    return rewardWraps;
-                }
-                @Override
-                public DefaultWeightWrap applyDefaultWrap() {
-                    return rewardWrap;
-                }
-            });
-            if(rewardWrapRandom.rank==1){
-                num11Count++;
-            }else if(rewardWrapRandom.rank==2){
-                num12Count++;
-            }else if(rewardWrapRandom.rank==3){
-                num13Count++;
-            }else if(rewardWrapRandom.rank==4){
-                num14Count++;
-            }
-//            System.out.println(rewardWrapRandom.toString());
-        }
-        System.out.println(num11Count+"----"+num12Count+"----"+num13Count+"----"+num14Count);
-
-    }
-
-    //测试实现类
-    public static class RewardWrap extends DefaultWeightWrap {
-        private int rewardId;//奖励id
-        private String rewardName;//奖励名称
-        private int rewardValue;//数量
-        private int rank;//奖励排名1等奖,2等奖
-        public RewardWrap(int rewardId, String rewardName, int rewardValue, int rank, int weight) {
-            this.rewardName = rewardName;
-            this.rewardValue = rewardValue;
-            this.rewardId = rewardId;
-            this.rank = rank;
-            this.weight = weight;
-        }
-        public int getRewardId() {
-            return rewardId;
-        }
-        public void setRewardId(int rewardId) {
-            this.rewardId = rewardId;
-        }
-        public int getRank() {
-            return rank;
-        }
-        public void setRank(int rank) {
-            this.rank = rank;
-        }
-        @Override
-        public String toString() {
-            return "Reward{" +
-                    "rewardId=" + rewardId +
-                    ", rewardName='" + rewardName + '\'' +
-                    ", rewardValue=" + rewardValue +
-                    ", rank=" + rank +
-                    '}';
-        }
-    }
-
-    /**
-     * 方式1【创建对象调用的方式】
-     *
-     * @param <T>
-     */
-    public static class WeightRandom<T extends DefaultWeightWrap> {
-        private List<T> content;//目标集合数据
-        private T defaultResult;//默认返回值【参与奖励】
-
-        public WeightRandom(List<T> content, T defaultResult) {
-            this.content = content;
-            this.defaultResult = defaultResult;
-        }
-
-        public T randomWeightWrap() {
-            int s = content.stream().mapToInt(DefaultWeightWrap::getWeight).sum();
-            int r = ThreadLocalRandom.current().nextInt(s);
-            Optional<T> o = content.stream().filter(t -> {
-                int result = r - t.getWeight();
-                return result < 0;
-            }).findFirst();
-            return o.orElse(defaultResult);
-        }
-    }
-    /**
-     * 方式2【静态方法,内部实现接口方式的调用】
-     *
-     * @param iWeightRandom
-     * @param <T>
-     * @return
-     */
-    public static <T extends DefaultWeightWrap> T weightRandom(IWeightRandom<T> iWeightRandom) {
-        int s = iWeightRandom.applyWraps().stream().mapToInt(DefaultWeightWrap::getWeight).sum();
-        int r = ThreadLocalRandom.current().nextInt(s);
-        Optional<T> o = iWeightRandom.applyWraps().stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();
-        return o.orElse(iWeightRandom.applyDefaultWrap());
-    }
-    public interface IWeightRandom<T extends WeightRandomTemplate2.DefaultWeightWrap> {
-        List<T> applyWraps();//目标集合数据
-
-        T applyDefaultWrap();//默认返回值【参与奖励】
-    }
-
-    //权重包装基类
-    public static abstract class DefaultWeightWrap {
-        public int weight;//权重
-
-        public int getWeight() {
-            return weight;
-        }
-
-        @Override
-        public String toString() {
-            return "DefaultWeightWrap{" +
-                    "weight=" + weight +
-                    '}';
-        }
-    }
-}