亀場サーバーGo言語用API
このページは、Goプログラムを使って亀場を操る方法をまとめた。(このページは準備中)
1. 亀場サーバーをGo言語で操る
亀場をGoのプログラムから使う際には、まず、turtleというパッケージが定義されたファイルturtle.go
をダウンロードし、インポートできるようにディレクトリに入れておく
(ここでは、turtle
というディレクトリの中にturtle.go
が置かれることを想定する)。
つぎに、あなたのGoプログラムの中(出だしのあたり)のimportの項目に
import ( "モジュールのディレクトリ名/turtle" )
を加える。
プログラムの中では、まず、Turtle構造体変数へのポインタを
t := new(turtle.Turtle)
のように生成した後、以下の表にまとめたメソッド(コマンド)を組み合わせて亀を操ればよい。
2. 亀を操るための機能(Golang)
C関数とは異なり、メソッド名は大文字と小文字の組み合わせであることに注意。
描画関数一覧
メソッド名 | 対応するC関数 | 説明 | 使用例 |
---|---|---|---|
Connect("接続先") |
CON(接続先) | 亀場サーバーに接続し、Turtleのオブジェクトを返す 「接続先」は相手のIPアドレスまたはドメイン名 自分のPCの亀場サーバーを使うときは接続先 として"localhost"を指定 |
t.Connect("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() |
P_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構造体変数を定義した後で、
package main import ( "foo/turtle" "fmt" ) func callback1(t turtle.Turlte, timecode int){ fmt.Println("ouch!") } func main() { t = new(turtle.Turtle) t.SetRunIntoWallCallback(callback1) .... }
のように、コールバック関数を登録する。
衝突イベントを用いる際は、以下の点に注意:
Fd()メソッドやBk()メソッドで、前進(後退)させようとすると、亀場サーバーは
指定の距離だけ動いた際に、他の物体に衝突するかどうかを計算して判定する。
そして、もし移動の途中で物体に衝突するようであれば、亀を動かさない。
衝突イベントは、そのような場合に発生する。
単に、物体に接近しただけでは、イベントは発生しない。
コールバック関数の登録 | 機能 |
---|---|
SetHitByBulletCallback(func(Turtle,int)) |
亀(自分)が被弾した際に呼び出されるコールバックを登録 被弾した時刻(数値)が引数に渡される |
SetRunIntoTurtleCallback(func(Turtle,int)) |
fdで前進しようとして、亀に衝突した際に呼び出されるコールバックを登録 衝突した時刻(数値)が引数に渡される |
SetRunIntoDonutCallback(func(Turtle,int)) |
fdで前進しようとして、ドーナッツに衝突した際に呼び出されるコールバックを登録 衝突した時刻(数値)が引数に渡される |
SetRunIntoStoneCallback(func(Turtle,int)) |
fdで前進しようとして、石に衝突した際に呼び出されるコールバックを登録 衝突した時刻(数値)が引数に渡される |
SetRunIntoWallCallback(func(Turtle,int)) |
fdで前進しようとして、壁に衝突した際に呼び出されるコールバックを登録 衝突した時刻(数値)が引数に渡される |
SetFoundCoinCallback(func(Turtle,int)) |
自分の周囲にコインが見つかった際に呼び出されるコールバックを登録 近くにコインが無い状態で、自分がコインを落とした際にも反応する 最初に発見した時刻(数値)が引数に渡される |
SetDetectedByFinder(func(Turtle,int)) |
他の亀のFINDERに自分が検出された際に呼び出されるコールバックを登録 見つかった時刻(数値)が引数に渡される |
SetDetectedByRadarCallback(func(Turtle,int)) |
他の亀のRADARに自分が検出された際に呼び出されるコールバックを登録 見つかった時刻(数値)が引数に渡される |
SetGotMessageCallback(func(Turtle,int)) |
同じチームメンバーからメッセージが送信された際に呼び出されるコールバックを登録 発信された時刻(数値)が引数に渡される |
イベントのマスク
イベント処理中に他のイベントを禁止(マスク)したい場合は
Disable_Event(eventcode)
イベント処理を再開したい場合は
Enable_Event(eventcode)
を用いる。指定できるイベントコードは以下のとおり:
定数 値(16進) turtle.EVENT_HIT_BY_BULLET 00000001 被弾 turtle.EVENT_RUN_INTO_TURTLE 00000002 亀に衝突 turtle.EVENT_RUN_INTO_DONUT 00000004 ドーナッツに衝突 turtle.EVENT_RUN_INTO_STONE 00000008 石に衝突 turtle.EVENT_RUN_INTO_WALL 00000010 壁に衝突 turtle.EVENT_FOUND_COIN 00000020 コインをみつけた turtle.EVENT_DETECTED_BY_FINDER 00000040 FINDERで検知された turtle.EVENT_DETECTED_BY_RADAR 00000080 RADARで検知された turtle.EVENT_GOT_MESSAGE 00000100 チームメンバーからメッセージが発信された