亀場サーバーRuby用API

このページは、Rubyプログラムを使って亀場を操る方法をまとめた。

turtle.rb

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  チームメンバーからメッセージが発信された