Skip to content

jdy0120/divisionTeam

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

롤 내전 팀나눠주는 웹앱

이 프로젝트는 리그오브레전드 5:5로 인원을 밸런스에 맞춰 나눠주기위해 개발했습니다.

https://jdy0120.github.io/divisionTeam/ 에서 직접 사용해보실 수 있습니다.

요구조건

1. 5:5로 팀을 나누며 밸런스가 가장 좋아야한다.

2. 리그오브레전드에는 라인(탑,정글,미드,원딜,서폿)이라는 개념이 있다. 같은 팀에 같은라인을 가는 팀원이 최대한 없도록 설계해야한다.

3. 같이 팀하고 싶은 유저들이 있다. 이 유저는 같은 팀으로 배치해야한다.

4. 멀티서치가 가능해야한다.

5. 게임안에서 블루팀이 유리한 점이 많다.(챔피언 선택 우선권, 챔피언 벤 우선권, *7시방향에서 시작) 나눈 팀중에 평균mmr이 낮은 팀은 블루팀으로 배정하고 만약 두 팀의 mmr이 똑같다면 검색순서가 빠른 팀이 브르루팀으로 간다.

* 7시방향에서 시작이 유리한 이유는 다음 링크를 참조해주세요 : https://www.youtube.com/watch?v=-gUSxnXClgc

요구충족

1. 5:5로 팀을 나누며 밸런스가 가장 좋아야한다.

⓵ 각 선수의 mmr을 측정하기로 했습니다.

리그오브레전드는 2015년 이후로 랭크게임mmr을 제공해주지 않고 있습니다. 그렇기에 직접 계산해야했습니다. 처음 생각한 mmr측정방법은 많은 게임에서 사용하고 있는 Elo rating이었습니다.

하지만 Elo rating을 사용하기 위해선 각 선수의 모든 전적을 활용해야했고 그 선수와 게임했던 모든 선수의 전적이 필요했습니다. (정확한 레이팅 측정을 위해) 계산이 복잡하고 연산이 많다는 것은 정확성에서 좋을 수 있지만 연산 시간이 많이 걸리고 무엇보다 자원이 많이 필요하다는 것이었습니다.

그렇기에 2014년도에 한 유저가 계산한 정확도 높은 mmr계산법을 이용해 간단한 mmr계산을 했습니다. 계산법은 이렇습니다.


각 티어의 기본 mmr

아이언 : 450 ~ 750

브론즈 : 800 ~ 1100

실버 : 1150 ~ 1450

골드 : 1500 ~ 1800

플레티넘 : 1850 ~ 2150

다이아몬드 : 2200 ~ 2500

마스터 : 2550 ~ 3050

그랜드마스터,챌린저 : 3100 ~ +point

리그오브레전드에서 받아올 수 있는 사용자 정보를 사용했습니다. 승리수,패배수,유저의 티어

MMR = (유저의 티어에 해당하는 기본 MMR) + (승률-50)*(판수에 따른 가산점)


판수에 따른 가산점 : 판수가 많을수록 mmr이 조금 오르고 판수가 적을수록 mmr이 많이 오릅니다. (이는 리그오브 레전드에서 판수가 적을수록 승리에 따른 점수가 높게 책정되는 시스템을 보고 만들었습니다.)

⓶ 5:5로 나누기 많은 알고리즘을 생각했지만 지금 만드는 프로젝트에는 '선수가 선호하는 라인이 있다.', '같은 팀을 해야만하는 유저가 있다.' 요구조건이 있기 때문에 2^10=1024인 모든 경우의 수를 생각하기로 했습니다.

비트마스크를 이용해 range를 0이상 1<<10미만 까지로 정하였고 모든 경우의 선수총합MMR을 저장했습니다.

2. 리그오브레전드에는 라인(탑,정글,미드,원딜,서폿)이라는 개념이 있다. 같은 팀에 같은라인을 가는 팀원이 최대한 없도록 설계해야한다.

총 6개의 포지션으로 나눴습니다. 탑,정글,미드,원딜,서폿,상관없음

우선 가장선호하는 라인을 모든 선수가 입력했다고 했을 경우 같은 라인을 가는 유저가 3명이상 있을 수 있습니다. 이 경우 2명을 제외하고 모두 '상관없음'으로 포지션을 설정했습니다.

5:5로 나누는 연산에 백트래킹을 집어 넣었습니다. 같은 팀에 같은 라인을 선호하는 유저가 있다면 return false를 해줬습니다.

3. 같이 팀하고 싶은 유저들이 있다. 이 유저는 같은 팀으로 배치해야한다.

같이 팀하고 싶어하는 유저의 고유아이디를 묶어서 한 배열에 저장했습니다. 배열에 있는 유저의 고유아디이를 발견하면 같은 배열에 있는 유저또한 같은 팀에 있는지 확인하고 하나라도 없다면 return false를 해줬습니다.

4. 멀티서치가 가능해야한다.

promise.all()을 사용해 비동기 병렬처리를 진행했습니다. 단순히 비동기 처리를 했을 때보다 지연시간이 줄었습니다.

5. 게임안에서 블루팀이 유리한 점이 많다.(챔피언 선택 우선권, 챔피언 벤 우선권, *7시방향에서 시작) 나눈 팀중에 평균mmr이 낮은 팀은 블루팀으로 배정하고 만약 두 팀의 mmr이 똑같다면 검색순서가 빠른 팀이 브르루팀으로 간다.

1,2번 조건으로 나눴던 두 팀 중 MMR이 낮은 팀을 블루팀, MMR이 높은 팀을 레드팀으로 배정했습니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published