개발/Mighty Online

Game Logic의 OOP Refactor

Syphon 2020. 2. 9. 04:37

새로 정의된 Play

다시 논문을 읽으러 가겠다고 선언한지도 3개월이다.

 

그 사이에 있었던 일은 대략 다음과 같다:

1. 논문을 다시 읽었다.

2. ISMCTS를 다시 이해했다.

3. AI 코드를 작성하던 중, game logic의 구현 방법이 마음에 들지 않았다. 예외처리가 너무 많아졌다.

4. 이에 game logic 모듈을 조금 더 객체지향적으로 refactor할 필요성이 생겼다.

5. 시간이 많이 지나 다시 ISMCTS를 잊어버렸다.

6. 그래도 refactoring은 성공적으로 마쳤다.

 

이전의 카드 / 문양 등등이 전부 다 문자열이었던 것에 반해 새로운 구현은 모든 것이 class이다.

AI 구현 중에 가장 큰 문제가 되었던 것이 play 처리의 어려움이었다. Play를 단순한 (플레이어, 카드) 튜플로 처리하기에는 조커콜, 조커 등의 특수한 수들이 존재했기 때문이다. 이를 해결하기 위해서 추가적인 정보를 포함한 Play 클라스를 만들었다.

 

이런 대규모의 refactoring은 해본 경험이 없었기에 어떻게 접근해야 할 지가 난감했었다. 한 부분씩 바꿔나가며 작동을 확인하는 것이 이상적이겠지만, 바꿔야 하는 부분이 너무 많았고 또 복잡하게 서로 맞물려 있는 코드의 특성상 부분부분 바꾸는 작업은 너무나도 오래 걸릴 것 같았다. 그래서 좀 무식한 방법을 사용했다:

1. 필요한 class들을 전부 정의한다.

2. 코드를 첫번째 줄부터 마지막 줄까지 보면서 한줄 한줄 refactoring한다. (당연히 중간에 test는 못한다)

3. 더이상 사용되지 않는 옛 함수/변수/클라스들을 전부 다 지운다.

4. 코드가 작동되기를 바란다. (물론 바라기만 한다 - 될 리가 없거든)

5. 즐거운 디버깅 타임.

 

결과적으로 기존의 game_logic.py는 card.py, constructs.py, engine.py의 세 모듈로 나누어졌다. card.py에는 새로 정의한 플레잉 카드 관련 클라스들이, engine.py에는 게임 엔진과 직접적으로 관련된(i.e. 게임 엔진 밖에서는 사용되지 않는) 클라스들이, 그리고 constructs.py에는 나머지 잡다한 함수/클라스들이 있다.

 

디버깅 시간 포함 refactoring은 총 5시간 정도가 걸렸다. 생각보다 수월하게 진행된 것 같다. 결과적으로 코드가 더 깔끔해지고 디버깅하고 확장하기에도 더 편해진 느낌이다. 물론 제일 중요한 점은 이제 ISMCTS의 구현이 가능해졌다는 것이다.

 

아직 AI 모듈은 refactoring된 game logic을 사용하도록 패치하지 않아 호환이 되지 않는 상황이다. 이제 AI 작업에 집중해야지.

 

근데 ISMCTS가 뭐더라?

 

다시 논문을 읽으러 간다.

'개발 > Mighty Online' 카테고리의 다른 글

Mighty Online: Tranquil Tempest 개발기 #1  (0) 2019.11.15