最初に覚えること

(1)ゲームルールについて

  • ゲームは、2ラウンドの合計得点で勝敗を決定します。(得点の高いプレイヤが勝利)
  • ゲームはターン制とし、1ラウンドのターン数は50ターンです。
  • ラウンド1とラウンド2でプレイヤキャラクタのスタート位置が入れ替わります。
  • ゲームは、プレイヤキャラクタがゴールした場合のほか、次の場合に終了となります。
    • 50ターンに達した場合
    • 10秒以内にターンの行動命令を完了しなかった場合(タイムアウト)
    • AIプログラムが不具合等により停止した場合

(2)マップについて

  • マップは、15×15のマス(セル)で構成し、各マスには次の5種類があります。

    マスの種類 内容
    空間 0 自由に移動可能なマス
    1 移動できないマス
    蔵(外壁) 2 移動できないマス
    ゴール 3 ゴールとなるマス
    到着するとゲーム終了となり、ゴールを通過することはできません。
    水たまり 4 移動が制限されるマス
    次回の移動命令が1度だけ実行されません。

    ※大会ルールとして、マップは壁または蔵に囲まれているものとします。

    ※値はAIプログラムを作る際のマップ構成要素の検索などに使用します。

  • マップは、横軸をx軸、縦軸をy軸で表し、それぞれ0~14番までの番号が付いています。
  • マスの特定の場所を座標と言い、プログラムでは[x軸のマス番号,y軸のマス番号]と表します。

    例(●印の座標):[9,2]

(3)プレイヤキャラクタについて

  • プレイヤキャラクタが移動できるのは、1ターンにつき1歩(マス)です。

    (移動の命令コード(move_to)を使用できるのは1ターンに1回のみです。)

  • 次の命令コードの使用は1ターンにいずれか2回のみ

    (move_to)
    (get_map_area)
    (set_trap_item)
    *制限を超えて使用した命令は無効として処理します。

  • ゲーム開始時点では、プレイヤキャラクタはマップ情報を持っていません。マップ探索の命令コードを実行することにより、マップ情報を取得できます。
    ※ゲーム開始時点でAIプログラムが持つ情報は自分とゴールの位置だけです。
    ※マップ探索を実行することにより、マップ情報を取得していきます。

(4)得点について

得点は、次の①~⑤の合計となります。

① ゴールボーナス(ゴールした時のターン数に応じて加点)

ターン数 1~10 11~20 21~30 31~40 41~50 未ゴール
得点 100点 90点 80点 70点 60点 0点

② 加点アイテム

種類 お茶 和菓子 丁銀 シロイルカ 草薙剣
a b c d e
得点 10点 20点 30点 40点 60点

※大会ルールとして、草薙剣はマップ上に1個のみ出現するものとします。
(対戦環境のマップ上に草薙剣を2個以上設置することは可能ですので、マップを自作される場合はご注意ください。)


③ 減点アイテム

種類 毒キノコ トラバサミ 爆弾
A B C D
得点 -10点 -20点 -30点 -40点

④ 妨害キャラクタ

1回の接触につき10点減点(何度でも接触します。)
プレイヤーキャラクタがゴールしたとき、ゴール上に妨害キャラクタがいるときも減点されます。
1~40ターンはランダムで移動しますが、プレイヤキャラクタが3マス以内に入ると、プレイヤキャラクタへ向かって移動します。
41~50ターンは最寄りのプレイヤキャラクタに向かって移動します。プレイヤー1とプレイヤー2が等距離にいる場合は、ラウンド1はプレイヤー1へ、ラウンド2はプレイヤー2へ向かって移動します。


(1~40ターン)   (41~50ターン)

⑤ 歩行得点

5マス移動する都度、3点を加点

(5)マップ情報の利用にかかる注意事項について

プレイヤキャラクタは(get_map_area)を実行することにより、指定した5×5マス分のマップ情報を取得し、この情報を以下のような形で利用することが可能になります。
ただし、使い方に注意事項もありますので、それぞれの特性を理解して使用してください。

[取得したマップ情報を利用する例]
(calc_route)
指定した2点間の最短経路の座標配列を取得できます。
ただし、マップ情報を取得していない座標は壁等であっても移動可能なセルとして経路を計算するため注意が必要です。

くわしい使い方はこちら

(map_all)
マップ全体の情報を呼び出します。
ただし、マップ情報を取得していない座標は-1が返されます。(マップ情報は得られません。)

くわしい使い方はこちら

(map)
指定した座標のマップ情報を呼び出します。
ただし、マップ情報を取得していない座標は-1が返されます。(マップ情報は得られません。)

くわしい使い方はこちら

(locate_objects)
指定した範囲に、指定した要素が存在するかどうかを確認できます。(指定した要素がある場合はその位置情報が返されます。)
ただし、マップ情報を取得していない座標の確認はできません。(指定した要素が存在するかどうかは関係なく、何も返されません。)

くわしい使い方はこちら

(other_player_x  other_player_y)
対戦キャラクタのx座標、y座標を呼び出します。
ただし、「マップ情報の取得」で対戦相手の位置情報を取得していない場合(「マップ情報の取得」を実行していない場合、又は「マップ情報の取得」を実行した範囲に対戦相手がいなかった場合)は、nilが返されます。
また、得られる位置情報は、最後に実行した「マップ情報の取得」の情報を参照しているため、以下に注意してください。
⇒取得した時点での情報であり、対戦相手は既に移動している場合があること
⇒対戦相手の位置を把握していても、最後の「マップ情報の取得」の範囲に対戦相手がいなかった場合は、未把握の情報がゲームサーバに上書きされること

くわしい使い方はこちら

(enemy_x  enemy_y)
妨害キャラクタのx座標、y座標を呼び出します。
ただし、得られる位置情報は、最後に実行した「マップ情報の取得」時点での妨害キャラクタの座標です。(妨害キャラクタが「マップ情報の取得」の範囲にいなかった場合でも位置情報は取得できます。※対戦キャラクタの位置情報呼び出しのルールとは若干異なります。)

くわしい使い方はこちら

(6)プログラミングの基本について

[座標の取り扱い]

AIプログラムを作る際には座標を扱いますが、座標は単体で扱う場合と複数の座標をまとめて扱う場合があります。

例えば、妨害キャラクタの位置を調べる場合には一つの座標がゲームサーバから返されますが、経路情報などは複数の座標が返されます。

(例1:妨害キャラクタの座標を呼び出す)

⇒返される情報[7,8]

⇒妨害キャラクタがいる座標情報が返されます。

 

(例2:始点:プレイヤキャラクタから終点:ゴールまでの最短経路を検索する)

⇒返される情報[[13,9][13,8][13,7][12,7][11,7][10,7][9,7][8,7][7,7]]

⇒返される座標の順番にはルールがあり、先頭の座標が始点(現在の位置)で、次から進むべき経路順に座標が続き、最後に終点(ゴール)の座標となります。

⇒複数の座標は[ ]で囲んで記述します。

⇒座標は先頭から番号で指定することができます。先頭の座標が0で、あとは順番に1、2、3・・・となります。

⇒指定番号は[ ]で囲んで記述します。(例[1])

 

[変数(へんすう)]

変数とは、数値や文字列に名前を付けることを言います。変数を使うことにより、その場に応じて違う数値や文字を使うことができます。変数は数値や文字を入れるための「箱」で、変数につける名前は「箱」の名前です。

(例1:

⇒「num」が変数の名前で、中に入っているものが「10」です。

⇒変数の名前は、一定の規則に従っていれば、自由に付けられます。(英小文字かアンダースコア「 _ 」で始まる英文字、数字、アンダースコアで名前を付けます。但し、Rubyであらかじめ定義されている予約語と同じ名前を付けることはできません。

 

(例2:

⇒「ルート」が変数の名前で、中に入っているものが「2点間の最短経路」の情報です。

⇒「2点間の最短経路」の情報は複数の座標(始点から終点までの座標)が入っています。

⇒ここでは始点:プレイヤキャラクタの位置、終点:ゴールとします。

⇒変数とすることで、複数の情報を一つの名前で管理・使用できます。

⇒AIプログラムは、毎ターン、同じプログラムを繰り返すため、[3,8]などの具体的な座標を使うことはほとんどなく、何らかの命令コードで求めた値を使用することになります。こうした場合に変数が役に立ちます。

 

(例3:

⇒例2のブロックと「移動」ブロックの組み合わせです。

⇒変数「ルート」の指定番号1を移動先に指定しています。

⇒プレイヤキャラクタは1マスしか移動できないため移動先は[1]になります。

⇒下の例では[13,8]を移動先に指定したことになります。

⇒上のような行動をした場合、次のターンはどうなるか考えてみましょう。

⇒前のターンで[13,8]に移動していますので、答えは下の表のとおりです。

⇒変数「ルート[1]」は一緒ですが、移動先は[13,7]になっています。

⇒このように変数を付けることで、各ターンに対応した移動先を指定することができます。

 

[引数(ひきすう)]

引数とは、プログラミングにおいて、サブルーチンや関数、APIなどを呼び出す(コール)ときに指定する変数や定数のことです。

AIプログラムを作成する際には、命令コードの引数として、座標や変数を指定する場合があります。

(引数の例)

引数として座標を指定

引数として変数を指定

クリエイティブ・コモンズ・ライセンス

このドキュメント は クリエイティブ・コモンズ 表示 4.0 国際 ライセンス の下に提供されています。