신기성

빌드추천 알고리즘 작성 및 프로세스3 발견현상 추가

...@@ -30,14 +30,28 @@ var usernumber='';//usernumber 문자열 선언 ...@@ -30,14 +30,28 @@ var usernumber='';//usernumber 문자열 선언
30 //system message 30 //system message
31 31
32 // 32 //
33 +//delivering variable
34 +var momentum;//기세
35 +var terran_proficiency;//테란 숙련도
36 +var zerg_proficiency;//저그 숙련도
37 +var protoss_proficiency;//프로토스 숙련도
38 +var primary_race;//주 종족
39 +var win_rate;//시즌 전체 승률
40 +
41 +var myrace;//내 종족
42 +var enemyrace;//상대 종족
43 +var recommend;//추천빌드(운영/타이밍/올인)
44 +//
33 45
34 r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성 46 r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성
35 - console.log("입력완료! 분석중...");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다. 47 + //question은 에러 제어 만들면 안된다.
48 + console.log("r.question processing");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다.
36 rtfw1=rtfw1+answer;//검색 url 구성 49 rtfw1=rtfw1+answer;//검색 url 구성
37 console.log(rtfw1);//테스트용 : 검색 url 확인 50 console.log(rtfw1);//테스트용 : 검색 url 확인
38 // 51 //
39 request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1 52 request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1
40 if(error){throw error};//에러처리 53 if(error){throw error};//에러처리
54 + console.log("request 1 processing");
41 let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색 55 let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색
42 $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다. 56 $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다.
43 username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화 57 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/"//매 ...@@ -80,9 +94,10 @@ var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매
80 var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분 94 var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분
81 var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성 95 var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성
82 console.log(match_history_url);//테스트용 : 매치히스토리 url 출력 96 console.log(match_history_url);//테스트용 : 매치히스토리 url 출력
83 -request(match_history_url,(error,response,body)=>{//match history request request 3-1 97 +
98 +request(match_history_url,(error,response,body)=>{//match history request request 3
84 if(error){throw error};//에러처리 99 if(error){throw error};//에러처리
85 - console.log('request3-1 processing');//테스트용 : request 작동여부 출력 100 + console.log('request3 processing');//테스트용 : request 작동여부 출력
86 101
87 var obj1=JSON.parse(body);//request 결과를 JSON object로 변환 102 var obj1=JSON.parse(body);//request 결과를 JSON object로 변환
88 //console.log(obj.matches [0].map);//테스트용 : 하나에 접근 103 //console.log(obj.matches [0].map);//테스트용 : 하나에 접근
...@@ -91,47 +106,106 @@ $(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 m ...@@ -91,47 +106,106 @@ $(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 m
91 console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시 106 console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시
92 };//if 1v1 종료 107 };//if 1v1 종료
93 });//each function 종료 108 });//each function 종료
94 -});//request3-1종료
95 109
96 var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/" 110 var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"
97 var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; 111 var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi";
98 var ladder_url=ladder_1+profileID+ladder_2; 112 var ladder_url=ladder_1+profileID+ladder_2;
99 console.log(ladder_url); 113 console.log(ladder_url);
100 -request(ladder_url,(error,response,body)=>{//ladder request request 3-2 114 +request(ladder_url,(error,response,body)=>{//ladder request request 4
101 if(error){throw error}; 115 if(error){throw error};
102 - console.log('request3-2 processing'); 116 + console.log('request4 processing');
103 var obj2=JSON.parse(body);//request 결과를 JSON object로 변환 117 var obj2=JSON.parse(body);//request 결과를 JSON object로 변환
104 - //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근 118 +// console.log(obj2.currentSeason [2].ladder[0].wins);//테스트용 : 하나에 접근
105 - var wins=obj2.currentSeason[1].ladder[0].wins; 119 + var wins=obj2.currentSeason[2].ladder[0].wins;
106 - var losses=obj2.currentSeason[1].ladder[0].losses; 120 + var losses=obj2.currentSeason[2].ladder[0].losses;
107 - var winrate=wins/(wins+losses); 121 +win_rate=wins/(wins+losses);
108 //console.log(wins); 122 //console.log(wins);
109 //console.log(losses); 123 //console.log(losses);
110 - //console.log(winrate); 124 + //console.log(win_rate);
111 -});//request3-2종료
112 125
113 var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"; 126 var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/";
114 var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; 127 var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi";
115 var profile_url=profile_1+profileID+profile_2; 128 var profile_url=profile_1+profileID+profile_2;
116 console.log(profile_url); 129 console.log(profile_url);
117 -request(profile_url,(error,response,body)=>{//profile request request 3-3 130 +request(profile_url,(error,response,body)=>{//profile request request 5
118 if(error){throw error}; 131 if(error){throw error};
119 - console.log('request3-3 processing'); 132 + console.log('request5 processing');
120 var obj3=JSON.parse(body);//request 결과를 JSON object로 변환 133 var obj3=JSON.parse(body);//request 결과를 JSON object로 변환
121 //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근 134 //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근
122 - var primary_race=obj3.career.primaryRace; 135 +primary_race=obj3.career.primaryRace;
123 - console.log(primary_race); 136 + //console.log(primary_race);
124 var terran_level=obj3.swarmLevels.terran.level; 137 var terran_level=obj3.swarmLevels.terran.level;
125 var zerg_level=obj3.swarmLevels.zerg.level; 138 var zerg_level=obj3.swarmLevels.zerg.level;
126 var protoss_level=obj3.swarmLevels.protoss.level; 139 var protoss_level=obj3.swarmLevels.protoss.level;
140 +
127 //console.log(terran_level); 141 //console.log(terran_level);
128 //console.log(zerg_level); 142 //console.log(zerg_level);
129 //console.log(protoss_level); 143 //console.log(protoss_level);
130 -});//request3-3종료
131 144
132 -});//request2종료 145 +//build recommend algorithm
146 +var matchresults=[];//매치결과 담을 배열 선언
147 +var momentum_win=0;//최근 10경기 중 승수 초기화
148 +for (var i=0;i<25;i++){//매치히스토리는 최대 25개
149 + if(obj1.matches[i].type=='1v1'){//1v1에만 관심있다.
150 + matchresults.push(obj1.matches[i].decision);//배열 끝에 결과 삽입
151 + if((matchresults.length<11)&&(obj1.matches[i].decision=='Win')){//최근 10경기에서 승리한 경우
152 + momentum_win=momentum_win+1;//그 승수를 카운트한다.
153 + }//if length11 종료
154 +}//obj1 1v1 종료
155 +}//for i 25 종료
156 +//console.log(matchresults);//테스트용 : matchresults 출력
157 +//console.log(momentum_win);//테스트용 : momentum_win 출력
158 +if(momentum_win>=7){//7승 이상이면 상승세
159 +momentum='상승세';
160 +}
161 +if((momentum_win<7)&&(momentum_win>=4)){//4승이상 7승미만이면 정체
162 +momentum='정체중';
163 +}
164 +if(momentum_win<4){//4승 미만이면 하락세
165 +momentum='하락세';
166 +}
167 +//console.log(momentum);//테스트용 : 기세 출력
133 168
169 +if(terran_level<50){//테란 레벨 50 안되면
170 + terran_proficiency='비숙련자'//테란 비숙련자
171 +} else{
172 + terran_proficiency='숙련자'
173 +}
174 +if(zerg_level<50){//저그 레벨 50 안되면
175 + zerg_proficiency='비숙련자'//저그 비숙련자
176 +} else{
177 + zerg_proficiency='숙련자'
178 +}
179 +if(protoss_level<50){//프로토스 레벨 50 안되면
180 + protoss_proficiency='비숙련자'//프로토스 비숙련자
181 +} else{
182 + protoss_proficiency='숙련자'
183 +}
184 +//
185 +//system message part
186 +console.log("최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다.");
187 +console.log("상대는 테란 '"+terran_proficiency+"'입니다.");
188 +console.log("상대는 저그 '"+zerg_proficiency+"'입니다.");
189 +console.log("상대는 프로토스 '"+protoss_proficiency+"'입니다.");
190 +console.log("상대의 주 종족은 '"+primary_race+"'입니다.");
191 +console.log("상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다.");
192 +//
193 +//build recommend command
194 +
195 +//
196 +
197 +console.log('request5 done');
198 +});//request5종료
199 +console.log('request4 done');
200 +});//request4종료
201 +console.log('request3 done');
202 +});//request3종료
203 +console.log('request2 done');
204 +});//request2종료
205 +console.log('request1 done');
134 });//request1 종료 206 });//request1 종료
135 207
136 - r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에. 208 +console.log('r.question done');
209 +//console.log(terran_level);
210 +r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에.
137 });//r.question 끝 211 });//r.question 끝
......
...@@ -3,17 +3,27 @@ ...@@ -3,17 +3,27 @@
3 -rtfw 한글검색 utf8 3 -rtfw 한글검색 utf8
4 -리그/region/realm 선택 4 -리그/region/realm 선택
5 5
6 +-처리순서 정리
7 +
6 <정보> 8 <정보>
7 -상대 기세 : 최근 래더 10경기 결과로 추정 9 +상대 기세 : 최근 래더 10경기 결과로 추정(7승이상:상승,4-7승:평온,3승이하:하락)
8 //맵별 승률 : 최근 래더 25경기 결과로 승률 50퍼센트가 넘는 맵 추정 10 //맵별 승률 : 최근 래더 25경기 결과로 승률 50퍼센트가 넘는 맵 추정
9 종족별 숙련도 : 종족레벨 50 미만일경우 비숙련자 11 종족별 숙련도 : 종족레벨 50 미만일경우 비숙련자
10 -주 종족 : 12 +주 종족 : 직접접근
11 -이번시즌 전체 승률 : 13 +이번시즌 전체 승률 : 승패에 직접접근하여 계산
12 14
13 <빌드추천 기준> 15 <빌드추천 기준>
14 -하락세/비숙련자-운영 16 +하락세or비숙련자-운영
15 -상승세/숙련자-올인 17 +상승세or숙련자-올인
16 -비등/이외-타이밍 18 +비등or이외-타이밍
17 19
18 <프로젝트 설명> 20 <프로젝트 설명>
19 편법 아니고 빠른시간에 제공가능하다는 점 부각 21 편법 아니고 빠른시간에 제공가능하다는 점 부각
22 +리그시스템상 승률은 50퍼센트로 수렴한다. 기세로 판단하는 것이 올바르다.
23 +
24 +<발견현상>
25 +-API의 json배열이 어느시점부로 바뀌는 현상(ladders에서)
26 +-김대엽 선수가 자꾸 움직임;
27 +
28 +<노하우>
29 +-request 병렬처리되니까 마트료시카처럼 안쪽에 넣어야 순서대로 처리 가능
......