제 12 주 로보코드 (robocode)

34
객객객객객객객객객 객객객객객 1/34 객 12 객 객객객객 (Robocode) 제 12 제 제제 제제 제제제제제 제제 제 제제 제제 제제제 제제제제 제제제 제제 제제제제 제제 제 제제제제제 제제제 제제 제제제제 제제제제 제제 제제

Upload: vinaya

Post on 21-Jan-2016

179 views

Category:

Documents


0 download

DESCRIPTION

제 12 주 로보코드 (Robocode). 제 12 주 강의 목표 로보코드를 통해 그 동안 배운 것들을 복습하는 기회를 가짐 로보코드 설계 및 프로그래밍 방법을 배움 로보코드 토너먼트 경기 진행. 로보코드 (Robocode) 란 ?. IBM 의 인터넷 부문인 Advanced Technology 의 소프트웨어 엔지니어인 Mathew Nelson 의 창작품 스크린 상에서 전투하는 자바 객체인 자바 로봇을 만들어 개발자들이 자바를 배울 수 있도록 하는 프로그래밍 게임 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 1/34

제 12 주 로보코드(Robocode)

제 12 주 강의 목표•로보코드를 통해 그 동안 배운 것들을 복습하는 기회를 가짐•로보코드 설계 및 프로그래밍 방법을 배움•로보코드 토너먼트 경기 진행

Page 2: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 2/34

로보코드 (Robocode) 란 ?

1. IBM 의 인터넷 부문인 Advanced Technology 의 소프트웨어 엔지니어인 Mathew Nelson 의 창작품

2. 스크린 상에서 전투하는 자바 객체인 자바 로봇을 만들어 개발자들이 자바를 배울 수 있도록 하는 프로그래밍 게임

3. 로봇 전쟁 시뮬레이터로 참가자들은 로봇을 만들어 전투에 내보내고 이를 다른 개발자가 만든 로봇들과 겨뤄 득점율이 높은 로봇이 승리

4. Eclipse, WebSphere, DB2, WebSphere Application Developer 를 사용하여 개발되었고 , Java 2 를 지원하는 모든 플랫폼에서 실행

Page 3: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 3/34

로보코드 (Robocode) 란 ?

데모 동영상 보기

Page 4: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 4/34

로보코드 설치하기1. 로보코드 실행 파일 robocode-setup.jar 을

다운로드 받는다 .– http://www-128.ibm.com/developerworks/kr/robocode/robocode-

setup.jar

2. DOS 창을 열어 다운로드 파일이 있는 디렉토리로 이동한 후 , 로보코드를 인스톨한다 . 바탕화면에 로보코드 실행을 위한 바로가기 생성- java –jar robocode-setup.jar

3. 샘플 로보코드를 테스트 해보면서 로보코드의 동작 원리를 익힌다 .

Page 5: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 5/34

로보코드 시스템의 구성 요소1. 전투장

– 로봇간의 전투가 이루어지는 곳– 주 시뮬레이션 엔진이 들어 있으며 , 새로운 혹은 기존의 전투를

생성하고 저장할 수 있음– 제어 장치를 사용해 전쟁을 일시 중지 , 재개 , 종료 시킬 수 있고

개별 로봇을 부수거나 있는 로봇의 통계를 얻을 수 있음– 로봇 편집기를 활성화시킬 수 있음

2. 로봇 편집기– 로봇을 만드는 자바 소스 파일을 편집하기 위한 커스터마이즈된 텍스트

편집기

Page 6: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 6/34

로보코드 시스템의 구성 요소

Page 7: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 7/34

기본 로봇 만들기 - 시작1. 메인 로보코드 스크린에서 Robot 메뉴를 클릭하고 Editor 를

선택2. 에디터 창이 나타나면 File 메뉴를 클릭하여 New Robot 을 선택3. 로봇의 이름을 입력 – 클래스명4. 본인의 학번이름 이니셜을 입력 – 패키지명

Page 8: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 8/34

기본 로봇 만들기 - 코드변경package man;import robocode.*;public class MyFirstRobot extends Robot{ public void run() {

while (true) {ahead(100);turnGunRight(360);back(100);turnGunRight(360);

}}public void onScannedRobot(ScannedRobotEvent e) {

fire(1); }

}

이 부분을 변경하여 자신만의 로봇을 생성다른 부분은 모두 자동 생성됨

Page 9: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 9/34

로봇의 구성• Gun ( 회전 총 ) + Radar ( 회전 레이더 ) + Vehicle ( 차량 )• 3 가지 구성 요소는 모두 독립적으로 회전할 수 있음• 기본 구성은 차량의 이동 방향으로 정렬되어 있음

Page 10: 제 12 주 로보코드 (Robocode)

로보코드 – 기본 정보• 시간 단위 : tick (= frame = turn)

– 30 FPS ( 초당 30 Frame)• 거리 단위 : pixel

– 시작 위치 (0, 0) : 좌측 하단• 로봇의 움직임

– 가속 a = 1 pixel/tick– 감속 a = 2 pixel/tick– 속도 v = a * t (Max 8)– 거리 d = v * t

• 로봇의 최대 회전율 = 10 - 0.75 * abs(v) degrees/tick

• 총의 최대 회전율 = 20 degrees/tick

• 레이더의 최대 회전율 = 45 degrees/tick

객체지향프로그래밍 강원대학교 10/34

Page 11: 제 12 주 로보코드 (Robocode)

로보코드 – 기본 정보• 총알

– firepower : 0.1~3– 데미지 = 4 * firepower– firepower 가 1 이상이면 2 * (firepower -1) 추가

• 총알 발사시 로봇의 에너지 소모 = firepower• 총알 속도 = 20 - 3 * firepower

로봇의 움직이는 방향이나 속도는 총알의 속도에 영향을 주지 않는다 .

• 총의 가열 (gunHeat) = 1 + firepower / 5• 명중시 돌려받는 에너지 = 3 * firepower• 상대와 충돌시 = 둘 다 -0.6• 내가 충돌시 = + 1.2• 벽과 충돌시 = abs(v) * 0.5 - 1

– AdvancedRobot 이상

객체지향프로그래밍 강원대학교 11/34

Page 12: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 12/34

로봇 명령어• 로봇에 대한 명령어 세트는 모두 Robocode API 의

javadoc 에 문서화되어 있음

Page 13: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 13/34

로봇 , 총 , 레이더 움직이기• turnRight(double degree), turnLeft(double degree)

– 지정된 각도로 로봇을 돌린다 .

• ahead(double distance), back(double distance)– 지정된 픽셀 거리로 로봇을 이동시킨다 . 이 두 메소드들은

로봇이 벽이나 다른 로봇에 부딪혔을 때 완료된다 .

• turnGunRight(double degree), turnGunLeft(double degree)– 차량의 방향과 상관 없이 총의 방향을 돌린다 .

• turnRadarRight(double degree), turnRadarLeft(double degree)– 총과 차량의 방향에 상관 없이 총 위의 레이더를 돌린다 .

Page 14: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 14/34

로봇 , 총 , 레이더 움직이기• setAdjustGunForRobotTurn(boolean flag):

– 플래그가 참으로 설정되면 차량이 움직이는 동안 총도 동일한 방향으로 움직인다 .

• setAdjustRadarForRobotTurn(boolean flag)– 플래그가 참으로 설정되면 차량과 총이 움직이는 동안 레이더도

동일한 방향으로 움직인다 .

• setAdjustRadarForGunTurn(boolean flag)– 플래그가 참으로 설정되면 총이 움직이는 동안 레이더도 동일한

방향으로 움직인다 . 또한 setAdjustRadarForRobotTurn(true) 가 호출된 것처럼 행동한다 .

Page 15: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 15/34

로봇에 대한 정보 얻기• getX(), getY()

– 로봇의 현재 좌표를 보여 준다 .

• getHeading(), getGunHeading(), getRadarHeading()– 차량 , 총 , 레이더의 현재 방향을 각도로 알려준다 .

• getBattleFieldWidth(), getBattleFieldHeight()– 현재 승부가 벌어지는 전투장의 크기를 알려준다 .

Page 16: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 16/34

발포 및 피해 제어• 각 로봇은 기본적인 “ 에너지 레벨” 을 가지고 출발하며 ,

에너지 레벨이 0 으로 떨어지면 파괴된 것으로 간주된다 .• 발포할 때 로봇은 3 단계의 에너지 레벨이 부여된 총알을

사용할 수 있으며 , 총알에 더 많은 에너지가 장착될수록 상대 로봇에게 더 많은 해를 끼칠 수 있다 .

• fire(double power)– 지정된 에너지 레벨의 총알을 발사한다 .

Page 17: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 17/34

이벤트• 로봇이 움직이거나 방향을 돌릴 때마다 레이더도 항상 구동이

되고 , 로봇이 사정 거리 안에 있는 로봇을 추적하면 이벤트가 유발된다 .

• 기본 이벤트 핸들러를 오버라이드하여 자신의 액션을 구현할 수 있다 .

• ScannedRobotEvent– onScannedRobot() 메소드를 오버라이드하여

ScannedRobotEvent 를 처리한다– 레이더가 로봇을 추적했을 때 호출된다 .

Page 18: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 18/34

이벤트• HitByBulletEvent

– onHitByBullet() 메소드를 오버라이드하여 HitByBulletEvent를 처리한다 .

– 로봇이 총알을 맞았을 때 호출된다 .

• HitWallEvent – onHitWall() 메소드를 오버라이드하여 HitWallEvent 를

처리한다 .– 자신의 로봇이 벽을 쏘았을 때 호출된다 .

Page 19: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 19/34

자신만의 이벤트public class Target extends AdvancedRobot {

int trigger;

public void run() {// 남은 에너지 레벨이 80 일 때 움직이게 하기 위한 초기값 설정trigger = 80;// "trigger hit“라는 이름의 이벤트 추가addCustomEvent(

new Condition("triggerhit") { public boolean test() {

return (getEnergy() <= trigger);};

});

}

Page 20: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 20/34

자신만의 이벤트public void onCustomEvent(CustomEvent e){

// "triggerhit“라는 이벤트가 발생했는지 검사if (e.getCondition().getName().equals("triggerhit")){

// 임계 에너지 레벨을 20 떨어뜨림trigger -= 20;out.println("Ouch, down to " + (int)(getEnergy()

+.5) + " energy.");// 왼쪽으로 65 도 회전turnLeft(65);// 앞으로 100 이동ahead(100);

}}

}

Page 21: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 21/34

기본 로봇 만들기 - 코드변경package man;import robocode.*;public class MyFirstRobot extends Robot{

// 클래스 멤버 변수를 선언하고 그 값을 설정하는 코드를 이곳에 둔다 ....

public void run() {// 로봇 인스턴스 당 1 번만 실행될 코드를 이곳에 둔다 .// 반복적인 액션을 시작하기 전에 로봇을 사전 결정된 상태로 만드는 데 종종 사용된다 .

…while(true) {

// 로봇이 참여할 반복 액션 나타내는 코드를 이곳에 둔다 .…

}}// 오버라이드하고 싶은 이벤트 핸들러를 이곳에 둔다 ....

public void onScannedRobot(ScannedRobotEvent e) {fire(1);

}}

Page 22: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 22/34

기본 로봇 만들기 1package man;import robocode.*;public class MyFirstRobot extends Robot{ public void run() {

while (true) {ahead(100);turnGunRight(360);back(100);turnGunRight(360);

}}public void onScannedRobot(ScannedRobotEvent e) {

fire(1); }

}

(1)차량을 앞쪽으로 100 만큼 이동(2)총을 오른쪽으로 360 도 회전(3)차량을 뒤쪽으로 100 만큼 이동(4)총을 오른쪽으로 360 도 회전

레이더가 로봇을 추적했으면 에너지 레벨 1 인 총알을 발사

Page 23: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 23/34

기본 로봇 만들기 2package man;import robocode.*;public class MyFirstRobot extends Robot{ public void run() {

turnLeft(getHeading());while (true) {

ahead(1000);turnRight (90);

}}public void onScannedRobot(ScannedRobotEvent e) {

fire(1); }public void onHitByBullet(HitByBulletEvent e) {

turnLeft(180); }

}

(1)차량이 0 도를 향하도록 회전(2)차량을 앞쪽으로 1000 만큼 이동(3)차량을 오른쪽으로 90 도 회전

레이더가 로봇을 추적했으면 에너지 레벨 1 인 총알을 발사

총에 맞았을 경우에차량을 왼쪽으로 180 도 회전

시계 방향과 반시계 방향을 교대로 하면서벽을 따라가면서 공격

Page 24: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 24/34

Sample Code - Wall.javapublic class Walls extends Robot {

boolean peek; // Don't turn if there's a robot theredouble moveAmount; // How much to move

public void run() {// 전투장의 가로 , 세로 크기 중 큰 값을 저장moveAmount =

Math.max(getBattleFieldWidth(),getBattleFieldHeight());peek = false;

// 차량의 현재 방향을 90 도로 나눈 나머지를 이용하여// 벽을 향하도록 왼쪽으로 회전turnLeft(getHeading() % 90);ahead(moveAmount);

// 총을 90 도 회전한 후 , 다시 차량을 90 도 회전하여 총이 전투장을 향하도록 함

peek = true;turnGunRight(90);turnRight(90);

Page 25: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 25/34

Sample Code - Wall.javawhile (true){

peek = true;// 벽쪽으로 이동ahead(moveAmount);

peek = false;// 오른쪽 벽으로 회전turnRight(90);

}}

public void onHitRobot(HitRobotEvent e) {// 적이 앞쪽에 있으면 뒤쪽으로 물러남if (e.getBearing() > -90 && e.getBearing() < 90)

back(100);// 그렇지 않으면 뒤쪽에 있는 것이므로 앞쪽으로 이동else

ahead(100);}

Page 26: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 26/34

Sample Code – Wall.javapublic void onScannedRobot(ScannedRobotEvent e) {

fire(2);// 벽 쪽으로 이동하기 전에 적이 있는지 감시// 벽에 적이 있으면 벽 쪽으로 이동하지 않음if (peek) scan();

}}

Page 27: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 27/34

로봇 컴파일 및 테스트하기• 로봇 컴파일

– 로봇 편집기의 Compiler 메뉴의 Compile 을 이용하여 로봇 클래스 생성

• 전투 시작– 전투장의 Battle 메뉴의 New 를 이용하여 전투를

생성– 전투에 참가할 로봇 , 라운드 수 , 전투장의 크기 등을

선택한 후 , StartBattle 을 클릭하여 전투 시작

Page 28: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 28/34

로봇 컴파일 및 테스트하기

Page 29: 제 12 주 로보코드 (Robocode)

로봇코드 엔진 아키텍처• 로보코드 뒤에는 고성능 ( 사실적인 스피드로 전투를 렌터링하기

위해 ), 유연성 ( 어려움 없이 복잡한 로봇 로직 작성을 가능케 하는 )을 가진 정교한 시뮬레이션 엔진이 있다 .

객체지향프로그래밍 강원대학교 29/34

Page 30: 제 12 주 로보코드 (Robocode)

무적 로봇 만들기 Tip!• 아래 URL 에서 제공되는 로보코드 기본 알고리즘을 적용

- developerWorks : Secrets from the Robocode masters http://www.ibm.com/developerworks/java/library/j-

robotips/

- Wikipedia Robocode http://en.wikipedia.org/wiki/Robocode

- http://blog.naver.com/luna0805/40037817009

객체지향프로그래밍 강원대학교 30/34

Page 31: 제 12 주 로보코드 (Robocode)

로보코드 - 점수항목

점 수 항 목

Total Score

점 수 내 역

점수의 총합 . 순위의 기준

Survival Score 다른 로봇이 죽을 때 마다 살아남은 로봇은 50 점 획득

Last Survival Bonus

최후까지 살아남은 로봇은 이전 로봇이 죽을 때 마다 보너스로 10 점씩 추가 획득 (ex : 전투에 참여한 로봇이 5개 일 경우 - 4 X 10 점 )

Bullet Damage 적에게 총알로 입힌 타격 Point 만큼 점수 획득

Bullet DamageBonus

총알로 적을 죽였을 때 그 동안 적 로봇에 입힌 타격Point 의 20% 를 추가 획득

Ram Damage 적 로봇을 육탄으로 공격했을 때 2 점 획득

Ram Damage Bonus

육탄공격으로 적을 죽였을 때 그 동안 적 로봇에 입힌 타격 Point 의 30% 를 추가로 획득

객체지향프로그래밍 강원대학교 31/34

Page 32: 제 12 주 로보코드 (Robocode)

이번 주 실습• 3 인 1 조로 조를 편성하고 영어 소문자 형태의 팀명을

정합니다 .– 예 : bestbot ( 영문 소문자로 정하세요 .)

• 조교는 사다리 타기를 통해 각 팀에게 번호를 부여하고 , 오름차순으로 토너먼트 대진표를 작성합니다 .

• ‘OOP 학번’을 로봇 클래스명으로 하고 팀명을 패키지명으로 하여 각자 자신의 로봇을 작성합니다 .– 예 : OOP12345

객체지향프로그래밍 강원대학교 32/34

Page 33: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 33/34

이번 주 실습

• 팀의 리더는 팀원들이 작성한 로봇 소스와 클래스를 팀명 폴더에 모아서 조교에게 제출합니다 .– 예 : ‘C:\robocode\robots\bestbot\’ 에 팀원들이

작성한 로봇 소스와 클래스를 모아서 조교에게 제출

• 실습 시간에 완성을 못한 팀은 다음 강의시간 전까지 과제로 제출합니다 .

Page 34: 제 12 주 로보코드 (Robocode)

객체지향프로그래밍 강원대학교 34/34

다음 주 실습

• 조교는 대진표에 따라 3 회씩 전투를 진행하고 , 매 전투가 끝나면 팀별로 점수를 합산한 후 , 3 회 평균을 계산합니다 .

• 매 경기마다 최대 2분이 주어지며 , 2 분이 지나면 조교가 경기를 중단시키고 그 때까지의 점수를 계산합니다 .

• 평균 점수가 높은 팀이 우승팀으로 결정되며 , 최종 우승팀에게는 소정의 상품이 수여될 예정입니다 . 최선을 다해 주세요 ~

• 다음 주 강의에 대한 실습은 과제로 대체합니다 .