목차
1. 로보코드란 무엇인가
2. 로보코드의 특징
3. 로봇의 구조
4. 로봇만들기
(1) 로보코드 설치방법
(2) 로봇 작성 방법
(3) 로봇 대전 방법
5. 샘플소스코드 분석
6. 로보코드 중요 Method 분석
7. 적 로봇의 좌표 구하기
(1) bearing과 heading의 차이점
(2) 간단한 삼각함수 공식
(3) 적 로봇의 좌표 구하기
8. 레이더로부터 적의 위치를 알아내기
(1) 기본적인 방향각 설명
(2) ScannedRobotEvent
(3) bearing에 대한 설명
(4) 포선을 상대 로봇으로 향하기
9. My robot "JJ"
2. 로보코드의 특징
3. 로봇의 구조
4. 로봇만들기
(1) 로보코드 설치방법
(2) 로봇 작성 방법
(3) 로봇 대전 방법
5. 샘플소스코드 분석
6. 로보코드 중요 Method 분석
7. 적 로봇의 좌표 구하기
(1) bearing과 heading의 차이점
(2) 간단한 삼각함수 공식
(3) 적 로봇의 좌표 구하기
8. 레이더로부터 적의 위치를 알아내기
(1) 기본적인 방향각 설명
(2) ScannedRobotEvent
(3) bearing에 대한 설명
(4) 포선을 상대 로봇으로 향하기
9. My robot "JJ"
본문내용
.getBearing() ] 단순히 이 각도만큼 오른쪽 시계방향으로 틀어주면 Bearing 의 +,- 에 상관없이 상대 로보트를 정면으로 바라볼 수 있다.
4) 포신을 상대 로봇으로 향하기
위에서는 Bearing 을 이용해서 내 로봇이 상대 로봇을 정면으로 바라보도록 하는 방법을 설명했다. 그런데 포신을 상대 로봇에게 향하도록 하려면 위의 정보만으로는 부족하다. 위의 그림의 로봇은 포신과 로봇의 동체가 일직선상에 놓여있기 때문에bearing 을 더하는 것만으로포신을 상대 로봇으로 향하게 할 수 있지만 포신이 항상 로봇의 동체와 같은 곳을 바라보지는 않는다. 아래의 그림 3에서는 로봇의 정면과 포신이 서로 다른 방향을 하고 있다. 위에서 상대 로봇의 Bearing 각도는 구했지만 포신을 상대 로봇으로 돌려서 사격을 하려면 또다른 각도를 구해야 하는데 이 각도가 바로 포신의 각도인 GunBearing 이다.
GunBearing 은 위에서 살펴본 Bearing 과 같은 방식으로 설명될 수 있다. 내 로봇의 정면으로부터 포신이 좌측에 있으면 -Bg, 우측에 있으면 +Bg 로 표현한다. 아래 그림에 나와 있듯이 포신을 상대 로봇에게 향하게 하려면 Bearing 만큼 포신을오른쪽으로회전시키고 다시왼쪽으로 GunBearing 만큼돌려주어야 한다.
이를 간단하게 표현하면 다음과 같다.
turnGunRight( Bearing - GunBearing )
이렇게 하면 이제 포탄을 상대 로봇에게 발사할 준비가 된 것이다. 문제는 로보코드에서 제공되는 Robot 및 AdvancedRobot클래스에서 GunBearing 을 구할 수 있는 메소드를 제공해주고 있지 않다는 것이다. 결국 이를 구현하는 것은 사용자 몫으로 남겨진 셈이다.
9. My robot "JJ"
package jj;
import robocode.*;
import java.awt.Color;
/**
* JJ - a robot by (your name here)
*/
public class JJ extends AdvancedRobot
{
/**
* run: JJ's default behavior
*/
public void run() {
setColors(Color.red, Color.red, Color.red);
while (true) {
setTurnRight(10000);
setTurnGunRight(180);
ahead(10000);
}
}
/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
double enemyBearing = this.getHeading() + e.getBearing();
setTurnLeft(enemyBearing);
//double enemyX = getX() + e.getDistance() * Math.sin(enemyBearing);
//double enemyY = getY() + e.getDistance() * Math.cos(enemyBearing);
//scan();
if (e.getEnergy() > 70)
{
if (e.getDistance() < 100)
setFire(3);
else if (e.getDistance() >= 100 && e.getDistance() < 400)
setFire(2);
else
setFire(1);
}
else if (e.getEnergy() > 50 && e.getEnergy() <=70)
{
if (e.getDistance() < 100)
setFire(3);
else if (e.getDistance() >= 100 && e.getDistance() < 400)
setFire(2);
else
setFire(1);
}
else if (e.getEnergy() > 30 && e.getEnergy() <= 50)
{
if (e.getDistance() < 100)
setFire(2);
else if (e.getDistance() >= 100 && e.getDistance() < 400)
setFire(1.5);
else
setFire(1);
}
else if (e.getEnergy() > 20 && e.getEnergy() <= 30)
setFire(1);
else
setFire(2);
ahead(40);
scan();
}
/**
* onHitRobot: when your robot collides with another robot
*/
public void onHitRobot(HitRobotEvent e) {
setTurnGunRight(0);
setTurnRight(0);
if (e.getBearing() > -90 && e.getBearing() <= 90)
setBack(100);
else
setAhead(100);
}
/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
if (e.getBearing() > 0 && e.getBearing() < 180)
{
turnRight(e.getBearing() + 10);
setAhead(50);
}
else if (e.getBearing() > -180 && e.getBearing() < 0)
{
turnLeft(360 - e.getBearing());
setAhead(50);
}
}
/*public void AvoidWall() {
if(getX() < 50 || getY() < 50 || getX() > getBattleFieldWidth() - 50 || getY() < getBattleFieldHeight() - 50)
{
direction *= -1;
//Direction();
if(direction == 1)
setTurnRight(1000);
else if(direction == -1)
setTurnLeft(1000);
ahead(1000);
scan();
}
}*/
}
4) 포신을 상대 로봇으로 향하기
위에서는 Bearing 을 이용해서 내 로봇이 상대 로봇을 정면으로 바라보도록 하는 방법을 설명했다. 그런데 포신을 상대 로봇에게 향하도록 하려면 위의 정보만으로는 부족하다. 위의 그림의 로봇은 포신과 로봇의 동체가 일직선상에 놓여있기 때문에bearing 을 더하는 것만으로포신을 상대 로봇으로 향하게 할 수 있지만 포신이 항상 로봇의 동체와 같은 곳을 바라보지는 않는다. 아래의 그림 3에서는 로봇의 정면과 포신이 서로 다른 방향을 하고 있다. 위에서 상대 로봇의 Bearing 각도는 구했지만 포신을 상대 로봇으로 돌려서 사격을 하려면 또다른 각도를 구해야 하는데 이 각도가 바로 포신의 각도인 GunBearing 이다.
GunBearing 은 위에서 살펴본 Bearing 과 같은 방식으로 설명될 수 있다. 내 로봇의 정면으로부터 포신이 좌측에 있으면 -Bg, 우측에 있으면 +Bg 로 표현한다. 아래 그림에 나와 있듯이 포신을 상대 로봇에게 향하게 하려면 Bearing 만큼 포신을오른쪽으로회전시키고 다시왼쪽으로 GunBearing 만큼돌려주어야 한다.
이를 간단하게 표현하면 다음과 같다.
turnGunRight( Bearing - GunBearing )
이렇게 하면 이제 포탄을 상대 로봇에게 발사할 준비가 된 것이다. 문제는 로보코드에서 제공되는 Robot 및 AdvancedRobot클래스에서 GunBearing 을 구할 수 있는 메소드를 제공해주고 있지 않다는 것이다. 결국 이를 구현하는 것은 사용자 몫으로 남겨진 셈이다.
9. My robot "JJ"
package jj;
import robocode.*;
import java.awt.Color;
/**
* JJ - a robot by (your name here)
*/
public class JJ extends AdvancedRobot
{
/**
* run: JJ's default behavior
*/
public void run() {
setColors(Color.red, Color.red, Color.red);
while (true) {
setTurnRight(10000);
setTurnGunRight(180);
ahead(10000);
}
}
/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
double enemyBearing = this.getHeading() + e.getBearing();
setTurnLeft(enemyBearing);
//double enemyX = getX() + e.getDistance() * Math.sin(enemyBearing);
//double enemyY = getY() + e.getDistance() * Math.cos(enemyBearing);
//scan();
if (e.getEnergy() > 70)
{
if (e.getDistance() < 100)
setFire(3);
else if (e.getDistance() >= 100 && e.getDistance() < 400)
setFire(2);
else
setFire(1);
}
else if (e.getEnergy() > 50 && e.getEnergy() <=70)
{
if (e.getDistance() < 100)
setFire(3);
else if (e.getDistance() >= 100 && e.getDistance() < 400)
setFire(2);
else
setFire(1);
}
else if (e.getEnergy() > 30 && e.getEnergy() <= 50)
{
if (e.getDistance() < 100)
setFire(2);
else if (e.getDistance() >= 100 && e.getDistance() < 400)
setFire(1.5);
else
setFire(1);
}
else if (e.getEnergy() > 20 && e.getEnergy() <= 30)
setFire(1);
else
setFire(2);
ahead(40);
scan();
}
/**
* onHitRobot: when your robot collides with another robot
*/
public void onHitRobot(HitRobotEvent e) {
setTurnGunRight(0);
setTurnRight(0);
if (e.getBearing() > -90 && e.getBearing() <= 90)
setBack(100);
else
setAhead(100);
}
/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
if (e.getBearing() > 0 && e.getBearing() < 180)
{
turnRight(e.getBearing() + 10);
setAhead(50);
}
else if (e.getBearing() > -180 && e.getBearing() < 0)
{
turnLeft(360 - e.getBearing());
setAhead(50);
}
}
/*public void AvoidWall() {
if(getX() < 50 || getY() < 50 || getX() > getBattleFieldWidth() - 50 || getY() < getBattleFieldHeight() - 50)
{
direction *= -1;
//Direction();
if(direction == 1)
setTurnRight(1000);
else if(direction == -1)
setTurnLeft(1000);
ahead(1000);
scan();
}
}*/
}
추천자료
최근 통용되고 있는 설문지 샘플 통계분석
LPC Analysis 기법에 대하여
자바를 이용한 다항식 계산 프로그램
초음파 센서를 이용한 모터제어
system call 관련 소스 분석
히스토그램&평활화 소스 및 실행결과 (논문형식)
수치해석 비선형방정식의 해법(Bisection, Newton's, secant Method )
오실로스코프 사용법(예비 결과)
Matlab 설계 프로젝트 - ` A / D Conversion `
의사소통론
엔터테인먼트와 산업의 이해와 제2의 한류 성공전략 최종(아이돌가수중심)
지카소 [Zicasso 경영전략] Zicasso 기업분석, Zicasso 특징, Zicasso 마케팅 전략, Zicasso ...
[생활속의계약과협상] 국내외 협상사례 분석 - 해외 B2B 성공과 실패사례, 해외 G2G 실패과 ...