CS3AIプログラムガイド

最終更新日時 2007/4/16 (Mon)
このコンテンツは現在メンテナンスされていません。


目次

マニュアルへ戻る Youthの実験室(仮)へ 作者の現在のサイト(GingerWorks)へ


基本的な記述のルール

詳しくはサンプルプログラムを見てください。

目次へ戻る

命令一覧

目次へ戻る

文字定数一覧

あらかじめ決められた数を代入されている文字列。このゲームにおいては、代入が出来ない以外は変数と同じ扱いが出来ます。
使うとプログラムが見やすくなるほか、現在の自機の状態を得ることが出来ます。

<定数置換系>
()内の数字とまったく同じ意味を持ちます。

UP:(0)
DOWN:(1)
LEFT:(2)
RIGHT:(3)

HEAD:(0)
BODY:(1)
LARM:(2)
RARM:(3)
LEG:(4)

TRUE:(1)
FALSE:(0)
<情報取得系>
現在の機体や自国の状態から値を取得しています。

MYEN:現在の自機残りENと同値
MYX:現在の自機X座標と同値
MYY:現在の自機Y座標と同値
MYCREDIT:現在の自分の功績値を返します。

HEADMAX:現在の頭部パーツの最大耐久力と同値
BODYMAX:現在の胸部パーツの最大耐久力と同値
ARMMAX:現在の腕部パーツの最大耐久力と同値
LEGMAX:現在の脚部パーツの最大耐久力と同値

BASE:自機が帰還中なら1、出撃中なら0を返す。
BASEHP:現在の自国基地の耐久力
BASEHPMAX:現在の自国基地の最大耐久力
CAPITAL:現在の自国の資金

RESPONSE:反射行動でAIが呼び出されたときTRUEを、それ以外ではFALSEを返します。
TARGETX:反射行動時、自機を攻撃した敵機の相対X座標を返します。
TARGETY:反射行動時、自機を攻撃した敵機の相対Y座標を返します。
INTERVAL:前回の攻撃からの経過時間を返します。
目次へ戻る

系統別命令一覧と詳細

目次へ戻る

行動系

これらの命令は成功するとターンを終了する。失敗した場合次の行へ処理を移す。

attack:使用腕:方向

指定した腕で、指定方向を攻撃する。 自国の陣地への攻撃指定、基地も敵地も存在しない場所への攻撃はAIエラー。ただしENは消費する。
使用腕は0〜3の範囲で指定。0から順に、左腕、右腕、左腕、右腕の意味を持つ。
方向は0〜3の範囲で指定。0から順に、上、下、左、右方向の意味を持つ。

move:方向

指定した方向に移動する。
敵機や基地のある座標、画面外への移動はAIエラー。ENは消費しない。
方向は0〜3の範囲で指定。0から順に、上、下、左、右方向の意味を持つ。

out

基地から出撃する。基地内でしか実行できず、既に出撃している場合AIエラー。

return

基地に帰還する。出撃中にしか実行できず、かつ基地座標上にいないとAIエラー。

opuse:方向

指定方向へオプションを使用します。 使用できないタイプのオプションの場合はAIエラー。
方向は0〜3の範囲で指定。0から順に、上、下、左、右方向の意味を持つ。

目次へ戻る

情報取得系

一定のルールで指定変数に値を返す。

areacheck:変数:相対X座標:相対Y座標

自機から相対座標(X,Y)の位置のエリアの占領状況を調べ、指定変数に以下の値を代入する。
自国エリアの場合:0
無所属エリアの場合:1
他国エリアの場合:2
対他国エリアで、且つ敵機が存在する場合:−1
画面外の場合:−99

costcheck:変数:部位

指定部位に関連する消費ENを指定変数に代入する。
部位は2〜4の範囲で指定。2から順に、左腕武器、右腕武器、基本移動コストを取得する。

basexycheck:変数1:変数2

基地への相対座標を指定変数に代入する。

enemycheck:変数1:変数2:除外国名:方向

一番近くにいる敵機を探し、自機から見た座標を指定変数に代入する。
同じ距離に複数の敵機が存在する場合、その中からランダムで一機が選ばれる。
自機の頭部レーダーの範囲内に敵機が存在しない場合、指定変数1に99を返す。
除外国名を指定するとその国の機体は敵機とみなさない。(省略可)
方向を指定すると指定方向に限った探査が可能。
例・「RIGHT」を指定して、レーダー範囲が4の時
□■
□■■
□■■■
★■■■■
□■■■
□■■
□■

■の範囲の敵機だけをサーチします。★は自機です。

friendcheck:変数:相対X座標:相対Y座標

自機から相対座標(X,Y)の位置のエリアに存在する機体数を指定変数に代入する。ただし、
味方機は正の数
敵機は負の数
エリアに機体が存在しない場合は0
画面外を指定した場合は−99を返す。

lifecheck:変数:部位

指定部位の残り耐久度を指定変数に代入する。
部位は0〜4の範囲で指定。0から順に、頭部、胸部、左腕、右腕、脚部の意味を持つ。

movecostcheck:変数:方向

自機に隣接する指定方向への移動コストを調べ、指定変数に代入する。

namecheck:文字列変数:相対X座標:相対Y座標

自機から相対座標(X,Y)の位置のエリアに存在する機体のプレーヤー名を指定変数に代入する。
指定座標に複数機いる場合はランダムで一機選ばれる。

rangecheck:変数:部位

指定部位に関連する有効レンジを指定変数に代入する。
部位は0,2,3から指定。0から順に、頭部レーダー値、左腕武器レンジ、右腕武器レンジの意味を持つ。

sonor:変数:方向

自機に隣接する指定方向エリアの占領状況を調べ、指定変数に以下の値を代入する。
自国エリアの場合:0
無所属エリアの場合:1
他国エリアの場合:2
他国エリアで、且つ敵機が存在する場合:−1
画面外の場合:−99

目次へ戻る

計算系

計算結果を指定変数に代入する。値の指定は定数と変数両方で可能。

abs:変数:値

絶対値の取得。値の符号をとって指定変数に代入する。

calc:変数:演算子:値

指定の変数と値を指定演算子による演算をして代入しなおす。
演算子は"+,-,*,/,%,="の6種で、それぞれ、 「加算、減算、乗算、除算、除余代入」の意味を持つ。

let:変数:値

指定変数に値を代入する。

rand:変数:自然数

0以上でかつ指定の自然数より小さい整数を、指定変数にランダムで代入する。
全ての値においてそれぞれの値になる確立は等しい。

sign:変数:値

符号の取得。値の符号を調べ、指定変数に以下の値を代入する。
値が負のとき:−1 値が0のとき:0 値が正のとき:1

strlet:文字列変数:値

指定文字列変数に値を文字列として代入する。

目次へ戻る

プログラム処理系

プログラムの流れを制御する命令系。大抵のバグはこれが原因。

end

AIのターンを終了する。何も行わないときに使う。

gosub:ラベル

プログラム内から指定ラベル行を検索し、その行に一時的に処理を移す。
ただし、subreturnを見つけると戻ってくる。

goto:ラベル

プログラム内から指定ラベル行を検索し、その行に永久的に処理を移す。

if:値1:演算子:値2:命令文:・・・

値1と値2に、指定演算子による比較を行い、正しければ命令文を実行する。
演算子は"==,!=,<,>,<=,>="の6種で、それぞれ、 「同値、同値でない、小さい、大きい、以下、以上」の意味を持つ。

print:文字列または変数:(〜同様に4個まで)

自分のログに指定文字列、または指定変数の値を出力する。複数指定した場合は半角コロンで区切って4つまで出力する。
1ターンに10回までしか使えず、それ以上はAIエラーになります。

rem:コメント

何もしない命令です。プログラムを見やすくするために説明を挿入するために使います。

subreturn

最後に読み込んだgosubの次の行に処理を飛ばします。
戻るgosubがない場合は次の行に処理を移します。

目次へ戻る

サンプルプログラム

専守防衛型AI。左手レンジ1、右手レンジ2。 敵機が基地に近づくと、基地を中心として7x7の正方形の範囲で敵を迎撃。 敵機を発見できないときは基地に帰還します。
if:BASE:==:TRUE:goto:*BASE enemycheck:X:Y if:X:==:99:goto:*RETURN if:X:==:0:goto:*ATTACK_V if:Y:==:0:goto:*ATTACK_H basexycheck:X:Y abs:x:X abs:y:Y if:x:>:2:goto:*RETURN if:y:>:2:goto:*RETURN goto:*CHASE *ATTACK_V if:MYEN:<:200:end if:Y:==:-2:attack:RARM:UP if:Y:==:-1:attack:LARM:UP if:Y:==:1:attack:LARM:DOWN if:Y:==:2:attack:RARM:DOWN goto:*CHASE *ATTACK_H if:MYEN:<:200:end if:X:==:-2:attack:RARM:LEFT if:X:==:-1:attack:LARM:LEFT if:X:==:1:attack:LARM:RIGHT if:X:==:2:attack:RARM:RIGHT goto:*CHASE *RETURN basexycheck:X:Y if:X:==:0:if:Y:==:0:return *CHASE if:Y:<:0:move:UP if:Y:>:0:move:DOWN if:X:<:0:move:LEFT if:X:>:0:move:RIGHT end *BASE enemycheck:X:Y if:X:==:99:end lifecheck:a:HEAD if:a:==:0:end lifecheck:a:LARM if:a:==:0:end lifecheck:a:RARM if:a:==:0:end out
土地獲得用AI。両手武器なし。反撃のみ。 sonorとareacheckの試験実装。
if:BASE:==:TRUE:goto:*BASE sonor:a:C if:a:==:1:move:C let:d:C *REPEAT_SONOR sonor:a:b if:a:>:0:move:d calc:d:+:1 calc:d:%:4 if:d:==:C:goto:*REPEAT_SONOR let:i:0 *REPEAT_SERCH rand:x:5 rand:y:5 calc:x:-:2 calc:y:-:2 areacheck:a:x:y if:a:>:0:goto:*CHASE calc:i:+:1 if:i:<:10:goto:*REPEAT_SERCH move:c *MOVE_RANDOM rand:d:4 sonor:a:d if:a:>=:0:{ let:C:d move:C } goto:*MOVE_RANDOM *CHASE rand:d:4 if:Y:<:0:let:d:UP if:Y:>:0:let:d:DOWN if:X:<:0:let:d:LEFT if:X:>:0:let:d:RIGHT sonor:a:d if:a:>=:0:{ let:C:d move:C } end *BASE lifecheck:a:HEAD if:a:<:HEADMAX:end lifecheck:a:LEG if:a:<:LEGMAX:end out
目次へ戻る

よくある質問集

Q:AIで基地攻撃は可能ですか?

A:はい、可能です。ただし、敵基地座標を直接判別することはできません。
実際に行う場合はあらかじめ指定した座標へ攻撃をするなどの工夫が必要です。

Q:機雷はAIで判別できますか?

A:できません。オンラインの時と同じように空白地として認識します。
どうしても踏みたくない場合は空白地をすべて避ける等しないといけません。

Q:現在の重量(基本移動コスト)を知りたいのですが。

A:脚部が破壊されていなけば"costcheck:a:LEG"で現在の重量を知ることができます。
機雷射出後機雷分だけ機体が軽くなることを利用すれば、機雷残弾の有無を知ることはできます。

Q:画面外でもないのにareacheckが−99を返すときがあります。

A:頭部レーダーの範囲外を指定するとそうなります。頭部破損時は隣接エリアの情報しか正確に得ることができません。

随時アップしたいなw 質問は掲示板でお願いします。

目次へ戻る