瀏覽代碼

怪物掉落物品算法计算新增了通过概率数组计算命中的方法

tangbin 1 年之前
父節點
當前提交
4f39cff6ad

+ 0 - 2
kioor-api/src/main/java/com/kioor/dto/Monster2GoodsDTO.java

@@ -12,8 +12,6 @@ package com.kioor.dto;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
 import java.math.BigDecimal;
 
 /**

+ 46 - 13
kioor-api/src/main/java/com/kioor/utils/RandomUtils.java

@@ -1,7 +1,6 @@
 package com.kioor.utils;
 
 import com.kioor.dto.Monster2GoodsDTO;
-
 import com.github.javafaker.Faker;
 import java.math.BigDecimal;
 import java.util.*;
@@ -25,9 +24,9 @@ public class RandomUtils {
     private static final ThreadLocalRandom RANDOM =
             ThreadLocalRandom.current();
     /**
-     * 怪物掉落物品计算
-     * @param monster2GoodsDTOList
-     * @return
+     * 怪物掉落物品计算(对象列表)
+     * @param monster2GoodsDTOList 对象列表
+     * @return 筛选后的对象列表
      */
     public static List<Monster2GoodsDTO> obtainGoods(List<Monster2GoodsDTO> monster2GoodsDTOList){
         List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
@@ -38,10 +37,30 @@ public class RandomUtils {
         }
         return backMonster2GoodsDTOList;
     }
+
+
+    /**
+     * 怪物掉落物品计算(数组)
+     * @param propArr 将概率按照顺序放入数组
+     * @return 命中的数组下标
+     */
+    public static int[] obtainGoods(BigDecimal[] propArr){
+        StringBuffer indexStr = new StringBuffer();
+        List<Monster2GoodsDTO> backMonster2GoodsDTOList = new ArrayList<>();
+        for(int i=0;i<propArr.length;i++){
+            if(isLuck(propArr[i])){
+                indexStr.append(i).append(",");
+            }
+        }
+        if(indexStr.length()==0){
+            return new int[0];
+        }
+        return Arrays.asList(indexStr.toString().split(",")).stream().mapToInt(Integer::parseInt).toArray();
+    }
     /**
      * 由概率随机是否触发
      *
-     * @param chance 0.00 - 100.00
+     * @param chance 0.000000 - 1.000000
      * @return boolean
      */
     public static final boolean isLuck(BigDecimal chance) {
@@ -52,10 +71,14 @@ public class RandomUtils {
     }
 
     public static void main(String[] args) {
+
+        /**
+         * 怪物掉落物品计算(对象列表)
+         */
         List<Monster2GoodsDTO> monster2GoodsDTOList = new ArrayList<>();
 
-        Monster2GoodsDTO monster2GoodsDTO = new Monster2GoodsDTO(1000000L,"金疮药",new BigDecimal("0.100000"));
-        monster2GoodsDTOList.add(monster2GoodsDTO);
+        Monster2GoodsDTO monster2GoodsDTO1 = new Monster2GoodsDTO(1000000L,"金疮药",new BigDecimal("0.100000"));
+        monster2GoodsDTOList.add(monster2GoodsDTO1);
 
         Monster2GoodsDTO monster2GoodsDTO2 = new Monster2GoodsDTO(1000001L,"柿饼",new BigDecimal("0.100000"));
         monster2GoodsDTOList.add(monster2GoodsDTO2);
@@ -72,7 +95,7 @@ public class RandomUtils {
         Monster2GoodsDTO monster2GoodsDTO6 = new Monster2GoodsDTO(2000003L,"青铜戒",new BigDecimal("0.010000"));
         monster2GoodsDTOList.add(monster2GoodsDTO6);
 
-        Monster2GoodsDTO monster2GoodsDTO7 = new Monster2GoodsDTO(2000004L,"青铜镯",new BigDecimal("0.010000"));
+        Monster2GoodsDTO monster2GoodsDTO7 = new Monster2GoodsDTO(2000004L,"青铜镯",new BigDecimal("0.910000"));
         monster2GoodsDTOList.add(monster2GoodsDTO7);
 
         Monster2GoodsDTO monster2GoodsDTO8 = new Monster2GoodsDTO(2000005L,"青铜项链",new BigDecimal("0.010000"));
@@ -87,11 +110,11 @@ public class RandomUtils {
         Monster2GoodsDTO monster2GoodsDTO11 = new Monster2GoodsDTO(2000008L,"青铜刀",new BigDecimal("0.010000"));
         monster2GoodsDTOList.add(monster2GoodsDTO11);
 
-        //单次测试
-        List<Monster2GoodsDTO> backMonster2GoodsDTOList1 = obtainGoods(monster2GoodsDTOList);
-        for(Monster2GoodsDTO backMonster2GoodsDTO:backMonster2GoodsDTOList1) {
-            System.out.println(backMonster2GoodsDTO.getGoodsName());
-        }
+//        //单次测试
+//        List<Monster2GoodsDTO> backMonster2GoodsDTOList1 = obtainGoods(monster2GoodsDTOList);
+//        for(Monster2GoodsDTO backMonster2GoodsDTO:backMonster2GoodsDTOList1) {
+//            System.out.println(backMonster2GoodsDTO.getGoodsName());
+//        }
 
         //批量测试
 //        int count = 100;
@@ -109,5 +132,15 @@ public class RandomUtils {
 //        result.forEach((key,value)->{
 //            System.out.println(key+":"+value);
 //        });
+
+        /**
+         * 怪物掉落物品计算(数组)
+         */
+        BigDecimal[] propArr = new BigDecimal[monster2GoodsDTOList.size()];
+        for(int i=0;i<monster2GoodsDTOList.size();i++){
+            propArr[i] = monster2GoodsDTOList.get(i).getGoodsProb();
+        }
+        int[] resultIndex = obtainGoods(propArr);
+        System.out.println(Arrays.toString(resultIndex));
     }
 }