亀場サーバーGo言語用API

このページは、Goプログラムを使って亀場を操る方法をまとめた。(このページは準備中)

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