어제오늘 버전관리 시스템 구축을 위해 이것 저것 만지고 다시 로보코드로 생각이 미쳐서 이런저런 가능성들을 머릿속으로 정리해 가던중 한가지 문제가 포착되었다. 로봇의 움직임에만 중점을 둔 나머지 다른 요소들에 신경을 미쳐 쓰지 못했다는 거다. 당시에는 이거 만들고 억지로 끼워맞추면 되겠지 하는 생각이었는데 전체적으로 생각해보니까 그러면 안될것 같다. 옛말에 '나무를 보지 말고 숲을 보라'라는 말이 있는데 딱 그짝이다. 너무 나무만 들여다 보았다. 나무를 심다보면 숲이 되겠지라는 생각을 하고 만거다. 결국 숲이 이상해져서 다시 나무를 심어야 될지도 모르는데... 항상 이런 생각은 뒤늦게 든다. 그리고 후회를 하는데 이번엔 행운인지 불행인지 너무나 늦게 코딩에 뛰어들어서 코딩전에 로드맵을 고칠 수 있게 되었다.

이번엔 전체적인 상황을 놓고 가상 시나리오를 한번 써봐야겠다. 그게 생각하기도 싶고 클래스나 함수 변수를 구성하는데 도움이 될 것 같다. 소프트웨어 표준에 맞춰서 문서를 구성하면 더없이 좋겠지만 나는 어찌된 영문인지 그렇게 딱딱하게 틀에 맞춰 생각을 하려고 하면 생각이 잘 떠오르지 않을 때가 많다. 떠오른 생각을 정리하기에는 일정한 틀이 좋기는 하겠지만... 어찌되었던 이제 자바 로보코드 시스템과 가장 흡사한 현실상황을 설정해서 시나리오를 시작해본다. 내가 생각해 낸 가장 흡사한 시스템은 바로 무선을 통해 조종이 되는 로봇탱크를 이용한 전투다.

무선으로 조종하는 전투탱크를 이용한 전투 경기가 있다. 잠재적인 성능은 모두 동일하고 로봇은 무선조종을 하는 사람의 판단에 따라 움직임이 결정된다.

여기에서 로봇과 사람이 얼마나 원할하게 소통하는지가 중요해진다. 로봇이 움직이려면 사람이 움직임을 결정해주어야 한다. 이때 중요한 정보가 로봇이 앞으로 이동할 위치와 대포의 방향이다. 이외에도 속도나 적의 위치파악을 위한 레이더의 스캔횟수와 방법 등 기타 몇가지 요소가 있겠지만 우선은 직접적인 움직임과 공격시에 중요한 역학을 하는 이동좌표, 대포각도를 주 요소로 삼는다.

이제 로봇과 사람으로 나누어서 각각의 역할을 알아보자.

먼저 로봇의 역할을 보자. 로봇은 기계이다. 따라서 판단이나 생각을 하지 않는다. 단지 무선으로 전해지는 정보를 통해 움직일 뿐이다. 그렇다면 로봇의 움직임을 생각해 봐야겠다. 로봇은 바퀴가 있어서 앞이나 뒤로 이동하고 핸들조작을 통해 방향을 바꿀수도 있다. 그리고 포대가 있어서 포대의 방향을 바꾸고 포를 쏘기도 한다. 이때 바퀴와 핸들을 통해 좌표값이 설정되고 포대의 방향으로 결정하는 것이 대포각도이다.

이번에 사람의 역할을 보자. 사람은 여러가지 정보를 파악해서 가장 최선이라고 여기지는 정보를 로봇에게 제공하는 역할을 한다. 로봇에게 전해주는 주요정보는 이동좌표, 대포각도이다. 사람은 적로봇의 좌표, 대포방향 등을 토대로 예측을 통해 내 로봇에게 가장 최적의 정보를 전달하게 된다. 이런 정보전달을 위해서 적로봇의 현재위치를 시간별로 추적하여 미래의 적로봇위치를 예상하고 이 위치에서 최대한 먼 거리를 유지한다. 또한 포대의 방향은 항상 적 예상 지점을 향한다. 탱크의 데미지는 대포를 통한 공격데미지와 직접적인 부딪침에 의한 충격데미지가 있다. 따라서 이동시에는 항상 벽을 염두에 두고 불필요한 충격데미지가 생기지 않도록 할 필요가 있다.

전체적인 로드맵을 그려보았다. 이제 이 로드맵을 클래스, 함수, 변수로 옮겨보자.
Class StyleRobot //로봇과 사람이 정보를 공유하고 실행되는 클래스
Class RobotBody //로봇의 움직임이 있는 클래스
  movingRobot(int x, int y) //로봇몸체의 움직임이있는 함수
  gunAngle(int a) //대포의 움직임이 있는 함수
Class ControlCenter //로봇의 상태를 분석하고 로봇의 움직임을 정해주는 클래스
  int clltMvX() //로봇이 이동할 x좌표를 계산하는 함수, 단 벽에 부딪치지 않게 가드라인을 둔다.
  int clltMvY() //로봇이 이동할 y좌표를 계산하는 함수, 단 벽에 부딪치지 않게 가드라인을 둔다.
  int clltMvA() //로봇의 최적 몸체각도를 계산하는 함수
  int clltGnA()  //로봇의 최상 대포각도를 계산하는 함수

챕터2를 토대로 이번에 코딩에 들어가 볼까?