1・マイロボットの作成
1.1 マイロボットの作成手順
(1)Robocode のウインドウのメニューバーの[Robot]の[Editor]をクリックすると、
Robot Editor のウインドウが開きます。
(2)Robot Editor のウインドウの[File]の[New]の[Robot]をクリックします。
(3)[New Robot]というウインドウが開きますので、ロボットの名前を入力し、了解
を押します。使用できる文字は、英字、数字、アンダースコアのみで、先頭の文字
は英字の大文字を絶対に使いましょう! 例 Robotname
(4)次に、[Please enter your initials]という説明の画面が出てきます。これは、フォ
ルダ(パッケージ)の名前を聞いてくるので、ここでは自分のイニシャルを入力し
ます。みなさんのデータを集めるのでフォルダ名が、同じにならないようお願いし
ます!
例 中部太郎⇒ct
(5)これで、初期設定は終了です。
(6)初期設定が終わるとプログラムのウインドウが開きますが、この説明は後でする
ので、今は省きます。
1.2 コンパイルの手順
コンパイルとは…そのままでは実行できないプログラムを、実行できるプログラムに変
換することをいいます。
(1)Robot Editor のウインドウのメニューバーの[Compiler]の[Compile]をクリックし
ます。
(2)Modified file のウインドウが表示されるので、[はい]をクリックします。
(3)次に Create Directory の画面が表示されるので、[はい]をクリックします。
(4)次に、下のようなウインドウがでてくるので、robocode の中の robots の中に保存
します。
自分のイニシャルのフォルダ(パッケージ)
ロボットの名前
(5)下のようなウインドウが表示されたらコンパイル成功です。
1.3 ロボットを戦場に置く
(1)Robocode のウインドウのメニューバーにある[Battle]の[New]をクリックする。
(2)次に下のようなウインドウが表示されます。
① フォルダ(パッケージ)の選択
② 選択したフォルダ(パッケージ)内のロボットたち
③ [Add →]は選択したロボットを参戦させる
[Add All→]はフォルダ(パッケージ)内のすべてのロボットを参戦させる
④ ラウンドの回数
⑤ [← Remove]は選択した、参戦しているロボットを除外する
[← Remove All]は参戦しているすべてのロボットを除外する
⑥ 参戦するロボットたち
(3)参戦するロボットを決めて、下のほうにある[Start Battle]をクリックして戦闘を
開始します。
(4)戦闘を終了したいときには、Robocode のウインドウの左下にある[Stop]を
クリックすれば、終了します。
1.4 保存したロボットのデータを開く
(1)Robot Editor のウインドウを開きます。
(2)メニューバーの[File]の[Open]をクリックします。
(3)下のようなウインドウが開きます
自分のイニシャルのフォルダ
(4)自分のイニシャルのフォルダ(パッケージ)を選択して開くをクリックします。
ロボットの名前
(5)ロボットの名前のファイルを選択して開くをクリックします。
2.ロボコード入門(恵那研修特別編)
2.1 プログラムとアルゴリズム
ロボコードを動かす命令の事を プログラム といい、どう動かすか?という考え方を
アルゴリズム といいます。みなさんは、これからロボットのアルゴリズムを考え、それ
をプログラムにするということをやってもらいます。
2.2 ロボコードの記述方法
ロボコードでは、文(命令)の終わりは必ず;
(セミコロン)を記入します。
ahead(100);
//これは、よく忘れるので、注意しましょう!
また、コメント文というものがあり、プログラムとは関係ないプログラムの説明など
を書き込むことができます。//もしくは、/* */で囲むことでコメントを記述します。
ahead(100);
//コメント文です。
back(100);
/*これもコメント文です。*/
/*
*こういうのも、コメント文です。
*/
2.3 加減乗除と剰余
ロボコードでは、使用できるデータの型は、実数(小数点のついた数字)です。足し
算は「+」
、引き算は「-」
、掛け算は「*(アスタリスク)」
、割り算は「/(スラッシュ)」
、
余り「%(パーセント)
」と記述します。
30+40;
//足し算
20.5-30.2 ;
//引き算、小数点も計算できます。
10.0*20.25;
//掛け算、×ではなく、*を使います。
103.2/24.2;
//割り算、÷ではなく、/を使います。
103%24;
//割り算の余りを計算します。
2.4 変数
プログラムを作る上でとても大事な機能に、変数というものがあります。変数というの
は、数を保存する入れ物と思ってください。まず、初めに変数の入れ物を作ります。この
ことを、変数の宣言 といいます。 double kakudo; という感じに書きます。double とい
うのが、入れ物の型が実数変数型であると宣言しています。kakudo というのが、変数名と
いうもので、入れ物の名前です。変数名は自分の好きな名前にしてOKです(ここでは
kakudo とします)。これで、kakudo という変数が使えるようになりました!
次に、kakudo に数を入れてみます。kakudo = 180.0; という感じに書きます。ここで注
意してほしいのが、
「=」を使っていますが、右の 180.0 の値が、左の kakudo に値を代入す
る命令です。決して、180.0 と kakudo が等価という意味ではないので注意してください。
kakudo の入れ物に 180.0
180.0
という値が入るイメージ
double kakudo;
kakudo = 180.0;
kakudo
また、変数を宣言したら、必ず初期化をしてください。何も入っていないから「0」なん
じゃないの?と思うかも知れませんが、そうではありません。何が入っているかわかりま
せん。100 かも知れません、-32262 だったり、もっと大きい数値かもしれません。ですか
ら、初期化しないで、kakudo = kakudo + 1; なんて絶対に実行しないでください。文法的
には間違いではありませんので、コンパイルは通過しますが、いざ実行すると、わけもわ
からない処理をしてしまうのです。こうなってしまうと、ソースコードとにらめっこしな
いといけない羽目になりますので、変数の初期化は必ず行ってください。
<補足> 代入の応用で、次のようなこともできます。
double suji;
// suji を宣言
suji = 300;
// 初期化~
suji = suji + 1;
/* suji には 300 が入っているので、suji + 1 は、
300 + 1 で、答えは 301 になります。
それが、suji に入り、suji が 301 になります。
*/
2.5 制御文(if文)
if文を使うことで、流れを二つに分ける「条件分岐」を行うことができます。次のよ
うな感じに書きます
フローチャート
if (論理式) {
論理式が正しいとき、この部分が実行される;
} else {
論理式が正しくないとき、この部分が実行される;
}
条件
偽
正
正しい時
間違いの時
の処理
の処理
表.論理式の記号とその意味
記号
記述例
意味
==
if (a == b)
a の値と b の値が等しいとき
!=
if (a != b)
a の値と b の値が等しくないとき
>
if (a > b)
a の値が b の値より大きいとき
<
if (a < b)
a の値が b の値より小さいとき
>=
if (a >= b)
a の値が b の値、以上のとき
<=
if (a <= b)
a の値が b の値、以下のとき
これだけでは、わかりにくいので、例文を書きました。参考にしてください。
double kakudo;
// 実数型変数 kakudo を宣言。
kakudo = ...........;
// 何らかの方法で、kakudo を計算。
if (kakudo > 180.0) {
// kakudo が 180.0 より大きかったら
kakudo = kakudo – 360.0; // kakudo から 360 引いた値を、kakudo に代入
}
// else は省略
if (kakudo < -180.0) {
// kakudo が-180 より小さかったら
kakudo = kakud0 + 360.0; // kakudo から 360 足した値を、kakudo に代入
}
2.6 制御文(while文)
プログラムの流れを変える制御文その2です。while文は、プログラムの繰り返し
を行う命令です。論理式の条件が正しい間、「{}(括弧)」の中を永遠に繰り返します。
フローチャート
条件
while (論理式) {
論理式が正しい間、この部分が実行され続ける。
}
正しいの間
の処理
これだけでは、わかりにくいので、例文を書きました。参考にしてください。
double i;
// 実数型変数 i を宣言。
i = 0;
// 初期化は忘れずに!
while (i < 10) {
// i が 10 になるまで繰り返す。
ahead(100);
// 直進する。100 という数は距離を表す。
back(100);
// 後退する。
i = i + 1;
// i に 1 を足して、i に代入する。
}
このプログラムを簡単に説明すると、直進と後退を 10 回繰り返すプログラムです。
スタート
i に 0 を代入
i は 10
より小さい?
i = 1 のとき
i は 0 なので
正しいですね
i = 10 のとき
i は 10
より小さい?
i は 10
i は 1 なので
より小さい?
正しいですね
100 だけ前進
100 だけ前進
100 だけ後退
100 だけ後退
i + 1 を i に代入
i は 1 になる
i + 1 を i に代入
i は 10 なので
正しくない!
i は 2 になる
2.7 まとめ
最後に、今まで勉強してきたことをすべて使って、サンプルプログラムを作りました。
一度、このプログラムを打って、実行してみてください。そして、失敗を恐れず、改造し
ていってください。
サンプルプログラム
1
package ena;
2 import robocode;
3 //import java.awt.Color;
4
5 /*
6
*Sample – a robot by (your name here)
7 */
8
public class Sample extends Robot
9 {
10
/*
11
* run: Sample's default
dehavior
12
*/
13
public void run(){
14
// After trying out your robot, try uncommenting the import at the top,
15
// and the next line:
16
// setColors(Color.red,Color.blue,Color.green);
17
while(true){
18
// Replace the next 4 lines with any behavior you would like
19
ahead(100);
20
turnGunRight(360);
21
back(100);
22
turnGunRight(360);
23
24
}
}
25
26
/*
27
28
* onScannedRobot: What to do when you do see another robot
*/
次のページに続きます。
<サンプルプログラム続き>
29
public void onScannedRobot(ScannedRobotEvent e){
30
fire(1);
31
}
32
33
/*
34
*onHitByBullet: What to do when you're hit by a bullet
35
*/
36
public void onHitByBullet(HitByBulletEvent){
37
turnLeft(90 - e.getBering());
38
}
39 }
1.プログラムの保存について
プログラムを『保存する場所』について注意してほしいことがあります。プログラム
を保存した場所はプログラムの 1 行目に書かれています。1 行目の package のあとに書
かれている『ena』がこのサンプルプログラムを保存したフォルダとなります。
ちなみに、package 名は作成したロボットのプログラムを保存するフォルダ名と同じ
にする必要があります。
2.ロボットの名前について
保存名は自動的に『ロボットの名前』となります。これもプログラム中に書かれてい
て、8 行目の
public class Sample extends Robot の破線部分にあたります。ロボット
の名前は必ず大文字で始めるようにしてください。プログラムは『ロボット名.Java で
保存してください。
ロボット名はチーム内で重複しないようにしてください。逆に、先ほどの package 名
はチームで統一する必要があります。チーム対抗でバトルをする場合はロボットを同じ
フォルダに保存するということになります。
2.8 コンパイル&ロボットがうまく動かないときのチェックポイント!
1.文の最後に 「;(セミコロン)」がついていますか?
2.if の条件で「==」を「=」と書いてはいませんか?
3.
「 { 」の数と、「 } 」の数が同じですか?
4.変数名を宣言しないで、変数を使っていませんか?
5.変数名、命令文(if、while など)のスペルが間違っていませんか?
2.8.1 ロボット(車体)の動作
ロボットの動作はサンプルプログラムの 13~24 行目で定義されています。
13
public void run(){
14
// After trying out your robot, try uncommenting the import at the top,
15
// and the next line:
16
// setColors(Color.red,Color.blue,Color.green);
17
while(true){
18
// Replace the next 4 lines with any behavior you would like
19
ahead(100);
20
turnGunRight(360);
21
back(100);
22
turnGunRight(360);
23
}
24
}
13 行目の『public void run()』はこのあとの中括弧『
{ }
』の中にロボットがどのように
動くかを書く、という宣言をしています。
13 行目の『
{ 』から 24 行目の『 } 』の間にロボットがどう動くのかが書いてあります。
中身を見てみると下のようになっています。
while(true){
ahead(100);
//前へ 100 ピクセル進む
turnGunRight(360);
//砲塔を 360 度右回転させる
back(100);
//後ろへ 100 ピクセル下がる
turnGunRight(360);
//砲塔を 360 度右回転させる
}
『while(true){ 』と『 }』は。これは中括弧の中の命令を半永久的に(自分が死ぬか勝ち
残るまで)繰り返し実行する、ということを表す文です。
つまり『while(true){ 』と『 }』の中身を書き換えれば自分の思う動きをさせられるとい
うことになります。
2.8.2 敵ロボットを発見した場合の動作
敵ロボットを発見した時の動作はサンプルプログラムの 29~31 行目で定義されています。
26
/*
27
* onScannedRobot: What to do when you do see another robot
28
*/
29
public void onScannedRobot(ScannedRobotEvent e){
30
31
fire(1);
}
29 行目の『public void onScannedRobot(ScannedRobotEvent e)』ではロボットの動作
の場合と同じように敵ロボットを発見した場合、中括弧の中を実行するという宣言がされ
ています。
この中身は『fire(1);』の 1 行だけです。この fire()というのは弾を撃てという命令文です。
括弧の中の数字は弾の威力を指定しています。詳しくは 20 ページを参照してください。
2.8.3 敵ロボットの攻撃を受けた場合の動作
敵ロボットの攻撃を受けた場合の動作はサンプルプログラムの 36~38 行目で定義されて
います。
33
/*
34
*onHitByBullet: What to do when you're hit by a bullet
35
*/
36
public void onHitByBullet(HitByBulletEvent){
37
38
turnLeft(90 - e.getBering());
}
これの中身も 37 行目『turnLeft(90 - e.getBering());』の 1 行だけです。これは、turnLeft
の後の『( )』の中に指定された角度だけ左に回転するという命令です。その中にある
『e.getBearing( )』は、敵から弾丸を受けたとき、弾を発射した敵が現在自分のいる位置か
らみてどの方向にいるかという角度を表しています。
『90 - e.getBering()』は「90 度」から「自分からみた敵の角度」を引いた角度を表しま
す。例えば、弾を発射した敵が自分のいる位置からみて 30 度にいた場合 90-30=60 とな
り、60 度を表すことになります。
2.8.4 色々な変更の仕方について
ここでは、ロボットの色の変更の方法、味方を認識して撃たなくする方法を説明します。
2.8.5 ロボットの色の変更について
3 //import java.awt.Color;
16
// setColors(Color.red,Color.blue,Color.green);
ロボットの色変更は3行目と 16 行目の『//』を外せば変更可能となります。
チームごとに色が決まっているので表紙で自分のチームが何色に変更すればいいかを
確認してロボットの色を変更してください。
2.8.6 味方を攻撃しない方法について
ロボットをレーダーが認識した場合、敵か味方かどうかを判断するために
『onScannedRobot』の中身を次のように書き換えてください。
8
29
public class Sample extends TeamRobot
public void onScannedRobot(ScannedRobotEvent e){
if(!isTeammate(e.getName())){
*
30
fire(1);
}
*
31
}
8 行目の『Robot』を『TeamRobot』に書き換えます。また、29~31 行間の*のつい
ている行は追加された部分です。『if(!isTeammate(e.getName())){ … }』を追加すると、
レーダーで発見したロボットが味方かどうかを判断し、敵だった場合に『{ … }』の中の
命令を実行するようになります。
3.サンプルプログラムの説明
Robocode にはたくさんのロボットのサンプルプログラムが用意されています。ここでは、
その中の一つである「Walls」について説明します。
<Walls プログラム>
package sample;
import robocode.*;
/**
* サンプルプログラムの Walls の説明
* Walls は壁伝いに移動しながら弾丸を発射をする動きをする.
*/
public class Walls extends Robot {
boolean peek; // 自機が回転中であるかの判断をする変数(詳しい意味は onScannedRobot に)
double moveAmount; // 移動量
public void run() {
// 移動量を初期化(フィールドの横幅と高さの大きい方を移動量にする)
moveAmount = Math.max(getBattleFieldWidth(),getBattleFieldHeight());
// 初期移動
peek = false;
// 壁に対して直角になるように回転する.
// % は余りの算術演算子なので、今どの角度にいても、90 で割った余りだけ回転すると、
// 自機は必ず、0 度、90 度、180 度、270 度のどれかの値になる.
turnLeft(getHeading() % 90);
// 壁に行くまで直進する
ahead(moveAmount);
次のページに続きます。
Walls プログラムの続き。
// 回転する
peek = true;
turnGunRight(90);
turnRight(90);
// 無限ループ
while (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);
}
/**
* 敵機を発見したときの処理
*/
public void onScannedRobot(ScannedRobotEvent e) {
fire(2);
次のページに続きます。
Walls プログラムの続き。
// peek が true の時だけ敵機を探索して、peek が false の時は敵機を探索しない.
// それは、自機が回転中の時に敵を探索できてしまうと、自機の回転角が 90 度ではなく、敵機の方を
向いてしまう.
// だから、peek 変数にオン(true)とオフ(false)のスイッチを使い、処理を分けています.
if (peek)
scan();
}
}
4. ロボットの仕様
4.1 弾を撃ったときのエネルギー消費について
ロボットは砲塔の向いている方向にロボット自身のエネルギーを使って弾を撃ちます。
従って、弾を発射すると使ったパワーの分だけロボットのエネルギーを消費します。弾の
威力の有効範囲は 0.1<=power<=3 となっています。0.1 未満の値にしても 0.1 になり、
3 より大きい値にしても 3 になります。
命中時に敵に与えるダメージ及び弾の補充エネルギーは次のようになります。
命中時のダメージ
補充エネルギー
power <= 1
4*power
power > 1
4*power+2(power-1)
power <= 1
2*power
power > 1
3*power-1
4.2 弾以外で受けるダメージについて
他ロボットや壁に衝突した場合にもロボットのエネルギーは減ります。エネルギーの減
り方は次のようになります。
衝突によるダメージ(他ロボットとの衝突) 0.6
衝突によるダメージ(壁との衝突)
移動速度*0.5-1
5.主に使用するコマンド一覧
旋回系コマンド
移動系コマンド
void ahead()
前進
void turnLeft()
左旋回
void back()
後退
void turnRight()
右旋回
void turnGunLeft()
砲塔左旋回
特殊系コマンド
void turnGunRight()
砲塔右旋回
void fire() 砲弾を撃つ
void turnRadarLeft()
レーダー左旋回
void turnRadarRight()
レーダー右旋回
ゲーム情報系コマンド
double getEnergy()
エネルギーの残量を調べる
int getOthers()
残っている敵の数を調べる
システム変数系コマンド
double getBattleFieldHeight()
フィールドの縦幅を調べる
double getBattleFieldWidth()
フィールドの横幅を調べる
double getHeight()
自分の縦幅を調べる
double getWidth()
自分の横幅を調べる
イベント処理系コマンド
void onScannedRobot(ScannedRobotEvent event)
敵発見時の行動
void onHitWall(HitWallEvent event)
壁に衝突した時の行動
void onBulletHit(BulletHitEvent event)
弾が敵に命中した時の行動
void onBulletMissed(BulletMissedEvent event)
弾が外れた時の行動
void onHitByBullet(HitByBulletEvent event)
被弾時の行動
void onHitRobot(HitRobotEvent event)
敵と衝突した時の行動
void onRobotDeath(RobotDeathEvent event)
敵を破壊した時の行動
void onWin(WinEvent event)
戦闘に勝利した時の行動
6.参考文献
ロボコード作成マニュアル 2006 年度版&2005 年度版
ロボコード自作用資料
先人の方々
東京情報大学 情報システム学科
© Copyright 2026 Paperzz