亀場サーバーRuby用API
このページは、Rubyプログラムを使って亀場を操る方法をまとめた。
1. 亀場サーバーをRubyで操る
亀場をRubyプログラムから使う際には、まず、Turtleというクラスが定義されたファイルturtle.rb をダウンロードし、プログラミング用のディレクトリに入れておく。
つぎに、あなたのRubyプログラムの中(出だしのあたり)に
require './turtle.rb'
を加える。
プログラムの中では、まず、亀オブジェクトを
t = Turtle.new("localhost")
のように生成した後、以下の表にまとめたメソッド(コマンド)を組み合わせて亀を操ればよい。
2. 亀を操るための機能(Ruby用)
C関数とは異なり、メソッド名は全て小文字であることに注意。
描画関数一覧
メソッド名 | 対応するC関数 | 説明 | 使用例 |
---|---|---|---|
Turtle.new(接続先) |
CON(接続先) | 亀場サーバーに接続し、Turtleのオブジェクトを返す 「接続先」は相手のIPアドレスまたはドメイン名 自分のPCの亀場サーバーを使うときは接続先 として"localhost"を指定 |
t = Turtle.new("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.") |
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) | 現在地の座標を問い合わせる [x,y]の配列が返る |
x,y = t.q_pos |
q_dir |
Q_DIR(&a) | 現在の方向角(度)を問い合わせる | 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)を設定する |
t.tm(3) |
q_nt |
Q_NT(&亀数) | 亀場で生存している亀と物体を合わせた数(自分も含める) ただし障害物は勘定に入らない。 |
n= t.q_nt |
q_radar |
Q_RADAR(&角度) |
自分に一番近い物体の方向角を問い合わせる 角度は自分の頭の方向を0とした相対値(度)で、 -180から+180の範囲 ただし、角度の計測結果には約±20度の誤差を含む |
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(&時刻,文字列) | チームメンバーからのメッセージを受信 発信時刻(整数)と内容(文字列)が返される |
tim,msg = t.q_bcas |
q_sonar |
Q_SONAR(&左,&前,&右) | 自分の斜め左、正面、斜め右の距離20(亀のサイズ)の 範囲内に障害物があるかどうか問い合わせる ただし,障害物の種類は区別できず、砲弾には反応しない [左, 前, 右]の配列が返される。配列要素は trueが障害物有り、falseが無し |
left,front,right = 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() | 亀場のランダムな位置に「コイン」を落とす コインは亀の移動の邪魔にならない |
t.coin |
borrowcoin |
BORROWCOIN() | 亀場主からコインを10枚借りる 亀のはじめの所持金は0(コイン0枚) |
t.borrowcoin |
dropcoin |
DROPCOIN() | 現在位置にコイン(金貨)を1枚置く |
t.dropcoin |
pickcoin |
PICKCOIN() | 現在位置のコインを1枚拾う |
t.pickcoin |
q_coin |
Q_COIN(&枚数) | 現在位置の周りに何枚コインがあるか調べる | ncoin = t.q_coin |
q_mycoin |
Q_MYCOIN(&枚数) | 手持ちのコインの枚数を調べる | nmycoin = t.q_mycoin |
イベント処理
亀が被弾したり物体に衝突すると、以下のメソッドが呼び出される。Turtleクラスを継承したクラスを作成し、例えば
require './turtle.rb' class Robot < Turtle def hit_by_bullet(time) puts "Ouch !!" end end
のように、メソッドをオーバーライドして用いる。
衝突イベントを用いる際は、以下の点に注意:
fd()メソッドやbk()メソッドで、前進(後退)させようとすると、亀場サーバーは
指定の距離だけ動いた際に、他の物体に衝突するかどうかを計算して判定する。
そして、もし移動の途中で物体に衝突するようであれば、亀を動かさない。
衝突イベントは、そのような場合に発生する。
単に、物体に接近しただけでは、イベントは発生しない。
メソッド名 | 機能 |
---|---|
hit_by_bullet(time) |
亀(自分)が被弾した際に呼び出されるメソッド 被弾した時刻(数値)が引数に渡される |
run_into_turtle(time) |
fdで前進しようとして、亀に衝突した際に呼び出されるメソッド 衝突した時刻(数値)が引数に渡される |
run_into_donut(time) |
fdで前進しようとして、ドーナッツに衝突した際に呼び出されるメソッド 衝突した時刻(数値)が引数に渡される |
run_into_stone(time) |
fdで前進しようとして、石に衝突した際に呼び出されるメソッド 衝突した時刻(数値)が引数に渡される |
run_into_wall(time) |
fdで前進しようとして、壁に衝突した際に呼び出されるメソッド 衝突した時刻(数値)が引数に渡される |
found_coin(time) |
自分の周囲にコインが見つかった際に呼び出されるメソッド 近くにコインが無い状態で、自分がコインを落とした際にも反応する 最初に発見した時刻(数値)が引数に渡される |
detected_by_finder(time) |
他の亀のFINDERに自分が検出された際に呼び出されるメソッド 見つかった時刻(数値)が引数に渡される |
detected_by_radar(time) |
他の亀のRADARに自分が検出された際に呼び出されるメソッド 見つかった時刻(数値)が引数に渡される |
got_message(time) |
同じチームメンバーからメッセージが送信された際に呼び出されるメソッド 発信された時刻(数値)が引数に渡される |
イベントのマスク
イベント処理中に他のイベントを禁止(マスク)したい場合は
disable_event(eventcode)
イベント処理を再開したい場合は
enable_event(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 チームメンバーからメッセージが発信された