亀場サーバーJava用API

このページは、Javaを使って亀場を操る方法をまとめた。

Turtle.java

1. 亀場サーバーをJavaで操る

亀場をJavaプログラムから使う際には、まず、Turtleというクラスが定義されたファイルTurtle.java をダウンロードし、プログラミング用のディレクトリに入れておく。

プログラムの中では、まず、亀オブジェクトを

Turtle t = new Turtle("localhost");

のように生成した後、以下の表にまとめたメソッド(コマンド)を組み合わせて亀を操ればよい。

例えば、四角形を描くプログラムは、以下のソースプログラム square.java というファイル名で保存する。 このとき、ダウンロードした Turtle.java も同じフォルダにあることを確認する。

public class square {
    public static void main (String[] args) {
	Turtle t = new Turtle("localhost") ;
	t.clr() ;
	t.rst() ;
	t.pd() ;
	t.fd(100) ;
	t.lt(90) ;
	t.fd(100) ;
	t.lt(90) ;
	t.fd(100) ;
	t.lt(90) ;
	t.fd(100) ;
    }
} 

次いで、

javac square.java
java square

のようにしてコンパイル、実行する。

tfield-turtle-head-side The longest journey begins with a single step.

2. 亀を操るための機能(Java用)

C関数とは異なり、メソッド名は全て小文字であることに注意。長さや角度はdouble型で渡す。

描画関数一覧

メソッド名 対応するC関数 説明 使用例
new Turtle(接続先) CON(接続先) 亀場サーバーに接続し、Turtleのオブジェクトを返す
「接続先」は相手のIPアドレスまたはドメイン名
自分のPCの亀場サーバーを使うときは接続先
として"localhost"を指定
Turtle t = new Turtle("localhost");
clr() CLR() 描画内容とゾンビ亀を消去する
t.clr();
rst() RST() 亀を原点に移動し、方向を0度にセットする
亀の状態もリセットされる
対戦モード中は使えない
t.rst();
home() HOME() 亀を原点(0,0)に移動し、方向を0度にセット
亀の状態(ペンの上下等)は変化なし
対戦モード中は使えない
t.home();
fd(距離) FD(距離) 亀を指定の距離だけ前進させる
経路上に障害物(他の亀)が居るときは移動できない
t.fd(100);
bk(角度) BK(距離) 亀を指定の距離だけ後退させる
経路上に障害物(他の亀)が居るときは移動できない
t.bk(s*10);
jump(x座標,y座標) JUMP(x座標,y座標) 指定の座標に亀をジャンプさせる
対戦モード中は使えない
t.jump(x+10,y-10);
rjump(x移動,y移動) RJUMP(x移動,y移動) 現在地から相対移動させる
対戦モード中は使えない
t.rjump(dx,dy);
rt(角度) RT(角度) その場で角度(°)だけ右(時計回り)回転
t.rt(90);
lt(角度) LT(角度) その場で角度(°)だけ左(反時計回り)回転
t.lt(rad*180/Math.PI);
east()
north()
west()
south()
EAST()
NORTH()
WEST()
SOUTH()
右、上、左、下方向にそれぞれ頭の向きを変更
対戦モード中は無効
t.east();
lw(線の太さ) LW(線の太さ) 描画する線の太さを指定
t.lw(3.0);
pd() PD() ペンを下ろす
t.pd();
pu() PU() ペンを上げる
t.pu();
say(文字列) SAY(文字列) 現在地に"文字列"をプリント
半角英数字のみ対応
t.say("I'm smart.");
t.tprintf(書式,変数リスト) TPRINTF(書式,変数リスト) printf()関数の要領で数値などをプリント
半角英数字のみ対応
t.tprintf("x=%f y=%f",x,y);
col(赤,緑,青) COL(赤,緑,青) 描画する線の色を変更(初期値は赤)
ペンダウン(pd())の前に指定する
光の三原色で指定。各値の最小は0、最大は1
例えば (1.0,1.0,0.0)は黄色
t.col(0.7,1.0,0.0);
bgc(赤,緑,青) BGC(赤,緑,青) 「亀場」の背景色を設定(初期値は黒)
t.bgc(1.0,1.0,0.0);
fill() FILL() 線分で囲まれた凸領域を塗りつぶす
(ただし、頂点の数は6以下)
t.fill();
brush() BRUSH() 毛筆のような線で描く
t.brush();
point() POINT() 現在地点に点を打つ
lw()で設定した値が点の大きさとなる
t.point();
line() LINE() 塗りつぶしとブラシを解除し、
線での描画を行う(初期設定)
t.line();
card(種類,X座標,Y座標) CARD(種類,X座標,Y座標) 整数値で指定したトランプのカード
を座標の位置に置く。カードはJokerも入れて53枚で
1から53の整数値で種類を指定
t.card(3,100,-20);
clrcard CLRCARD() カードを亀場から消去
t.clrcard();
q_pos() Q_POS(&x,&y) 現在地の座標を問い合わせる
 要素が2つのdoubleの配列が返る
double[] pos = t.q_pos();
q_dir() Q_DIR(&a) 現在の方向角(度)を問い合わせる
doubleの値が返る
a = t.q_dir();

亀ロボット関数一覧

メソッド名 対応するC関数 機能 使用例
bmode() BMODE() 亀場を対戦モードに切り換える
背景が黒っぽいコルクボード状の柄に変わる
亀場の四方には壁ができ、外に出られなくなる
砲弾発射は-1点、相手に命中すると+10点、被弾は-30点
最初の持ち点は100。持ち点が0になると動けなくなる
t.bmode();
gmode() GMODE() 亀場を通常のタートルグラフィックス用に切り換える
背景が無地になる
亀は「外」にも移動できるようになり、 点数や名前の表示は消える
t.gmode();
fire() FIRE() 前方に「大砲」を発射する
一発発射ごとに持ち点が1ポイント減る
ただし、他の亀に命中すると10ポイントをゲット
一方、被弾した亀は30ポイントを失う
また、至近距離でドーナッツに命中すると10ポイント
大砲は1発ずつしか打てない(自分が発射した
砲弾は「亀場」に最大でも1つだけ)。
t.fire();
nm(文字列) NM(文字列) 亀にニックネームをつける
文字列は "ダブルクォーテーションで囲む"
t.nm("KAME");
tm(チーム番号) TM(チーム番号) 亀にチーム番号(1〜4)を設定する
これを設定しない亀のチーム番号は0
t.tm(3);
q_nt() Q_NT(&亀数) 亀場で生存している亀と物体を合わせた数(自分も含める)
ただし障害物は勘定に入らない。
n= t.q_nt() ;
q_radar() Q_RADAR(&角度) 自分に一番近い物体の方向角を問い合わせる
角度は自分の頭の方向を0とした相対値(度)で、
-180から+180の範囲
ただし、角度の計測結果には約±20度の誤差を含む
double型の値が返る
angle = t.q_radar();
q_finder() Q_FINDER(&結果) 自分の正面の距離20(亀のサイズ)の範囲内に
他の亀や障害物、壁があるかどうか問い合わせる
ただし砲弾には反応しない
0は障害物無し、1は亀、2はドーナッツ, 3は障害物、4は壁を検出
type = t.q_finder() ;
rf(長さ) RF(長さ) q_finderの探索範囲を変更する
初期値は20(亀のサイズ)になっている
t.rf(100.0);
			
q_tm() Q_TM(&チーム番号) FINDERとRADARで検出した亀の
チーム番号を問い合わせる
team = t.q_tm() ;
bcas(文字列) BCAS(文字列) 同じチームメンバーにメッセージを送信
最大128文字まで
チームメンバーにGOT_MESSAGEイベントが発生
t.bcas("COME ALL") ;
q_bcas() Q_BCAS(&時刻,文字列) チームメンバーからのメッセージを受信
TeamMessageクラスのオブジェクトが返される。
TeamMessage tmsg = t.q_bcas() ;
q_sonar() Q_SONAR(&左,&前,&右) 自分の斜め左、正面、斜め右の距離20(亀のサイズ)の
範囲内に障害物があるかどうか問い合わせる
ただし,障害物の種類は区別できず、砲弾には反応しない
[左, 前, 右]のbooleanの配列が返される。
配列要素はtrueが障害物有り、falseが無し
boolean[] res = t.q_sonar();
q_time() Q_TIME(&時間) 亀場が出来てからの経過時間を問い合わせる
自分の生存した時間、ではない点に注意
now = t.q_time();
			
q_score() Q_SCORE(&スコア) 自分の持ち点を問い合わせる
最初に持ち点100から出発し、砲弾を発射する毎に-1点
ただし亀に命中すると+10点が加算される
myscore = t.q_score();
			
idle(時間長) IDLE(時間長) 指定した時間長(秒)だけ動作を停止
「ちょっと待ってから・・」に使うとよい
t.idle(1.0);
robot() ROBOT() 亀場に「ロボット亀」を登場させる
ロボットは大砲を発射してくるのでとても「危険」
t.robot();
donut() DONUT() 亀場のランダムな位置に「ドーナッツ」をひとつ出す
一匹の亀が出せるドーナッツは最大10個
至近距離でドーナッツに砲弾が命中すると10ポイント
t.donut();
coin() COIN() 亀場のランダムな位置にコインを1枚出す
コインは亀の移動の邪魔にはならない。
t.coin();
borrowcoin() BORROWCOIN() 亀場の主からコインを10枚借りる
亀のはじめの所持金は0(コイン0枚)
t.borrowcoin();
dropcoin() DROPCOIN() 現在位置にコイン(金貨)を1枚落とす
t.dropcoin();
pickcoin() PICKCOIN() 現在位置のコインを1枚拾う
t.pickcoin();
q_coin() Q_COIN(&枚数) 現在位置の周りに何枚コインがあるか調べる
結果はint型で返される
ncoin = t.q_coin();
q_mycoin() Q_MYCOIN(&枚数) 手持ちのコインの枚数を調べる
結果はint型で返される
nmycoin = t.q_mycoin();

イベント処理

亀が被弾したり物体に衝突すると、以下のメソッドが呼び出される。Turtleクラスのサブクラスを作成し、メソッドをオーバーライドして用いる。

衝突イベントを用いる際は、以下の点に注意:
fd()メソッドやbk()メソッドで、前進(後退)させようとすると、亀場サーバーは 指定の距離だけ動いた際に、他の物体に衝突するかどうかを計算して判定する。 そして、もし移動の途中で物体に衝突するようであれば、亀を動かさない。
衝突イベントは、そのような場合に発生する。
単に、物体に接近しただけでは、イベントは発生しない。

メソッド名 機能
void hit_by_bullet(int time) 亀(自分)が被弾した際に呼び出されるメソッド
被弾した時刻(数値)が引数に渡される
void run_into_turtle(int time) fdで前進しようとして、亀に衝突した際に呼び出されるメソッド
衝突した時刻(数値)が引数に渡される
void run_into_donut(int time) fdで前進しようとして、ドーナッツに衝突した際に呼び出されるメソッド
衝突した時刻(数値)が引数に渡される
void run_into_stone(int time) fdで前進しようとして、石に衝突した際に呼び出されるメソッド
衝突した時刻(数値)が引数に渡される
void run_into_wall(int time) fdで前進しようとして、壁に衝突した際に呼び出されるメソッド
衝突した時刻(数値)が引数に渡される
void found_coin(int time) 自分の周囲にコインが見つかった際に呼び出されるメソッド
最初に発見した時刻(数値)が引数に渡される
void detected_by_finder(int time) 他の亀のFINDERに自分が検出された際に呼び出されるメソッド
見つかった時刻(数値)が引数に渡される
void detected_by_radar(int time) 他の亀のRADARに自分が検出された際に呼び出されるメソッド
見つかった時刻(数値)が引数に渡される
void got_message(int time) 同じチームメンバーからメッセージが発信された際に呼び出されるメソッド
発信時刻(数値)が引数に渡される
イベントのマスク

イベント処理中に他のイベントを禁止(マスク)したい場合は

void disable_event(int eventcode)

イベント処理を再開したい場合は

void enable_event(int eventcode)

を用いる。指定できるイベントコードは以下のとおり:

記号                        値(16進)
EVENT_HIT_BY_BULLET        00000001  被弾
EVENT_RUN_INTO_TURTLE      00000002  亀に衝突
EVENT_RUN_INTO_DONUT       00000004  ドーナッツに衝突
EVENT_RUN_INTO_STONE       00000008  石に衝突
EVENT_RUN_INTO_WALL        00000010  壁に衝突
EVENT_FOUND_COIN           00000020  コインをみつけた
EVENT_DETECTED_BY_FINDER   00000040  FINDERで検知された
EVENT_DETECTED_BY_RADAR    00000080  RADARで検知された
EVENT_GOT_MESSAGE          00000100  同じチームメンバーからメッセージが発信された