뭐? 끄투 핵?!

안녕하세요! Layer7의 부부장(쀼장이라고 합니다!) 김연규입니다 ㅎㅎ

이번 시연회 작품으로 저는 끄투 핵을 준비해보았어요. 끄투란, 현재 kkutu.co.kr 에서 서비스 되고있는 글자 게임이고, 가장 유명한것은 아무래도 끝말잇기 게임이 아닐까 싶습니다 :)

이 끄투에는 몇가지 규칙이 있는데요,

1. 글자수가 많을 수록 더 많은 점수를 가져감
2. 시간 제한이 있고, 단어를 제출 할 때 시간이 남아있는 만큼 더 많은 점수를 가져감
3. 한방단어 금지 모드가 있음
4. 그 외에는 끝말잇기와 동일!

기술 배경


먼저, 기술적인 배경에 대해 설명을 드리도록 할게요.

저는, 크게 다음과 같은 기술을 사용했어요.
1. Python
2. Selenium
3. javascript
4. sqlite3

일단 1번. Python은 프로그래밍 언어에요.
여러분이 앞으로 프로그래밍을 하며 한번쯤은 접하게 될 매우 유명하고, 또 문법적인 난이도가 낮아 인기가 많은 언어입니다.
밑에 적을 모든 기술 사용은 이 파이썬 코드 위에서 이루어졌답니다!

2번인 Selenium은 우리가 흔히 사용하는 Chrome 브라우저라고 생각하면 될거같아요.
그 Chrome에 자동화 모듈을 붙여서, 우리가 브라우저에서 할 수 있는 스크롤, 클릭, 입력폼에 글자 타이핑, url 이동과 같은 작업들을 코드로써 실행할 수 있도록 하는 라이브러리입니다.
: 저는 selenium을 끄투를 실행하고, 글자를 타이핑하는데 사용하였습니다 :D

3번인 javascript는 웹의 프론트엔드 단에서 사용되는 유일한 프로그래밍 언어라고 할 수 있을정도로, 우리의 브라우저 안에서 작동하는 프로그래밍 언어에요.
버튼에 기능을 넣는것과 같은, 사용자가 브라우저에서 접하는 프로그래밍적인 동작들을 담당하는 언어입니다.
: 후에 다룰 내용이지만, 글자를 타이핑하며 최적화하는 작업에서 이 javascript를 사용하였어요!


4번은 database의 한 종류로써, 값을 편리하게 저장하는데 사용하기 좋은 프로그램입니다. 다른 database와는 달리 database정보가 파일로써 저장되는 장점이있어요! 그러나 미 해군 전투함에 차용되기 위해 개발된 db이니만큼, 다른 db에 비해 제한되는 기능이 많아 애를 많이 먹었답니다 ㅎㅎ;
: 끄투에서 사용할 단어의 목록을 저장하는데 이 database를 사용했어요!


으악 뭐가 뭔지 모르겠어요

괜찮아요! 여러분이 알아주시면 되는건 제가 더 성능좋은 핵을 만들었다는거니까요!!

그래서 어떻게 만든건데요..?

먼저, 다른 핵들을 보니 한방단어를 감지하고 미리 뱉는 알고리즘 까지는 보통 구현을 안하는것 같았어요.


이런식으로, 한방단어의 끝에 해당하는 글자들을 ONE_KILL에 넣었어요.
그래서 만약 "헬" 로 시작하는 단어가 필요하다면, 저 ONE_KILL에 해당하는 끝글자가 있으면 그 값이 뱉어지는거죠.

그래서?

그랬더니 너무 승부가 재미없게 끝났어요. 이건 뭐 게임시작했다 게임끝났다도 아니고, 분명 재미가 없을거라 생각이 들었어요. 너무 쉽게 이겨버리니까요...
그래서 "한방단어 금지" 규칙을 적용하고, 저 함수의 코드를 좀 바꿨어요.

끄투에는 "두방 단어" 라는게 있는데, 말 그대로 한방 단어는 아니지만, 사전상에 등록된 단어가 몇개 없는 글자로 끝나는 단어들을 말해요.
"늣", "븨" 같은걸로 끝나는 단어들 말이죠. 한방단어 금지 규칙이 적용되었으니, 만약 찾은 단어가 ONE_KILL에 들어가있다면 그 단어를 제외하고, TWO_KILL에 들어가있다면 그 단어를 뱉는식으로요.

그랬더니 이제 좀 비등비등 해졌어요. 여전히 늘 제가 이겼지만 ㅎㅎ;

확실한 압승을 원했던 저는 알고리즘을 개량하고, 최적화를 하는 지경에 이르게 되었습니다.

일단, 고득점을 챙기면서 죽일때는 확실히 죽이는 그런 알고리즘을 넣었어요.

컴퓨터가 찾은 단어가 15글자 이하일때만 이 두방 단어를 사용하는것으로 말이죠.

거기서 끝나지 않았어요. 끊임없는 단어의 부족에 시달렸기 때문에 학습기능도넣었습니다!
그래서 저는 단어사전을 크롤링할 필요가 없었어요. 그냥 학습기를 켜놓고 끄투를 플레이하면 자동으로 단어DB가 채워졌으니까요ㅎㅎ

상대방이 치는 단어가 유효한 단어라면, 나의 DB에 넣었어요.

이쯤되면 이길수가 없겠죠. 그래도 저는 압살을 원했어요.

아까, selenium은 브라우저의 모든 기능을 코드로써 자동화 할 수 있는 도구라고 말씀드렸죠?
그래서 만약, selenium에 내장된 타이핑 기능을 사용하면 다음과 같은 구조로 컴퓨터에서 작동이 될것이에요.
파이썬 코드 -> selenium 구현체 -> 크롬
그런데 이게 생각보다 느려요. 나중에 제한시간이 줄어들다보면 0.5 초만에, 아니면 그보다 더 짧은 시간안에 타이핑을 해야하는 일이 생기는데 그때마다 죽어버렸던거죠.
그리고 더 빨리 치면 빨리 칠수록 점수를 더 많이 얻어가니까요 ㅎㅎ

그래서 저는 생각했습니다.
"브라우저 내에서 기본적으로 작동하는 언어를 호출하면 더 빨라지지않을까?"

그래서, js의 기능을 이용해서 input text를 채우는 코드로 전부 변경했어요.
html상의 특정 요소를 js를 통해 받아와 그 값을 채우는거죠.
이러면, 타이핑을 시뮬레이션 하는게 아니라 그냥 값을 채워넣는거기 때문에 성능에 아주 많은 도움이 될거라고 생각했어요.

밑은 그 코드에요!

마지막으로, 영상을 남기며 글을 마치도록 하겠습니다. 길고 지루했을텐데 읽어주셔서 감사합니다!



저를 이길 수 있는 끄투핵을 만들었다! 하시는 2020년 뉴비 선린 후배분은 https://www.facebook.com/kim.y30n.gyu 로 메시지 주세요 :D 저를 제일 먼저 이기시는 단 한분께 밥을 사드리도록 하겠습니다!


Comments

  1. 혹시 주실수도 있나요? 유튜브로 콘텐츠 할려해서

    ReplyDelete
  2. 끄투코리아 노인정, 매너전 랭커인 대전과학고 학생입니다. 프로그램 테스트를 해보고 싶어 댓글 남깁니다. 가능하시다면 cytotoxicity8@naver.com으로 연락 부탁드립니다.

    ReplyDelete
  3. 저 한번 써보고 싶은데 어떻게 안될까요 a1507282828@gmail.com 입니다

    ReplyDelete

Post a Comment

Popular Posts