NDC2017 2017. 5. 18. 14:11

더 좋은 코드를 위한 함수형 프로그래밍

순수함수와 불변성

순수함수 : 함수의 겨로가값이 오직 입력 인자 값들에 의해서만 결정.
- 특정 입력값에 대해서 결과값이 결정적으로 대응되는 함수
- 부작용이 없는 함수.

부작용 : 상태에 영향을 받거나 변화를 주는 모든 동작
 -화면 출력
 -소켓통신
 -디스크 I/O
 -예외 catch

참조 투명성
-> 어떤 표현식을 그 표현식의 결과값으로 교체해도 전체 프로그램의 실행결과에 영향을 주지 않는 성질
-> 컴파일러에게 다양한 최적화 기회를 제공

기억 - memoization
- 입력값 / 함수명을 알면 결과값은 항상 같음
지연 연산 - Lazy evaluation
- 실제로 결과값이 필요할 때만 함수를 평가
불변성


위 사진은 ranges다.




posted by 천마서생
:
NDC2017 2017. 5. 18. 14:03

게임 bot 탐지 모델 구현 및 응용사례
ex) 3초 안에 10개의 스테이지를 연속으로 클리어하면 어뷰저에요.
-> 군맹무상 : 자기의 좁은 소견으로 진실이라고 믿는다.

모바일 게임은 주 계정에서 봇을 사용한다. - 스스로 게임 플레이를 할 때도 있다.

기존 rule로 1주일 간의 최신 데이터를 확인해 보면 정확도도 낮고 높은 오진률 발생.

문제를 해결하는 가장 첫 번째 단계는 우리 스스로 문제가 있다는 것을 인식하는 것.

ex) 라인레인져스
레벨업 = 경험치 획득량 / 플레이 횟수 (X)
레벨업 = 경험치 획득량 / 경험치 획득 횟수+1

box plot
1사분위수 3사분위수 : 비교하는 그룹의 제 1사분위수와 제 3사분위수 사이의 구간이 완전하게 분리 된 것이 좋다.

feature selection이 필요한 이유
1. 관련 없는 데이터 제거
2. 모델 정확도와 관련된 feature 중요도 파악
3. feature는 꼭 필요한 것만 선택하는 것이 중요.

RFE를 꼭 알아두자..

RF Classifier / SVM Classifier

RFE는 feature를 재귀적으로 제거하고 남은 feature만으로 모델 정확도를 계산하여 목표 변수에 대한 예측에 기여하는 속성의 조합

PCA(Principal Component Analysis)는 왜 사용 안함?
1. 탐지 모델 생성과 검증을 위해 데이터 분할

2. Train data의 비율은 임의로 설정
- Undersampling 방식을 이용하여 80 : 20으로 조정 (Sampling, Cost-sensitive, Hybrid methods)

XGBOOST 알고리즘.
1. Computation in C++
2. R/Python 라이브러리(인터페이스) 제공
3. Tree-based 모델.

Ramdom Forest vs XGBoost


posted by 천마서생
:
NDC2017 2017. 5. 18. 14:02

라이브 프로세스 분석을 통한 효율적인 로직 개발

<게임 프로그래밍 패턴> DP

라이브 프로세스
- 기획서 이해 -> 기존 코드 분석 -> 구조 설계 -> 코드 작성 -> QA & 버그수정 -> 완성
<게임 프로그래밍 패턴> 책에서 기능추가, 버그수정 그 외 무슨 이유든 코드를 고치려면 먼저 기존 코드를 이해해야한다. 대부분 이 과정을 별것 아닌 것으로 여기지만 사실 프로그래밍에서 가장 오래 걸리는 부분이다.

코드 설계 시간 부족 -> Bad Code -> 분석 시간 증가 ->코드 설계 시간 부족.... 악순환

주제 : 분석에 소요되는 시간을 줄여서 코드 설계 & 작성하는 시간을 늘리자.

라이브에서 좋은 코드 : 새로운 코드를 작성 하기 전, 머리 속에 입력해야 할 정보가 적은 코드 ( 가독성 )

'코드'적인 측면과 '방법론'적인 측면

코드 : 작명 중요(변수, 함수, 클래스의 작명)
 1. 공통적인 내용이 앞에 있어 알아보기 쉽다. ex) GetName,GetNameRes,GetUserID
ex) CheckState() (O) CS() (X)
-> 작업자들간의 공유할 수 있는 네이밍 규칙이 필요합니다.

 2. 사용하지 않게 된"#if~endif"은 빠르게 삭제.
-> 대부분의 서비스중인 온라인 게임에서 #define의 개수는 적게는 몇백개에서 많게는 몇천 몇만개에 달한다.
가독성과 유지보수에 있어 굉장히 중요하고 민감한 부분임을 항상 명시하자.

 3. 미사용 코드는 꼭 제거하자
-> 완전히 같은 기능을 하는 중복 함수들

 4. 적재적소의 주석, 미사용 주석은 빠르게 제거.
-> 직관적으로 이해 가능할때는 주석 (O) 작성자만 알 수있는 코드는 주석 사용.

공통점 . 작은 불씨가 큰 불로.. / 업무 하다가 남은 시간에 정리하자. -> "남는 시간은 없다."
-> 반드시 "업무"로 할당하여 해결하자.
방법론

1. 짧은 개발 기간 동안 무리한 양의 개발은 피해야한다.

2. 개발 완료 이후 출시 전 사이 여러 번의 내용 변경 시도는 피해야한다.
-> 어쩔 수 없이 하게 되면 업데이트 이후 스케줄은 반드시 무리한 개발에 따른 비효율적인 코드(날림코드) or 리소스의 정리(리펙토링)가 되어야 한다.
무리한 개발을 진행하였으면 반드시 그에 따른 결과를 기록해야 하고 이른 향후 비슷한 이슈가 발생했을 때 참고자료로 사용해야 한다.

3. 퇴사 예정자에게는 새로운 업무 부여는 주어서는 안된다.
-> 퇴사 예정자가 진짜 해야 할 업무는 "신규 개발"이 아닌 "인수 인계"다.

4. 직 간접적인 "코드 리뷰"
-> 나는 10줄의 코드로 구현 가능하다고 생각한 기능을 다른 프로그래머는 단 2줄의 코드로 구현 가능한 방법을 알고 있을 수도 있다.
=> 직접적인 코드 리뷰 (결과물에 대해 모두가 토론) 30%
=> 간접적인 코드 리뷰 (리드 프로그래머의 검수) 70%(라이브는 이것이 대부분)
간접적인 코드 리뷰를 하면 팀원들의 리드 프로그래머에 대한 신뢰도 증가.
-> 프로젝트의 코드 퀄리티가 뛰어나다 응답.
작업자와 1:1 대화를 통한 코드 리뷰 or 관련 컨텐츠의 샘플 코드 제시 -> 방향을 제시
=> 리더가 직접 코드를 작성하며 게임 코드의 변화를 자세히 파악하고 있어야 한다.


posted by 천마서생
:
NDC2017 2017. 5. 18. 13:59

현실적인 pvp AI 만들기
누구나 구현 가능한, 쉬운, 바로 써먹을 수 있는,

대전 액션게임의 아케이드 모드 에이아이를 효율적으로 쉽게 만드는 것에 대한 이야기

시즈키 도장 : 결투장 유저처럼 움직이는 AI 구현 사람하고 싸우고 싶은 AI구현 아케이드 모드에 사용가능한 적절한 AI를 배치

던파 결투장 : xy축을 사용한 무빙 , 방대한 컨텐츠, RatingPoint 매칭기반, 공중,스탠딩,바닥,보정시스템
시즈키 도장

1. 모든 유저가 자신과 같은 전직의 AI와 대전 가능해야한다. (51개) - 매우 복잡도가 높은 컨텐츠에 대해 기획자가 바로 로직을 짜도록 설계. - 루아스크립트 사용.
2. 유저의 콤보 학습을 도와야 한다. - 빠르고 쉽게 제작해야함.
3. 유저와 같은 의미 있는 무빙을 해야함. - AI가 유저의 공격 범위를 예측하여 움직여야함.
4. 제공되는 난이도는 3가지( RP 600, 800, 1000이 기준) - 난이도는 데이터로만 결정.(너무 많은 캐릭터를 만들어야해서)

키스트림 기반의 콤보
- 콤보는 상대가 무력화 된 상태에서, 순차적으로 실행되는 흐름일 뿐
- 기획자의 콤보 키입력을 파일로 저장하는 기능 제공 = 콤보 녹화 -> 텍스트 형식 파일로 저장 -> 찍어내기
- AI로직 스크립트에서는 키스트림을 간단히 재생 - 단순하게 저장된거 실행

위험영역 기반의 무빙
- 무빙이란, 나는 맞지 않고, 때리려는 움직임
- 스킬별 적의 공격 데이터 정의.
- 스킬 쿨타임에 따라 위험영역 on/off (스킬 사거리)
- 접근 + 회피 + 위험영역 = 유저와 같은 움직임 재현
- 위험영역은 AI스크립트에 이벤트로 전달, 기획자가 필요에 따라 로직 처리

FSM 상태정의

- checkstate : 견제를 담당하는 상태로써, 공격성공시 콤보로 연계를 할 수 있는 딜레이가 짧은 어퍼류의 스킬을 사용함.
- checkstate를 별도로 분리함으로써, MoveState와 콤보시스템과 번갈아가며 사용된다.

난이도 구현
- 난이도별 AI로직을 분리하는것은 힘듬.
- 난이도란? 숙련도의 차이, 같은 플레이에 대해 점점더 정교해지는 개념
- 난이도별 AI데이터는 정확도 수치만을 다르게 입력.

단점
- 투척류, 설치형 스킬에 취약
- AI별로 퀄리티의 편차가 있는편

 AI 구현 팁.
- 키스트림 기반 콤보
- 위험영역 기반 무빙
- checkState를 사용한 FSM
- 생산성을 높이는 정확도 시스템


posted by 천마서생
: