亀場サーバーJava用API
このページは、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
のようにしてコンパイル、実行する。
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 同じチームメンバーからメッセージが発信された