Преглед на файлове

根据概率随机获取奖励

sunkean преди 3 години
родител
ревизия
e21f21e295

+ 25 - 0
src/main/java/com/izouma/nineth/converter/MetaGameAwardConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.nineth.domain.MetaGameAward;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+
+public class MetaGameAwardConverter implements AttributeConverter<MetaGameAward, String> {
+
+    @Override
+    public String convertToDatabaseColumn(MetaGameAward fileObject) {
+        if (fileObject != null)
+            return JSON.toJSONString(fileObject);
+        return null;
+    }
+
+    @Override
+    public MetaGameAward convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseObject(s, MetaGameAward.class);
+        }
+        return null;
+    }
+}

+ 6 - 0
src/main/java/com/izouma/nineth/domain/MetaGameProcess.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.domain;
 
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.nineth.converter.CoordinateConverter;
+import com.izouma.nineth.converter.MetaGameAwardConverter;
 import com.izouma.nineth.converter.MetaZombieDTOListConverter;
 import com.izouma.nineth.dto.CoordinateDTO;
 import com.izouma.nineth.dto.MetaZombieDTO;
@@ -74,4 +75,9 @@ public class MetaGameProcess extends BaseEntity {
     @ExcelProperty("僵尸信息")
     private List<MetaZombieDTO> metaZombieDTOS;
 
+    @ApiModelProperty("玩家获取的奖励")
+    @ExcelProperty("玩家获取的奖励")
+    @Convert(converter = MetaGameAwardConverter.class)
+    private MetaGameAward metaGameAward;
+
 }

+ 11 - 0
src/main/java/com/izouma/nineth/service/MetaGameCopyService.java

@@ -10,6 +10,7 @@ import com.izouma.nineth.repo.MetaGameCopyRepo;
 import com.izouma.nineth.repo.MetaGameProcessRepo;
 import com.izouma.nineth.repo.MetaZombieRepo;
 import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.LotteryUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
@@ -57,6 +58,13 @@ public class MetaGameCopyService {
         if (Objects.isNull(metaGameProcess.getMetaGameCopyId())) {
             return MetaRestResult.returnError("Illegal parameter : metaGameCopyId can not be null");
         }
+        MetaGameCopy metaGameCopy = metaGameCopyRepo.findByIdAndDelAndPublish(metaGameProcess.getMetaGameCopyId(), false, true);
+        if (Objects.isNull(metaGameCopy)) {
+            return MetaRestResult.returnError("Illegal parameter : metaGameCopy can not be null");
+        }
+        if (CollectionUtils.isEmpty(metaGameCopy.getMetaGameAwards())) {
+            return MetaRestResult.returnError("Illegal parameter : metaGameAwards can not be null");
+        }
         if (Objects.isNull(metaGameProcess.getPlayerPos())) {
             return MetaRestResult.returnError("Illegal parameter : playerPos can not be null");
         }
@@ -90,6 +98,9 @@ public class MetaGameCopyService {
             }
         }
         metaGameProcess.setPoint(point);
+        if (metaGameProcess.isCompleted()) {
+            metaGameProcess.setMetaGameAward(LotteryUtils.lottery(metaGameCopy.getMetaGameAwards()));
+        }
         return MetaRestResult.returnSuccess(metaGameProcessRepo.save(metaGameProcess));
     }
 }

+ 30 - 0
src/main/java/com/izouma/nineth/utils/LotteryUtils.java

@@ -0,0 +1,30 @@
+package com.izouma.nineth.utils;
+
+import com.google.common.util.concurrent.AtomicDouble;
+import com.izouma.nineth.domain.MetaGameAward;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class LotteryUtils {
+    public static MetaGameAward lottery(List<MetaGameAward> metaGameAwards) {
+        int size = metaGameAwards.size();
+        AtomicDouble sumProbability = new AtomicDouble();
+        metaGameAwards.forEach(metaGameAward -> {
+            sumProbability.addAndGet(metaGameAward.getProbability());
+        });
+
+        List<Double> sortAwardProbabilityList = new ArrayList<>(size);
+        AtomicDouble tempSumProbability = new AtomicDouble();
+        metaGameAwards.forEach(metaGameAward -> {
+            tempSumProbability.addAndGet(metaGameAward.getProbability());
+            sortAwardProbabilityList.add(tempSumProbability.get() / sumProbability.get());
+        });
+        double randomDouble = Math.random();
+        sortAwardProbabilityList.add(randomDouble);
+        Collections.sort(sortAwardProbabilityList);
+        int lotteryIndex = sortAwardProbabilityList.indexOf(randomDouble);
+        return metaGameAwards.get(lotteryIndex);
+    }
+}

+ 1 - 1
src/main/java/com/izouma/nineth/utils/excel/ExcelUtils.java

@@ -27,7 +27,7 @@ public class ExcelUtils<T> {
                 .registerConverter(new CoordinateDTOConverter())
                 .registerConverter(new EntryModelTypeConverter())
                 .registerConverter(new GameCopyTypeConverter())
-                .registerConverter(new MetaGameAwardConverter())
+                .registerConverter(new MetaGameAwardExcelConverter())
                 .registerConverter(new MetaGameConverter())
                 .registerConverter(new MetaItemEnumConverter())
                 .registerConverter(new MetaRegionEnumConverter())

+ 1 - 1
src/main/java/com/izouma/nineth/utils/excel/MetaGameAwardConverter.java → src/main/java/com/izouma/nineth/utils/excel/MetaGameAwardExcelConverter.java

@@ -12,7 +12,7 @@ import org.apache.commons.lang3.StringUtils;
 import java.util.Objects;
 
 
-public class MetaGameAwardConverter implements Converter<MetaGameAward> {
+public class MetaGameAwardExcelConverter implements Converter<MetaGameAward> {
     @Override
     public Class supportJavaTypeKey() {
         return MetaGameAward.class;