반응형
자바와 게임의 만남 '로보코드 코리아컵 2007'
- 자바 프로그래밍 언어를 기반으로 제작한 로봇 간의 대결
- 자바개발자 커뮤니티인 JCO와 취업전문포탈인 인크루트 후원

(2007.8.8) 한국IBM(대표 이휘성)은 8월 8일 자바 기반의 프로그래밍 게임 대회인 로보코드 코리아컵 2007 결승전을 개최했으며, 우승은 김동환씨(고려대 신소재공학부)가 차지했다고 발표했다.

지난 2003년에 첫 대회가 개최된 이래 4회째를 맞는 ‘로보코드 코리아컵 2007’은 자바 기반의 프로그래밍 대회로 국내 자바 개발자 커뮤니티 모임인 JCO(JAVA Community Organization)와 인크루트가 후원하고 있다.

로보코드 코리아컵은 올 5월 로봇신청 접수를 시작하여 7월 말에 접수를 마감했으며, 64강전과 32강전을 치르고 오늘 16강전부터 결승전까지 치름으로써 최종 승자가 가려졌다. 준우승은 이종혁씨(경기대 컴퓨터과학과), 3위는 조규현씨(호남대 인터넷소프트웨어학과) 가 각각 수상했다.

로보코드는 지난 2001년 IBM의 개발자인 맷 넬슨이 개발한 게임으로서, 사용자들이 직접 자바를 기반으로 인공지능이 담긴 로봇을 만들어 전투를 벌이게 된다. 예선전에서는 그룹별 전투를 거쳐 최종 점수가 가장 높은 로봇이 승리하게 되며, 64강전부터는 1대1의 토너먼트 방식으로 진행된다. 각 참가자들은 최대 3개까지 로봇을 제출할 수 있다.

로보코드 참가자는 자바 언어의 요소를 사용하여 자신의 로봇을 만들면서 프로그래밍 언어를 익힐 수 있어 재미와 기술을 동시에 얻을 수 있다. 특히 초보자들도 쉽게 배울 수 있도록 로보코드 코리아컵 홈페이지(www.ibm.com/developerworks/kr/robocode)를 통해 개발 방법을 소개하고 있다.

또 로보코드는 오픈소스를 기본 전제로 하고 있어 샘플 로봇뿐 아니라, 등록되어 있는 다른 개발자들이 소스를 다운받아 분석하고 자신의 소스를 업로드하는 과정을 반복하면서 로봇은 점차 진화하게 된다.

한국IBM은 올초 developerWorks 대학생 모니터 요원을 선발하여 대학 내 로보코드 홍보를 강화했으며, 고려대, 서울여대, 목포대, 세종대, 숭실대, 동국대, 전남대 등의 요청으로 출장 강의를 진행하는 등 대학생 개발자들의 큰 호응을 얻었다.

한국IBM 솔루션 파트너 사업부의 계혜실 실장은 "IBM은 오픈 소스를 적극적으로 지원하고 있으며, 로보코드를 통해 자바 언어에 대한 대학생 및 개발자들의 관심과 흥미가 크게 증대되었다고 본다. 향후에도 다양한 오픈 소스 지원 정책과 프로그램을 통해 개발자들에게 많은 기술정보와 커뮤니티 환경을 제공할 예정”이라고 밝혔다.

--------------------------------------------------------------------------------------------------------------------
참고자료

- 로보코드의 특징: 각 로보코드 참가자는 자바 언어의 요소를 사용하여 자신의 로봇을 만들면서 자바가 갖고 있는 상속성, 다형성, 이벤트 처리 및 내부 클래스 다루는 방법을 배우게 된다. 표준 API(Application Program Interface)를 지향하지만, 커스터마이징할 수 있는 이벤트를 갖고 있다. 따라서 개발자들이 창의적일수록 로봇이 전투에서 살아남을 가능성이 높아진다. 특히, 로보코드는 초보자부터 고급 프로그래머에 이르기까지 모든 수준의 개발자들이 참가할 수 있다.

- 로보코드의 기반 솔루션: 로보코드는 이클립스, 웹스피어, DB2, 웹스피어 애플리케이션 디벨로퍼를 사용하여 개발되었으며, 참가자들은 IBM이 제공하는 API를 이용해 쉽게 로봇을 만들 수 있다.
반응형

프로젝트를 만들었으면 로봇도 만들어야 하겠져?

이제 로봇을 만들어 봅시다.

원문은 먼저 올라온 글과 멀리 떨어진 곳이 아니니 함 찾아보세요

클래스를 만듭니다. 프로젝트안에 들어갈 클래스를 만들기 위해 NEW->CLASS  를 클릭합니다.

 


패키지는 자신의 이름에 대한 이니셜을 넣고(IBM 권장사항),
클래스명엔 자신의 로봇이 갖길 원하는 이름을 넣습니다.
슈퍼클래스는 robocode.Robot 으로 넣어줍니다



성공하면 다음과 같은 화면이 나옵니다.


이제 원하는 코드를 넣을 수가 있습니다.

(영어 실력이 짧은지라 원문 그대로 갖고옵니다. 알아서 해석 하시길)

You can save your robot as often as you like by hitting CTRL-S, or selecting "File->Save". There's no need to select Compile anymore, since Eclipse takes care of it for you. Have fun playing around with Eclipse. Personally, I like to change all the colors, turn off bold print, move the windows around, and do all sort of things to customize it to my liking. Since there's no better way to learn than by playing around, I'll leave you to it! (Hint: Workbench -> Preferences -> Java -> Editor -> Colors)

The only thing left is to make sure Robocode sees your robot.

반응형

로보코드를 실행한 후
Options->Prefereces->Development Options 클릭 후 해당 '프로젝트' 의 위치를 기입합니다.


Finish 버튼을 누르고 Battle -> New 로 가면 패키지를 찾은것을 볼 수 있습니다.

아래는 이클립스에 대해 설명이 올라와있는데
원문에는 이클립스에 대한 찬사나 간단한 사용법을 쓰고 있습니다.
궁금하면 원문을 참고해주세요

이클립스 단축키

Ctrl - S 저장
Ctrl-Space 멤버 메소드 출력

반응형
이클립스 환경에서 로보코드 로봇을 빌드하려면, 먼저 프로젝트를 만들어야 합니다.

1. File->New->Project 에서 프로젝트를 만듭니다.

자바 프로그램이기 때문에 그냥 "Java Project" 를 선택해줍니다.


Finish 버튼은 절대 누르지 마시고, Next 를 누릅니다.


이제 프로젝트 세팅을 할 차례입니다. robocode 패키지 안에는 라이브러리, JAVADoc 이 있기 떄문에
이것들도 링크를 해줘야 합니다.(뭐 JAVADOC 이 머리속에 있다면 라이브러리만 링크해줘도 상관 없습니다.)

위 화면처럼 만든 후 Add External JARs.... 를 클릭합니다.

로보코드가 설치되있는 폴더로 찾아가 robocode.jar 을 엽니다.


이제 Javadoc 을 세팅해줄 시간입니다.

Javadoc Location 에서  Edit 를 누르고

Browse를 이용해서 해당 경로를 지정해주거나, 경로를 외고 있다면 위 형식에 맞게 지정해주면 끝!!

이제 탱크를 만들 수 있습니다.

반응형

난이도 : 초급

McCoy David, Writer, Independent

2007 년 4 월 17 일

코너에 갇히거나 원하는 이동 방향에서 너무 많이 벗어나지 않으면서, 로봇과 벽 사이의 간격을 유지하는 알고리즘은 간단히 만들 수 없는 것 같습니다. 한 가지 간단한 솔루션으로, Factored wall avoidance가 있습니다. 이 글에서, David McCoy가 이를 구현하는 방법을 설명합니다.

With a few additions to the bot we built in "상대편의 움직임 추적하기"에서 구현했던 로봇에 몇 가지를 더 추가하여, 기존의 움직임 알고리즘 또는 문제가 많은 움직임 알고리즘에 Factored Wall Avoidance를 추가할 수 있다. Factored Wall Avoidance는 자신의 로봇과 벽의 근접성에 따라서 안전한 방향 설정(heading)으로 원하는 방향을 팩토링 함으로써 최상의 방향을 찾는 것이다.

일반 수학적 계산에 헬퍼 메소드 추가하기

우선 자주 사용되는 수학적 알고리즘에 헬퍼 메소드를 로봇에 추가한다.

calculateBearingToXYRadians() 메소드는 java.lang.Math 메소드 atan2()를 사용하여 sourceX,sourceY에서 targetX,targetY까지 절대 위치(absolute bearing)를 계산한 다음, 이 값을 sourceHeading에 관련된 위치로 변환한다.

그리고 normalizeAbsoluteAngleRadians() 메소드와 normalizeRelativeAngleRadians() 메소드도 필요하다.


Listing 1. 수학 헬퍼 메소드
                

private static final double DOUBLE_PI = (Math.PI * 2);
private static final double HALF_PI = (Math.PI / 2);

public double calculateBearingToXYRadians(double sourceX, double sourceY,
    double sourceHeading, double targetX, double targetY) {
        return normalizeRelativeAngleRadians(
           Math.atan2((targetX - sourceX), (targetY - sourceY)) -
               sourceHeading);
    }

public double normalizeAbsoluteAngleRadians(double angle) {
   if (angle < 0) {
        return (DOUBLE_PI + (angle % DOUBLE_PI));
    } else {
        return (angle % DOUBLE_PI);
    }
}

public static double normalizeRelativeAngleRadians(double angle) {
    double trimmedAngle = (angle % DOUBLE_PI);
    if (trimmedAngle > Math.PI) {
        return -(Math.PI - (trimmedAngle % Math.PI));
    } else if (trimmedAngle < -Math.PI) {
        return (Math.PI + (trimmedAngle % Math.PI));
    } else {
        return trimmedAngle;
    }
}




위로


AdvancedRobot을 back-as-front 기능으로 확장하기

다음으로, 로봇을 반대로 이동시키기 위한 back-as-front 기능을 제공하기 위해 AdvancedRobot 클래스 기능을 몇 가지 헬퍼 메소드로 확장할 필요가 있다.

  • getRelativeHeading() 메소드는 로봇의 현재 위치와 관련하여 정확한 방향을 계산한다.

  • reverseDirection() 메소드는 매우 단순하다. direction 인스턴스 변수를 토글링(toggle) 하고 로봇의 방향을 바꾼다. 감속할 때에는 시간이 걸리기 때문에 로봇은 속도에 따라서, 방향을 바꾸기 전에 최대 네 개의 프레임까지 같은 방향으로 움직일 수도 있다.

  • setAhead()setBack() 메소드는 AdvancedRobot 클래스에서 같은 이름의 메소드를 오버라이드 한다. 현재 방향에 대한 로봇의 속도를 설정하고, direction 인스턴스 변수를 필요에 따라 조정한다. 비례 연산은 로봇이 현재 움직이고 있는 방향과 관련이 있다.

  • setTurnLeftRadiansOptimal()setTurnRightRadiansOptimal() 메소드는 (Math.PI / 2) 보다 크게 회전하여 로봇의 방향을 바꾼다. adjustHeadingForWalls 메소드를 사용할 때 이러한 메소드들을 사용해야 하는데, 나중에 설명하겠다.

주: getter와 setter 메소드를 사용하는 대신 direction 인스턴스 변수에 직접 액세스 한다. 이것은 좋은 방법은 아니지만, 나는 내 로봇 코드에 이를 수행하여 데이터 액세스 속도를 높이곤 한다.


Listing 2. 로봇 헬퍼 메소드
                


public double getRelativeHeadingRadians() {
    double relativeHeading = getHeadingRadians();
    if (direction < 1) {
        relativeHeading =
                normalizeAbsoluteAngleRadians(relativeHeading + Math.PI);
    }
    return relativeHeading;
}

public void reverseDirection() {
    double distance = (getDistanceRemaining() * direction);
    direction *= -1;
    setAhead(distance);
}

public void setAhead(double distance) {
    double relativeDistance = (distance * direction);
    super.setAhead(relativeDistance);
    if (distance < 0) {
        direction *= -1;
    }
}

public void setBack(double distance) {
    double relativeDistance = (distance * direction);
    super.setBack(relativeDistance);
    if (distance > 0) {
        direction *= -1;
    }
}

public void setTurnLeftRadiansOptimal(double angle) {
    double turn = normalizeRelativeAngleRadians(angle);
    if (Math.abs(turn) > HALF_PI) {
        reverseDirection();
        if (turn < 0) {
            turn = (HALF_PI + (turn % HALF_PI));
        } else if (turn > 0) {
            turn = -(HALF_PI - (turn % HALF_PI));
        }
    }
    setTurnLeftRadians(turn);
}

public void setTurnRightRadiansOptimal(double angle) {
    double turn = normalizeRelativeAngleRadians(angle);
    if (Math.abs(turn) > HALF_PI) {
        reverseDirection();
        if (turn < 0) {
            turn = (HALF_PI + (turn % HALF_PI));
        } else if (turn > 0) {
            turn = -(HALF_PI - (turn % HALF_PI));
        }
    }
        setTurnRightRadians(turn);
}




위로


Factored Wall Avoidance 추가하기

소셜 북마크

mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

우리가 추가할 마지막 메소드는 adjustHeadingForWalls()이다.

이 메소드의 초반부는 벽과의 근접성에 기반하여 안전한 x,y 위치를 선택한다. (이것은 로봇의 현재 x 또는 y 좌표 또는 로봇이 벽에 가까이 있을 경우 중심점이 될 것이다.) 이 메소드의 후반부는 "안전한" 방향을 계산하고 로봇이 벽에 얼마나 근접해 있는가에 비례하여 원하는 방향으로 이를 팩토링 한다.

로봇이 벽으로 나아가는 정도는 WALL_AVOID_INTERVALWALL_AVOID_FACTORS 상수를 사용하여 조정될 수 있다.


Listing 3. 벽 피하기 메소드
                

private static final double WALL_AVOID_INTERVAL = 10;
private static final double WALL_AVOID_FACTORS = 20;
private static final double WALL_AVOID_DISTANCE =
        (WALL_AVOID_INTERVAL * WALL_AVOID_FACTORS);

private double adjustHeadingForWalls(double heading) {
    double fieldHeight = getBattleFieldHeight();
    double fieldWidth = getBattleFieldWidth();
    double centerX = (fieldWidth / 2);
    double centerY = (fieldHeight / 2);
    double currentHeading = getRelativeHeadingRadians();
    double x = getX();
    double y = getY();
    boolean nearWall = false;
    double desiredX;
    double desiredY;

    // If we are too close to a wall, calculate a course toward 
    // the center of the battlefield.
    if ((y < WALL_AVOID_DISTANCE) ||
            ((fieldHeight - y) < WALL_AVOID_DISTANCE)) {
        desiredY = centerY;
        nearWall = true;
    } else {
        desiredY = y;
    }
    if ((x < WALL_AVOID_DISTANCE) ||
            ((fieldWidth - x) < WALL_AVOID_DISTANCE)) {
        desiredX = centerX;
        nearWall = true;
    } else {
        desiredX = x;
    }

    // Determine the safe heading and factor it in with the desired 
    // heading if the bot is near a wall
    if (nearWall) {
        double desiredBearing = 
           calculateBearingToXYRadians(x, 
                                       y, 
                                       currentHeading, 
                                       desiredX, 
                                       desiredY);
        double distanceToWall = Math.min(
                Math.min(x, (fieldWidth - x)),
                Math.min(y, (fieldHeight - y)));
        int wallFactor =
                (int)Math.min((distanceToWall / WALL_AVOID_INTERVAL),
                              WALL_AVOID_FACTORS);
        return ((((WALL_AVOID_FACTORS - wallFactor) * desiredBearing) +
                 (wallFactor * heading)) / WALL_AVOID_FACTORS);
    } else {
        return heading;
    }
}




위로


결론

나머지는 쉽다. 현재의 네비게이션 알고리즘을 사용하고 adjustHeadingForWalls() 메소드를 통해 그 결과를 제공함으로써 벽을 피할 수 있다.

단순하게 하기 위해 로봇 예제(다운로드)는 방향 변경에 0을 요청하여 직선 라인으로 움직일 것이다.


Listing 4. 벽 피하기 메소드
                


public void run() {
    while(true) {
        setTurnRightRadiansOptimal(adjustHeadingForWalls(0));
        setAhead(100);
        execute();
    }
}

이제 다 되었다. 간단하지만, 효과적이다.
<출처: http://www.ibm.com/developerworks/kr/library/j-fwa/>

반응형

로보코드에서는 게임의 재미를 위해서 적 로봇의 좌표나 현재 방향각(Heading) 을 손쉽게 알 수 있게 하지 않았다. 만일 레이더로 스캔한 로봇이 좌표를 즉각 알 수 있다면 내 로봇의 좌표를 고려해서 손쉽게 적의 위치를 알 수 있으므로 게임의 재미가 떨어질 것이다. 여기서는 레이더로 스캔한 로봇의 정보를 제공하는 ScannedRobotEvent 를 통해서 상대 로봇의 위치와 방향각 등을 알아내는 방법을 정리하겠다.




1. 기본적인 방향각 설명


우선 로보코드에서 각도를 다루는 방식에 대한 기본적인 설명을 하겠다.

사용자 삽입 이미지

로보코드에서는 게임필드의 맨 위쪽을 0도로부터 시계방향으로 각도를 부여하고 있다. 각도를 규정해 놓은 것은 아니지만, 이러한 기준하에서 모든 메소드가 구현되었으므로 이 기사에서도 위의 각도를 기준으로 설명을 할 것이다.



- getHeading() -


이 메소드가 읽어오는 각도가 바로 나의 방향각 Dm(Degree of mine) 이 되고 단위는 도(degree) 이다. Dm 의 범위는  0 ≤ Dm<360 이다.


- getGurnHeading() -


이 메소드가 읽어오는 각도가 바로 포신(Gun)의 방향각 Dg(Degree of Gun) 이 되고 단위는 도(degree) 이다. Dg 의 범위는  0 ≤ Dg<360 이다. 위 그림에서는 포신의 각도가 로봇 본체의 각도와 같게 되어있지만 실전에서는 포신의 각도가 다양하게 변한다.


- getRadarHeading() -


이 메소드가 읽어오는 각도가 바로 레이더의 방향각 Dr(Degree of Radar) 이 되고 단위는 도(degree) 이다. Dr 의 범위는  0 ≤ Dr<360 이다. 그림 왼쪽 상단에 확대된 그림을 보면 레이더가 0도 부근을 향하고 있는 모습이 보인다. 실전에서 레이더는 주변을 scan 하기 위해서 분주히 움직이도록 프로그램 되는게 일반적이다.



여기서 설명한 각도는 모두 Heading 이라는 점을 꼭 기억해야 한다. 아래에서 Bearing 이라는(이것 역시 각도이다.) 각도에 대한 설명이 나오는데, Heading 은 0도를 기준으로 한 절대각도라는 것과 0도에서 360도 사이에서 변화한다는 것을 꼭 알아둬야 밑에서 헷갈리지 않을 것이다.


* 위 그림에서 확대된 로봇을 보면 작은 사각형 두개가 로봇 본체에 붙어있는데, 저 표시가 있는 쪽이 로봇의 앞부분이다. 앞으로 설명을 위해서 로봇의 앞쪽에 대해서는 실선을, 로봇의 뒤쪽에 대해서는 점선을 이용할 것이다.




2. ScannedRobotEvent


내 로봇의 레이더가 적을 스캔하면 이벤트가 발생되어서 onScannedRobot(); 메소드가 실행된다. 이 메소드에 argument 로 전달되는 것이 바로 ScannedRobotEvent 인데 이 이벤트에는 다음과 같은 정보를 담고 있다.


Constructor Summary
ScannedRobotEvent(String name, double energy, double bearing, double distance, double heading, double velocity)
          Called by the game to create a new ScannedRobotEvent.


        String name      : 스캔한 로봇의 이름

        double energy   :  스캔한 로봇의 잔여 에너지

        double bearing   : 내 로봇을 기준으로 스캔한 로봇의 방향각

        double distance : 내 로봇과의 거리

        double heading  : 스캔한 로봇이 향하고 있는 방향각

        double velocity   : 스캔한 로봇의 속도


section 1 에서 본 내용을 토대로 이벤트 객체가 가지고 있는 Heading 이라는 정보는 스캔된 적 로봇이 향하고 있는 각도를 나타낸다. (0 도를 기준으로 한 각이다.)


그런데 Bearing 이라는 상대각도 가 등장하는데 이것은 내 로봇의 Heading 을 0 도로 했을때 스캔된 로봇의 방향각을 -180 도에서 +180 도로 나타낸 상대각도이다. 여기서 우리의 궁극적인 목표는 내 로봇을 기준으로 했을때 상대 로봇의 절대각도를 알아내는 것인데 이를 계산하기 위해서 Bearing 에 대한 이해가 필요하다.



3. bearing 에 대한 설명


"bear" 라는 단어는 "곰", "참다", "낳다, 출산하다" 라는 뜻의 의미 외에도 "<방향을>취하다, 향하다, 기울다" 라는 뜻도 있다는 것을 이번에 알게 됐다. -_-;; 영어에 무지한 나같은 사람으로서는 "Heading" 라는 단어와의 차이점을 느낄 수 없어서 처음에 이해하는데 어려움이 많았었다.


이건 말보다 그림이 이해하는데 훨씬 낫다.(말은 헷갈릴 뿐이다.)




 

사용자 삽입 이미지

Bearing 에서 사용하는 좌표는 파란색 으로 나타난 좌표인데 이 좌표의 0 도는 내 로봇의 정면이 향하고 있는 방향이다. 내 로봇을 기준으로 해서 스캔된 로봇의 좌표를 읽어오는 메소드가 바로 getBearing() 이다.


event.getBearing() 으로 읽어오는 값은


        -180 < Bearing < +180


의 범위를 갖는다. 0도에서 +180도는 내 로봇의 시계방향(오른편)에 위치한 로봇의 좌표이고 0도에서 -180도는 내 로봇의 반시계방향(왼편)에 위치한 로봇이다. 앞으로 이 두가지를 표현하는데에 +Be(Bearing of enemy) 와 -Be 를 사용하겠다.


Heading 처럼 0 도부터 360도가 아니라서 처음에 많이 헷갈릴 수 있다. Heading 을 구할때는 0 에서 360 의 범위를 갖는데 Bearing 에 대해서는 -180 에서 180으로 한 것은 쉽게 납득이 되지 않지만 꽤 유용한 점이 있다. 이것은 차차 알게 될 것이다.


위 그림에서 보이듯이 Bearing 에는 음수값과 양수값이 존재한다.(+Be, -Be). 적 로봇이 내 Bearing 좌표를 기준으로 나의 오른쪽(시계방향으로 최단거리)에 있을때 Bearing = +Be 가 되고 나의 왼쪽(반시계방향으로 최단거리)에 있을때는 Bearing = -Be 가 된다.


이제 내 로봇이 시계 방향에 있는 오른쪽 로봇을 향하고 싶다면 현재 상태에서 오른쪽으로 Be 만큼 틀어줘야 한다. 오른쪽으로 +Be 만큼 틀어준다는 것은


        turnRight(+Be);


를 의미한다.


그러면 내 로봇을 LeftRobot 쪽으로 틀어주고 싶다면 왼쪽으로 -Be 만큼 틀어줘야 한다.


        turnLeft(-Be)


그런데 왼쪽으로 -Be 만큼 틀어주는 것은 오른쪽으로 +Be 만큼 틀어주는 것과 같다. 결국 오른쪽으로 +Be 만큼 틀어주는 것이나 왼쪽으로 -Be 만큼 틀어주는 것 모두


        turnRight(Bearing)


으로 표현할 수 있다. 따라서 우리는 ScannedRobotEvent 를 전달받았을 때 이벤트 객체로부터 적 로보트의 Bearing 각도를 얻을 수 있고 [ event.getBearing() ] 단순히 이 각도만큼 오른쪽 시계방향으로 틀어주면 Bearing 의 +,- 에 상관없이 상대 로보트를 정면으로 바라볼 수 있다.




4. 포신을 상대 로봇으로 향하기


위에서는 Bearing 을 이용해서 내 로봇이 상대 로봇을 정면으로 바라보도록 하는 방법을 설명했다. 그런데 포신을 상대 로봇에게 향하도록 하려면 위의 정보만으로는 부족하다. 위의 그림의 로봇은 포신과 로봇의 동체가 일직선상에 놓여있기 때문에 bearing 을 더하는 것만으로 포신을 상대 로봇으로 향하게 할 수 있지만 포신이 항상 로봇의 동체와 같은 곳을 바라보지는 않는다.


아래의 그림 3에서는 로봇의 정면과 포신이 서로 다른 방향을 하고 있다. 위에서 상대 로봇의 Bearing 각도는 구했지만 포신을 상대 로봇으로 돌려서 사격을 하려면 또다른 각도를 구해야 하는데 이 각도가 바로 포신의 각도인 GunBearing 이다.


GunBearing 은 위에서 살펴본 Bearing 과 같은 방식으로 설명될 수 있다. 내 로봇의 정면으로부터 포신이 좌측에 있으면 -Bg, 우측에 있으면 +Bg 로 표현한다. 아래 그림에 나와 있듯이 포신을 상대 로봇에게 향하게 하려면 Bearing 만큼 포신을 오른쪽으로 회전시키고 다시 왼쪽으로 GunBearing 만큼 돌려주어야 한다.


사용자 삽입 이미지

이를 간단하게 표현하면 다음과 같다.


        turnGunRight( Bearing - GunBearing )


이렇게 하면 이제 포탄을 상대 로봇에게 발사할 준비가 된 것이다.

반응형
http://www-128.ibm.com/developerworks/kr/robocode/
사용자 삽입 이미지


로보코드 강좌 자료입니다.

좀 더 자료가 필요하신 분은 아래 링크를 클릭하여주세요.


ROBOCODE:

http://www-128.ibm.com/developerworks/kr/robocode/


developerworks:

http://ibm.com/developerworks/kr

+ Recent posts