■■ Perl Wars ルール ■■ $Id: perlwars.txt,v 1.2 1998/07/27 02:45:09 cake Exp cake $ ■ 概要 Perl Wars は、Perl スクリプトで書かれたロボット同士を一対一で戦わせる シミュレーションゲームである。 ロボットは、交互に行動を行ない、戦闘する。 自ターンのうちに、「移動」・「攻撃」のいづれかを3回実行することができ る。ただし3回の行動のうち、攻撃は2回までしかできない。 自機の位置はいつでも知ることができるが、敵機の位置は、知ることができな い。その代わり、攻撃した時、ねらった場所が敵機からどれくらい離れている かを知ることができる。 知ることができるのは、距離がステージの短辺÷2以内のときである。 攻撃を相手に一発命中させるか、または体当たり(相手のいる地点に移動する こと)すると、勝利となり、戦闘が終了する。 ただし、戦闘スクリプトが文法エラーを起こしてしまうと、即リタイアとみな され、その時点で負けが決まる。 ■戦闘ステージ 長方形の戦闘ステージ内で、戦闘が行われる。広さは縦横それぞれ7〜15の ランダムで、戦闘開始時に決定される座標系は左上を原点(0,0)とする 両ロボットの初期位置は、重なったり隣り合ったりしないようにランダムに決 定される。 ■自機の位置 自機の位置は、&pos というサブルーチンを呼び出すことで、知ることがで きる。 ■移動 自機は、&move( direction ) というサブルーチンを呼び出すことで、4方に 一歩だけ移動することができる。ただし、ステージの外へは移動できない。 ■攻撃 自機は、&shot( x, y ) というサブルーチンを呼び出すことで、敵機を攻撃す ることができる。 応用として、自機のいる場所を攻撃すれば、自機と敵機の距離を求めることが できる。(自分の攻撃は自分には当たらない) ■距離 2点間の距離は、 int( sqrt( $delta_x ** 2 + $delta_y ** 2 ) + 0.5 ) という式で求められる。 中心からの距離をマトリクスで示すと、下記のようになる。 [6] [5] [4] [4] [4] [4] [4] [5] [6] [5] [4] [4] [3] [3] [3] [4] [4] [5] [4] [4] [3] [2] [2] [2] [3] [4] [4] [4] [3] [2] [1] [1] [1] [2] [3] [4] [4] [3] [2] [1] [0] [1] [2] [3] [4] [4] [3] [2] [1] [1] [1] [2] [3] [4] [4] [4] [3] [2] [2] [2] [3] [4] [4] [5] [4] [4] [3] [3] [3] [4] [4] [5] [6] [5] [4] [4] [4] [4] [4] [5] [6] ■■ スクリプト仕様 ■■ ■ロボットの名前 ロボットには、英数8桁までの名前をつけることができる。 最初の1文字は、アルファベット大文字が望ましい。 例: "Scopedog" ■パッケージ ロボットを制御する戦闘スクリプトは、独自のパッケージ名をもつ Perl の スクリプトファイルとする。パッケージ名にはロボットの名前をつける。 例: package Scopedog; ■ファイル名 ファイル名は、ロボットの名前の後ろに、".plw" という拡張子をつけたもの とする。 例: "Scopedog.plw" ■メインスクリプトからの読み込み メインスクリプトから各戦闘スクリプトは require 文を使って読み込まれる。 例: require "Scopedog.plw"; ■初期化 戦闘スクリプトでは、メインスクリプトから require される際、独自に初期 化の処理を行うことができる。 ■変数、サブルーチンなど 戦闘スクリプトでは、自分のパッケージ内に限り、変数、サブルーチンなど自 由に定義し、使用することができる。 ただし、ファイルや標準入出力を使用することはできない。 ■戦闘スクリプトの呼ばれ方 メインスクリプトは、ターンごとに各戦闘スクリプトを、&action というサブ ルーチン名で呼び出す。引数は特に指定しない。 例: &Scopedog'action(); ■戦闘スクリプトの行動指示 戦闘スクリプトは、&action() サブルーチンの中で1ターンの戦闘の処理を行 なう。 その中で、メインスクリプト中で定義されている各種サブルーチンを呼び出す ことによって、行動したり、情報を得たりすることができる。 ■■ サブルーチン仕様 ■■ ■ &move 作用: 東西南北の任意の方向に一歩移動することができる。そこに敵機が存在 したら勝ち。 引数: 下記の方角を指定する。 0 = 北 1 = 東 2 = 南 3 = 西 返り値: 移動後の新しい位置を表すリスト (x,y) 例: #東に一歩進み、新しい自機の位置を、$my_x, $my_y に代入する。 ( $my_x, $my_y ) = &main'move( 1 ); ■ &shot 作用: 任意の地点を攻撃する。命中すると勝ち。 引数: 攻撃地点の座標 ( x, y ) を指定する。 返り値: 攻撃地点と敵機の位置の距離が、ステージの短辺÷2よりも短い場合、 その距離を返す。長い場合は、−1を返す。 例: #(3,3)地点を攻撃し、その地点から敵機までの距離を、$dist に代入する。 $dist = &main'shot( 3, 3 ); ■ &pos 返り値: 自機の位置を表わすリスト(x,y)を返す ■ &stage 返り値: ステージの大きさを表すリスト(x,y)を返す。 ■ &hist 返り値: 前ターンでの敵機の行動を表すリストを返す。 ( "S", "S", "M" ) など。 "M"...移動 "S"...攻撃 ■ &say 作用: ロボットにセリフをしゃべらせることができる。このサブルーチンは、任意に いつでも何度でも使用できる。デバッグメッセージに使ってもかまわない。 例: &main'say( "これでもくらえ!" ); &main'shot( $x, $y );