Toggle navigation
Toggle navigation
This project
Loading...
Sign in
오원석
/
StarCraft2 Build Recommendation
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
신기성
2018-12-09 21:59:54 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
2a118c357a32f5ced01ab2e7a27bf3cd18ac7cbf
2a118c35
1 parent
962c002c
빌드추천 알고리즘 작성 및 프로세스3 발견현상 추가
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
109 additions
and
25 deletions
FindUser.js
process3.txt
FindUser.js
View file @
2a118c3
...
...
@@ -30,14 +30,28 @@ var usernumber='';//usernumber 문자열 선언
//system message
//
//delivering variable
var
momentum
;
//기세
var
terran_proficiency
;
//테란 숙련도
var
zerg_proficiency
;
//저그 숙련도
var
protoss_proficiency
;
//프로토스 숙련도
var
primary_race
;
//주 종족
var
win_rate
;
//시즌 전체 승률
var
myrace
;
//내 종족
var
enemyrace
;
//상대 종족
var
recommend
;
//추천빌드(운영/타이밍/올인)
//
r
.
question
(
"분석을 원하는 아이디를 입력하세요 : "
,
function
(
answer
){
//question메소드에서 callback함수 생성
console
.
log
(
"입력완료! 분석중..."
);
//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다.
//question은 에러 제어 만들면 안된다.
console
.
log
(
"r.question processing"
);
//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다.
rtfw1
=
rtfw1
+
answer
;
//검색 url 구성
console
.
log
(
rtfw1
);
//테스트용 : 검색 url 확인
//
request
(
rtfw1
,(
error
,
response
,
body
)
=>
{
//rtfw url 불러오기 request 1
if
(
error
){
throw
error
};
//에러처리
console
.
log
(
"request 1 processing"
);
let
$
=
cheerio
.
load
(
body
);
//rtfw가 body이다. $로 jquery방식으로 html탐색
$
(
'ul'
).
find
(
'a'
).
each
(
function
(
index
,
elem
){
//ul 태그 아래 a태그를 찾는다.
username
=
$
(
this
).
find
(
'.name'
).
text
().
trim
();
//name클래스를 찾아 공백빼고 텍스트화
...
...
@@ -80,9 +94,10 @@ var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매
var
match_history_2
=
"/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"
//매치히스토리 url 뒷부분
var
match_history_url
=
match_history_1
+
profileID
+
match_history_2
;
//매치히스토리 url 구성
console
.
log
(
match_history_url
);
//테스트용 : 매치히스토리 url 출력
request
(
match_history_url
,(
error
,
response
,
body
)
=>
{
//match history request request 3-1
request
(
match_history_url
,(
error
,
response
,
body
)
=>
{
//match history request request 3
if
(
error
){
throw
error
};
//에러처리
console
.
log
(
'request3
-1
processing'
);
//테스트용 : request 작동여부 출력
console
.
log
(
'request3 processing'
);
//테스트용 : request 작동여부 출력
var
obj1
=
JSON
.
parse
(
body
);
//request 결과를 JSON object로 변환
//console.log(obj.matches [0].map);//테스트용 : 하나에 접근
...
...
@@ -91,47 +106,106 @@ $(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 m
console
.
log
(
index
+
":::"
,
match
.
decision
,
match
.
map
);
//인덱스와 승패, 맵 표시
};
//if 1v1 종료
});
//each function 종료
});
//request3-1종료
var
ladder_1
=
"https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"
var
ladder_2
=
"/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"
;
var
ladder_url
=
ladder_1
+
profileID
+
ladder_2
;
console
.
log
(
ladder_url
);
request
(
ladder_url
,(
error
,
response
,
body
)
=>
{
//ladder request request
3-2
request
(
ladder_url
,(
error
,
response
,
body
)
=>
{
//ladder request request
4
if
(
error
){
throw
error
};
console
.
log
(
'request
3-2
processing'
);
console
.
log
(
'request
4
processing'
);
var
obj2
=
JSON
.
parse
(
body
);
//request 결과를 JSON object로 변환
//console.log(obj2.currentSeason [1
].ladder[0].wins);//테스트용 : 하나에 접근
var
wins
=
obj2
.
currentSeason
[
1
].
ladder
[
0
].
wins
;
var
losses
=
obj2
.
currentSeason
[
1
].
ladder
[
0
].
losses
;
var
win
rate
=
wins
/
(
wins
+
losses
);
// console.log(obj2.currentSeason [2
].ladder[0].wins);//테스트용 : 하나에 접근
var
wins
=
obj2
.
currentSeason
[
2
].
ladder
[
0
].
wins
;
var
losses
=
obj2
.
currentSeason
[
2
].
ladder
[
0
].
losses
;
win_
rate
=
wins
/
(
wins
+
losses
);
//console.log(wins);
//console.log(losses);
//console.log(winrate);
});
//request3-2종료
//console.log(win_rate);
var
profile_1
=
"https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"
;
var
profile_2
=
"?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"
;
var
profile_url
=
profile_1
+
profileID
+
profile_2
;
console
.
log
(
profile_url
);
request
(
profile_url
,(
error
,
response
,
body
)
=>
{
//profile request request
3-3
request
(
profile_url
,(
error
,
response
,
body
)
=>
{
//profile request request
5
if
(
error
){
throw
error
};
console
.
log
(
'request
3-3
processing'
);
console
.
log
(
'request
5
processing'
);
var
obj3
=
JSON
.
parse
(
body
);
//request 결과를 JSON object로 변환
//console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근
var
primary_race
=
obj3
.
career
.
primaryRace
;
console
.
log
(
primary_race
);
primary_race
=
obj3
.
career
.
primaryRace
;
//
console.log(primary_race);
var
terran_level
=
obj3
.
swarmLevels
.
terran
.
level
;
var
zerg_level
=
obj3
.
swarmLevels
.
zerg
.
level
;
var
protoss_level
=
obj3
.
swarmLevels
.
protoss
.
level
;
//console.log(terran_level);
//console.log(zerg_level);
//console.log(protoss_level);
});
//request3-3종료
});
//request2종료
//build recommend algorithm
var
matchresults
=
[];
//매치결과 담을 배열 선언
var
momentum_win
=
0
;
//최근 10경기 중 승수 초기화
for
(
var
i
=
0
;
i
<
25
;
i
++
){
//매치히스토리는 최대 25개
if
(
obj1
.
matches
[
i
].
type
==
'1v1'
){
//1v1에만 관심있다.
matchresults
.
push
(
obj1
.
matches
[
i
].
decision
);
//배열 끝에 결과 삽입
if
((
matchresults
.
length
<
11
)
&&
(
obj1
.
matches
[
i
].
decision
==
'Win'
)){
//최근 10경기에서 승리한 경우
momentum_win
=
momentum_win
+
1
;
//그 승수를 카운트한다.
}
//if length11 종료
}
//obj1 1v1 종료
}
//for i 25 종료
//console.log(matchresults);//테스트용 : matchresults 출력
//console.log(momentum_win);//테스트용 : momentum_win 출력
if
(
momentum_win
>=
7
){
//7승 이상이면 상승세
momentum
=
'상승세'
;
}
if
((
momentum_win
<
7
)
&&
(
momentum_win
>=
4
)){
//4승이상 7승미만이면 정체
momentum
=
'정체중'
;
}
if
(
momentum_win
<
4
){
//4승 미만이면 하락세
momentum
=
'하락세'
;
}
//console.log(momentum);//테스트용 : 기세 출력
if
(
terran_level
<
50
){
//테란 레벨 50 안되면
terran_proficiency
=
'비숙련자'
//테란 비숙련자
}
else
{
terran_proficiency
=
'숙련자'
}
if
(
zerg_level
<
50
){
//저그 레벨 50 안되면
zerg_proficiency
=
'비숙련자'
//저그 비숙련자
}
else
{
zerg_proficiency
=
'숙련자'
}
if
(
protoss_level
<
50
){
//프로토스 레벨 50 안되면
protoss_proficiency
=
'비숙련자'
//프로토스 비숙련자
}
else
{
protoss_proficiency
=
'숙련자'
}
//
//system message part
console
.
log
(
"최근 10경기 분석 결과 현재 상대는 '"
+
momentum
+
"'입니다."
);
console
.
log
(
"상대는 테란 '"
+
terran_proficiency
+
"'입니다."
);
console
.
log
(
"상대는 저그 '"
+
zerg_proficiency
+
"'입니다."
);
console
.
log
(
"상대는 프로토스 '"
+
protoss_proficiency
+
"'입니다."
);
console
.
log
(
"상대의 주 종족은 '"
+
primary_race
+
"'입니다."
);
console
.
log
(
"상대의 이번 시즌 전체 승률은 '"
+
win_rate
+
"'입니다."
);
//
//build recommend command
//
console
.
log
(
'request5 done'
);
});
//request5종료
console
.
log
(
'request4 done'
);
});
//request4종료
console
.
log
(
'request3 done'
);
});
//request3종료
console
.
log
(
'request2 done'
);
});
//request2종료
console
.
log
(
'request1 done'
);
});
//request1 종료
r
.
close
()
//반드시 close를 해줘야 한다.사용이 다 끝난 후에.
console
.
log
(
'r.question done'
);
//console.log(terran_level);
r
.
close
()
//반드시 close를 해줘야 한다.사용이 다 끝난 후에.
});
//r.question 끝
...
...
process3.txt
View file @
2a118c3
...
...
@@ -3,17 +3,27 @@
-rtfw 한글검색 utf8
-리그/region/realm 선택
-처리순서 정리
<정보>
상대 기세 : 최근 래더 10경기 결과로 추정
상대 기세 : 최근 래더 10경기 결과로 추정
(7승이상:상승,4-7승:평온,3승이하:하락)
//맵별 승률 : 최근 래더 25경기 결과로 승률 50퍼센트가 넘는 맵 추정
종족별 숙련도 : 종족레벨 50 미만일경우 비숙련자
주 종족 :
이번시즌 전체 승률 :
주 종족 :
직접접근
이번시즌 전체 승률 :
승패에 직접접근하여 계산
<빌드추천 기준>
하락세
/
비숙련자-운영
상승세
/
숙련자-올인
비등
/
이외-타이밍
하락세
or
비숙련자-운영
상승세
or
숙련자-올인
비등
or
이외-타이밍
<프로젝트 설명>
편법 아니고 빠른시간에 제공가능하다는 점 부각
리그시스템상 승률은 50퍼센트로 수렴한다. 기세로 판단하는 것이 올바르다.
<발견현상>
-API의 json배열이 어느시점부로 바뀌는 현상(ladders에서)
-김대엽 선수가 자꾸 움직임;
<노하우>
-request 병렬처리되니까 마트료시카처럼 안쪽에 넣어야 순서대로 처리 가능
...
...
Please
register
or
login
to post a comment