2011년 2월 20일 일요일

백업] 네이버 33

출처 오래된 청바지 | 용여리
원문 http://blog.naver.com/happy_medium/40002114375
1. 단위 설명

이 기사에서 로보코드에 대한 설명을 위해서 다음과 같은 단위를 정의한다.

V : 내 로봇의 속도

Ven  : n 번째 적 로봇의 속도

Vp  : 포탄의 속도

A : 레이더, 총, 로봇의 frame 당 회전율 (Ard ,Ag ,Arb )

frame : 로보코드에서의 시간의 단위

P : 포탄의 화력, 0.1 ≤ P ≤ 3

E : 로봇의 에너지, 0 ≤ E ≤ 100

Egain : 발사한 포탄이 적중 했을 때 내가 얻게 되는 에너지.

Edmg : 포탄에 맞았을 때의 에너지 손실량.

Ewall : 벽에 부딪혔을 때의 에너지 손실량.

Ecld : 로봇끼리 충돌했을때의 에너지 손실량.


T : 포탄 발사 후 온도 상승.


2. 단위의 범위 및 관련 사항

로봇에 관한 여러가지 수치에 대한 설명과 관련 사항에 대한 설명

- 시간단위 -

로보코드 프로그램에서 설정할 수 있는데 초당 n 개의 프레임이라면 한 프레임을 처리하는데 1/n 초가 필요하다는 뜻이다. 컴퓨터 성능이 좋다면 초당 프레임 수를 늘려도 되지만 성능이 따라주지 않는다면 frame 수를 조금 낮추는 것이 좋다. ( 로보코드에서는 default 로 30 frames pre second 로 설정되어있다.


- 로봇의 속도 -

내 로봇의 속도는 로봇의 회전율(Arb) 과 밀접한 관련이 있다.

        4Arb + 3V = 40

위의 공식은 로봇의 회전율과 속도에 관한 일차 방정식으로서 속도가 올려갈수록 로봇의 회전율은 낮아진다는 것을 의미한다. 일반적으로 자동차가 빨리 달릴때 커브를 날카롭게 할 수 없는 것과 같은데, 원심력을 시뮬레이션한 것이라고 생각하면 된다.

또한 로봇이 가속될때 1pixel/frame 의 가속도가 붙는다. 다시 말하면 로봇이 가속될때는

        V = 0, 1, 2, 3, 4, 5, 6, 7, 8

의 식으로 가속되어서 속도가 8이 되면 더이상 속도가 증가하지 않는 것이다.

감속할때는 2pixel/frame 으로 감속된다. 현재 로봇의 속도가 8이라면 8, 6, 4, 2, 0 으로 감속이 된다. 로봇의 최대 속도는 8이라는 점을 기억해두는 게 좋다.

- 포탄 -

포탄도 로봇과 마찬가지로 발사 속력을 갖는데 포탄의 화력이 셀수록 속력은 느려지는데 포탄의 속력 공식은 다음과 같다.

        Vp + 3P = 20

여기서 포탄의 화력(P) 는 다음의 범위를 가지므로

        0.1 ≤ P ≤ 3

공식으로부터 포탄의 속력 범위는 다음과 같다.

        11 ≤ Vp ≤ 19.7

포탄의 적중시 에너지 변화는 "-에너지증감-" 파트에 기술되어 있다.


- 온도 변화 -

포신의 온도(T)가 0이 아니면 포탄을 발사할 수 없다. 포탄을 하나 발사할때마다 

        P/5 + 1

도만큼 온도가 상승한다. 그리고 가열된 포신이 식는데에는

        0.1/frame

의 시간이 필요하다.

만일 에너지가 1인 포탄을 발사하면 온도는 1.2 도가 된다. 포신의 온도가 중요한 이유는 고에너지의 포를 연달아 발사하면 포신이 식는데 많은 시간이 걸리게 되므로 당분간 포탄을 발사하지 못하는 낭패를 겪게 된다. (아주 짧은 시간이지만 예선에서 10명이  게임하는 것을 고려하면 그 짧은 시간에 어마어마한 에너지 손실을 입을 수 있다.)

위에서 초당 30 프레임으로 설정되었을 경우, 0 frame 에 P = 1 인 에너지를 발사하면 포신의 온도는 1.2 가 된다. 그러면 포신이 식는데 12 프레임이 필요하므로 12/30 = 0.4 초 정도의 시간동안은 포탄을 발사할 수 없다. 포탄의 에너지가 3일때 16 프레임의 대기 시간이 필요하고 0.1 일때는 약 10 프레임 시간이 필요하다.

다시 말하면 적은 에너지의 포탄은 손상을 적게주지만 빠르고 대기 시간이 짧아서 더 많이 발사할 수 있고 높은 에너지의 포탄은 손상을 많이 주지만 느리고 대기 시간이 길다는 뜻이므로 적절히 분배해서 사용해야 한다.


- 회전율 -

회전율에는 로봇의 회전율과 포신의 회전율, 그리고 레이더의 회전율이 있다. 회전율이 높은 순서대로 나열하면

        레이더의 회전율 > 포신의 회전율 > 로봇의 회전율

순이다. public class Robot 에서는 이 세가지가 회전할 때 서로 연관을 가지지 않도록 하는 메소드가 있다.

        setAdjustGunForRobotTurn( boolean true);
        setAdjustRadarForGunTurn( boolean true);
        setAdjustRadarForRobotTurn( boolean true);

이들 메소드를 사용하지 않는다면 만일 로봇의 동체가 20도 오른쪽(시계방향)으로 회전하면 그 위에 장착된 포신(Gun)과 레이더 모두 20로 회전하게 된다. 로봇을 20도 회전하면서 포신을 30도 오른쪽으로 회전시키면 로봇의 동체는 20도 회전하지만 포신은 20+30 으로 50도를 회전하게 된다. 레이더의 경우도 마찬가지다.

이렇게 세 장치가 서로의 회전에 영향을 주므로 기초단계에서는 포신과 레이더가 로봇 동체에 고정되어있는 상태에서 로봇의 동체를 돌려서 적을 공격하는 전략을 많이 사용하지만 기동성이 떨어지는 단점이 있다. 고수들의 로봇은 이 세가지 장치가 각각 독립적으로 회전을 하도록 만들어서 레이더가 적을 포착하면 포신이 그 각도를 찾아서 적을 공격하고 로봇의 본체는 적의 공격을 피하기 위해서 분주하게 움직이는 식으로 운용된다.

이러한 고급 전략을 구사하기 위해서 각 장치들이 서로 독립적으로 움직이게 설정하는 것이 바로 위의 세가지 메소드이다.  setAdjustGunForRobotTurn(true) 을 호출하면 로봇의 동체가 움직이더라도 포신은 원래 향하던 방향을 그대로 유지하게 된다. 로봇이 왼쪽으로 40도 움직이면 로봇의 포신은 오른쪽으로 40도 움직여서 자신의 회전각을 유지하는 것이다.

로봇 동체의 회전은 나머지 두 장치에 영향을 주고 포신(Gun)의 회전은 레이더에 영향을 주므로 세개의 메소드가 필요한 것이다.


① 로봇의 회전율

로봇의 회전율은 로봇의 진행 속도와 관련이 있다. ( "-로봇의 속도-" 파트에서 설명되어 있으므로 참고하기 바란다).  4Arb + 3V = 40 의 공식을 적용하면 로봇의 회전율은

        4 ≤ Arb ≤ 10

의 범위를 갖는다. (최대 속도는 8 이므로) 최대 10 의 회전율이라면 로봇이 정지한 상태에서 한바퀴를 회전하는데 36 프레임이 필요하다는 뜻이기도 하다.


② 포신의 회전율

포신의 회전율은 프레임당 20도로서 로봇의 속도에 독립적이다.
setAdjustGunForRobotTurn(true); 를 설정했다면 로봇의 의 회전에도 독립적이다.
360도를 회전하려면 18 프레임의 시간이 필요하다.

③ 레이더의 회전율

레이더의 회전율은 프레임당 45도로서 로봇의 속도에 독립적이다.
setAdjustRadarForRobotTurn(true); 를 설정했다면 로봇의 의 회전에도 독립적이다.
setAdjustRadarForGunTurn(true); 를 설정했다면 포신의 회전에도 독립적이다.
360도를 회전하려면 8 프레임의 시간이 필요하다.

- 에너지 증감 -

포탄이 발사되면 포탄을 발사한 로봇과 포탄에 맞은 로봇 사이에 에너지 교류가 일어난다. 우선 포탄을 발사하면 포탄의 에너지만큼 에너지가 줄어들게 된다.

        E -> E-P

만일 발사한 포탄에 적에게 명중하면

        Egain = 3P

만큼을 얻게 되므로 최종적으로 내 에너지는 2P 만큼 증가하게 된다.

포탄에 맞은 로봇은

        if P < 1, then Edmg = 4P
        else if P ≥ 1, then  Edmg = 4P + 2(P-1)

의 에너지 손실이 발생한다. 포탄의 에너지(P)가 1보다 크면 추가로 2(P-1) 의 에너지 손실이 더 발생하므로 만일 에너지 3 의 포탄에 맞으면 4*3 + 2(3-1) = 16 만큼의 에너지 손실이 발생한다.

내 로봇을 구현 할 때 AdvancedRobot 클래스를 상속했다면 게임영역의 외곽, 즉 벽에 부딪힐 경우에도 에너지 손실이 발생하는데 그 손실량은 다음과 같다.

        Ewall = root(V)/2 - 1

내 로봇의 속력이 높을 수록 벽충돌시 많은 에너지를 잃는 것이다. (어디까지나 AdvancedRobot 클래스를 구현했을때에만 해당되므로 Robot 클래스를 구현했다면 신경쓰지 않아도 된다.)

로봇끼리 충돌했을때도 에너지 증감이 발생한다. 일단 두 로봇이 충돌하면 모두 0.6의 에너지 손실이 발생하고 1.2 점의 에너지를 얻게된다고 하는데, 어느쪽이 1.2 를 얻는 것인지는 아직 확실히 모르겠다. (모르면 모른다고 말하자... -_-;;)

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...