最近打王者被制裁的有点惨,突发奇想,用代码实现下王者的匹配机制。先声明,我不是什么算法大神,轻喷。
分析:王者匹配机制会让一个人的胜率总是保持在50%左右,即胜率高了,给你匹配坑队友降低胜率,低了给你匹配几个大神带你飞。
围绕这个点,进行设计。大概思路为:设置一个隐藏分,如果你的隐藏分高于当前段位,就给你降低胜率,反正则提升胜率,具体代码实现如下。
玩家模型类
package com.ty.atlantis.base.kingofglorymodel;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @author :TianYuan
* @date :Created in 2022/3/25 14:51
* @description:高端玩家模型
* @modified By:
*/
public class HighEndPlayer {
/**
* 排位段位和战力息息相关。
* 此处采用的简易算法是:
* 假设玩家初始段位为钻石50,战力为5000,赢一把mvp后段位为51,战力为5000+130=5130
* 51段位对应的战力为5100。为了修正段位对应的战力,系统会匹配几个坑货降低胜率
*/
//排位段位 假设初始为钻石5/0星。枚举值为50
private int rankLevel = 50;
//战力(隐藏分),默认5000,正常输一把减105,正常赢一把加110。败方MVP不减,赢方Mvp加130
private long flightPower = 5000;
//活跃度,默认80,上限100。玩家连续上线每天+5,一天不上线-2,当连续不上线活跃度掉到70就不再减
private int activity = 80;
//贵族等级
private int vipLevel;
//氪金总额
private BigDecimal amount;
public String getRankLevelMean(int rankLevel){
Map<Integer,String> map = new HashMap<>();
map.put(39,"铂金二零星");
map.put(40,"铂金二一星");
map.put(41,"铂金二二星");
map.put(42,"铂金二三星");
map.put(43,"铂金二四星");
map.put(44,"铂金二五星");
map.put(45,"铂金一一星");
map.put(46,"铂金一二星");
map.put(47,"铂金一三星");
map.put(48,"铂金一四星");
map.put(49,"铂金一五星");
map.put(50,"钻石五零星");
map.put(51,"钻石五一星");
map.put(52,"钻石五二星");
map.put(53,"钻石五三星");
map.put(54,"钻石五四星");
map.put(55,"钻石五五星");
map.put(56,"钻石四零星");
map.put(57,"钻石四一星");
map.put(58,"钻石四二星");
map.put(59,"钻石四三星");
map.put(60,"钻石四四星");
map.put(61,"钻石四五星");
map.put(62,"钻石三零星");
map.put(63,"钻石三一星");
map.put(64,"钻石三二星");
map.put(65,"钻石三三星");
map.put(66,"钻石三四星");
map.put(67,"钻石三五星");
map.put(68,"钻石二零星");
map.put(69,"钻石二一星");
map.put(70,"钻石二二星");
map.put(71,"钻石二三星");
map.put(72,"钻石二四星");
map.put(73,"钻石二五星");
map.put(74,"钻石一零星");
map.put(75,"钻石二一星");
map.put(76,"钻石一二星");
map.put(77,"钻石一三星");
map.put(78,"钻石一四星");
map.put(78,"钻石一五星");
return map.get(rankLevel);
}
public int getRankLevel() {
return rankLevel;
}
public void setRankLevel(int rankLevel) {
this.rankLevel = rankLevel;
}
public long getFlightPower() {
return flightP