본문 바로가기
정보/IT

Script Bot (Bejeweled Blitz)

by 키운씨 2012. 5. 2.





한때 즐겨했던 비주얼드라는 게임인데

지금은 저렇게 봇을 이용해서 점수놀이만 하고 있다

봇을 이용하면서 게임 자체의 재미보다는 봇의 인공지능을 높일만한 요소를 찾는 재미가 더 쏠쏠해졌다

하지만...

게임 점수따위는 현실적으로 아무런 도움이 안되기에 단순히 아이디어만 떠오를 뿐 실천으로 옮겨 제대로 개발할 동기를 찾지 못하고 있다

이젠 실용적이거나 나에게 직접적인 도움이 되지 않으면 단순히 재미를 위한 취미만으로는 행동을 취하지 않으니 이게 바로 나이가 들었다는 증거인가보다


구글에서 검색해보면 저 게임을 위한 여러 버전의 봇이 나오는데 유일하게 내가 수정할 수 있는 Java 버전의 봇은 단 하나이다

알고리즘도 단순해서 같은 색상의 3개의 돌중 하나를 움직여 일렬로 만들어 폭발하는 경우에 대해서만 scan 하게 되어 있다

이 프로그램으로 노템의 점수가 평균 50~60만이고 최대 110만까지는 나와본 것 같다

내가 수정한 부분은 색상 인식 능력이 너무 저조하길래 몇가지 색상을 더 추가한 거 밖에 없다


타팀의 동료도 마찬가지로 봇을 제작해서 실행하고 있는데 (1등하고 있는 친구) C개발자이기에 당연히 프로그램도 C버전이다

그 친구의 봇을 이용하면 노템의 경우 최대 150만점 이상도 나오는 것 같다

게다가 여러가지 편의 기능도 제공한다고 자랑을 하길래 프로그램 공유좀 해달라고 했더니 공유해주기 싫은지 암말 안한다.

머 마음은 이해하지만 꼭꼭 숨길만한 프로그램은 아니라고 생각되는데... 어쨌든 날로 먹으려는 나 역시도 잘한건 아니니 더 요구 하지는 않았다 (마이너 버전이라도 주징... 쳇)

물론 같은 알고리즘을 적용하면 내가 가진 Java 버전 역시 동일한 성능을 보여줄 것이라 자신한다

하지만 솔직히 그 정도의 노력까지 필요한건지 모르겠다 (아마 그 친구도 같은 마음일거라 생각한다)

그래도 나에게 무한의 시간이 주어진다면 한번쯤 구현해보고 싶은 재미있는 알고리즘이다

아 2등도 나와 같은 회사 동료인데 저 사람도 자체 개발한 C버전의 봇으로 나온 점수이다

아마 프로그램 레벨이 내가 가진것과 비슷한듯...ㅋㅋ


성능 개선을 위해 몇가지 아이디어가 있는데 여기 적어놓고 나중에 시간되면 하나씩 구현해볼까한다 (할려나?... 할 수 있을까?...)


1. T, L 형태 우선 (현재는 직선형태만 scan 하고 있다)

2. 제거 대상 보석 목록을 Queue로 관리하고 목록에 없는 보석만을 재스캔하여 다음 제거 대상 보석으로 지정한다 

   화면상에서 Queue 에 존재하는 보석이 속한 열에 대해서는 다음 제거 대상 보석에서 제외시킨다

3. 자가학습

  - known, unknown 으로 보석을 분류한다

  - known 보석의 경우 기본 색상 그룹을 지정하여 해당 move 하여 제거된 보석의 색상을 각각의 그룹에 자동 저장한다

  - unknown 보석의 경우 임의로 move하여 함께 제거된 보석의 색상을 자동 수집 (파일저장)

    (move시 unknown 보석으로부터 유효범위 반경내의 보석은 move를 하지 않는다)

  - known 보석의 경우 실행실패 후 다음 반복 실행 스킵하고 색상 그룹에서 제거하여 unknown 으로 전환

  - 제거된 보석의 위치를 조사하여 I,T,L 형태가 아닌 경우 특수 보석으로 분류하여 별도로 관리


사실 1번은 1등인 친구에게서 전해들은 아이디어이고 3번의 자가학습에 대해서도 듣긴 했었지만 구체적으로 들은게 없어서 임의대로 내가 구상해 봤다

기본적으로 보석을 인식해내는 방식이 단순히 RGB 값에 의한 색상인식이기 때문에 오동작의 여지가 다분하다

자가학습은 그에 대해서 대안이 될 수는 없지만 어느정도 보완이 가능할거라 생각한다


2번의 경우는 하나의 보석을 움직여 제거되는 보석들을 그룹으로 지정하고 이들 그룹을 Queue 로 관리하도록 하여 제거 대상 보석들끼리의 간섭을 없애기 위함이다

1등 친구의 프로그램의 경우 위와 같은 간섭을 줄이기 위해 화면을 분할하여 제거하도록 한다고 하였는데 그룹핑하는 것이 더 효과적일거라 생각한다


저 정도면 아마 봇으로는 최대로 뽑아낼 수 있는 점수가 나오지 않을까 싶다

부가적으로 다음과 같은 편의 기능이 있으면 좋겠는데


1. 게임 시작과 끝을 인식하여 자동 반복

2. 아이템 자동 사용

3. 게임 실패 정보와 추가된 보석의 정보를 logging


근데... 이거 상용으로 팔것도 아닌데 내가 왜 여기까지 생각하는지 모르겠다 ㅎㅎ


BejeweledAI.zip


'정보 > IT' 카테고리의 다른 글

[javascript/HexToDec]unsigned 와 음수  (0) 2012.05.31
제7회 공감세미나 동영상  (0) 2012.05.07
Java 에서 File 의 내용 수정 여부 판단  (0) 2012.03.06
Javascript Preprocessor  (5) 2012.02.22
GanttProject - 프로젝트 관리툴  (0) 2011.09.05