신기성

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

......@@ -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('request3-2 processing');
console.log('request4 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 winrate=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('request3-3 processing');
console.log('request5 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 끝
......
......@@ -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 병렬처리되니까 마트료시카처럼 안쪽에 넣어야 순서대로 처리 가능
......