Ryu.log

[ Riot Games API 활용 전적 검색 App 06] - MMR 구현 본문

Prev-content

[ Riot Games API 활용 전적 검색 App 06] - MMR 구현

류뚝딱 2018. 7. 5. 16:53


mmr 점수란? 해당게임내에서 자신의 기여도 ?  손 빠르기 ? 라고 이해하면 되려나..?

아무튼 이 mmr 이란 것은 lol에서 무진장 중요한 기준? 이다.

mmr에 따라서 상대가 매칭되는데 이 mmr을 계산하는 식은 Riot 만이 알고 있다.. 물론 비공개이다.


나는 최대한 op.gg에 맞게 mmr을 맞추었다.


  • mmr점수 구현   v 


01. MMR 점수 구현


op.gg에서는 MMR 점수가 위와같이 표현된다.

이 점수를 통해서 자신의 실력을 가늠할 수 있으며, MMR이 높을수록 높은 티어의 상대와 매칭이된다.

op.gg에서는 MMR을 구현 함에 있어서 매경기마다 점수를 매긴 뒤 (예를 들자면 K/D/A, 와드 설치 수, 연승횟수 등등..) 

최근 몇경기의 평균을내서 저렇게 평균 MMR점수를 출력 하는 것 같다.


하지만 내가 그렇게한다면  엄청난 시간과 분석과... 음.. op.gg처럼 상용서비스가 아니기때문에 비슷하게만 구현해볼 것이다.

 const defaultMMR = [
    { "mmr" : 1000, "tier" : "bronze", "rank": 5 },
    { "mmr" : 1050, "tier" : "bronze", "rank": 4 },
    { "mmr" : 1100, "tier" : "bronze", "rank": 3 },
    { "mmr" : 1150, "tier" : "bronze", "rank": 2 },
    { "mmr" : 1200, "tier" : "bronze", "rank": 1 },
    { "mmr" : 1250, "tier" : "silver", "rank": 5 },
    { "mmr" : 1300, "tier" : "silver", "rank": 4 },
    { "mmr" : 1350, "tier" : "silver", "rank": 3 },
    { "mmr" : 1400, "tier" : "silver", "rank": 2 },
    { "mmr" : 1450, "tier" : "silver", "rank": 1 },
    { "mmr" : 1500, "tier" : "gold", "rank": 5 },
    { "mmr" : 1550, "tier" : "gold", "rank": 4 },
    { "mmr" : 1600, "tier" : "gold", "rank": 3 },
    { "mmr" : 1650, "tier" : "gold", "rank": 2 },
    { "mmr" : 1700, "tier" : "gold", "rank": 1 },
    { "mmr" : 1750, "tier" : "platinum", "rank": 5 },
    { "mmr" : 1800, "tier" : "platinum", "rank": 4 },
    { "mmr" : 1850, "tier" : "platinum", "rank": 3 },
    { "mmr" : 1900, "tier" : "platinum", "rank": 2 },
    { "mmr" : 1950, "tier" : "platinum", "rank": 1 },
    { "mmr" : 2000, "tier" : "diamond", "rank": 5 },
    { "mmr" : 2050, "tier" : "diamond", "rank": 4 },
    { "mmr" : 2100, "tier" : "diamond", "rank": 3 },
    { "mmr" : 2150, "tier" : "diamond", "rank": 2 },
    { "mmr" : 2200, "tier" : "diamond", "rank": 1 },
    { "mmr" : 2250, "tier" : "master", "rank": 1 },
    { "mmr" : 2700, "tier" : "challenger", "rank": 1 },
] 

먼저 각 티어 마다 위와같이 기본 MMR을 설정한다. 

그리고 나의 랭크와 일치하는 MMR값을 가지고온다.

예를 들어서 현재 나의 랭크가 골드 5라면 MMR은 1500인 것이다.


허나 이정도로만 한다면 이사람이 잘하는지 못하는지는 알 수 없을 것이다.

그리하여 아래와 같은 함수를 만들었다.

const GetUserMMR = {
    getWinningRateMMR : (winningRate) => (winningRate - 50) * 20,
    getTierMMR : (league, rank) => defaultMMR.filter(item => item.tier === league.tier.toLowerCase() && item.rank === rank),
    getCommntData : (mmrData, league, rank) => {
        let myMMRcomment = ''; 
        let checkMMR = mmrData - GetUserMMR.getTierMMR(league, rank)[0].mmr;
        if(checkMMR <= -50){
            myMMRcomment = 'MMR이 매우 낮습니다! 팀원들에게 민폐입니다!'; 
        }else if(checkMMR < 0){
            myMMRcomment = '평균보다 MMR이 낮습니다. 강등에 주의하세요.';
        }else if(checkMMR < 25){
            myMMRcomment = 'MMR이 보통 수준입니다. 분발하세요.';
        }else if(checkMMR < 0){
            myMMRcomment = '평균보다 MMR이 높습니다. 자질이 보이는군요?';
        }else{
            myMMRcomment = '매우 좋습니다! 이 리그의 수준이 아니시군요?';
        }
        return myMMRcomment;
    }
}

getWinningRateMMR () 함수는 사용자의 랭크 승률을( 승률을 구하는 법은 (승리 / 전체게임) * 100 이다 ) 파라미터로 받는다.

getWinningRateMMR () 함수를 잘 보면 결과 값은 +값일 수도있고 - 값일 수도있다 승률에 따라 추가점수를 구하는 공식인것이다.


getTierMMR () 함수는 리그데이터와 랭크데이터를 파라미터로 받은 뒤,

처음에 선언된 defaultMMR 변수에 담긴 Data에서 본인의 티어/랭크 와 맞는 MMR 값을 리턴 해준다.


getCommentData () 함수는 기본 MMR과 위의 두함수에서 도출해낸 결과값 MMR을 비교하여 적당한 코멘트를 리턴 해준다.


이러한 방식을 통해서 출력된 MMR값은 아래와 같이 Component에 구성된다.



Comments