【MULTIPLY 29】
ロボット設計の手引き
 

ゲーム名 : MULTIPLY 29
作者名 : 下村智則
連絡先: chop@hh.iij4u.or.jp
情報源: http://hp.vector.co.jp/authors/VA012411/
  
 

オンラインサポート


 
 
フィジカルパフォーマンス集団  肉



1 MULTIPLY 29の概要 :

 MULTIPLY 29は、ロボットの思考回路をプログラムし、ほかのロボットと戦わせることによって勝敗を決するという類のゲームです。ロボットの設計データファイルをインターネット上で他人と交換することによって、ネットワークゲーム的に楽しむことができます。また、負けたからといって諦めることなく、勝てるようになるまで作戦を練る楽しさがあります。


2 MULTIPLY 29の対戦 :

 

2-1 大まかな遊び方

MULTIPLYは次のような手順で遊びます。

ロボットを設計しファイルとして保存する(Multiply.exe)
→ ファイルを友人と交換する(お使いのメーラやブラウザ)
→ 友人のロボットと対戦させる(M3D.exe)
→ ロボットを改良していく(Multiply.exe)
括弧の中に書かれているのは使用するソフトウェアです。MULTIPLY 29 のパッケージには二つの実行形式ファイルが含まれており、次のように使います。
Multiply.exe:ロボットの設計および改良と、設計ファイルの保存
M3D.exe:ロボット同士の対戦
 

2-2 とりあえず対戦

とりあえず対戦がどんなものか知るために、サンプルの設計ファイルを使って対戦させてみましょう。m3d.exeを実行してください。

※Multiply.exeやM3D.exeをショートカットやランチャなどを使って実行するときは、作業フォルダとしてインストールしたディレクトリを指定するようにしてください。ポリゴンのデータを収めたXファイルを読むために必要です。
最初に、Window/全画面の選択、各種設定等を行うダイアログボックスが表示されます。
Use Window: ウインドウモードで実行するか全画面モードで実行するかを選択します。
WindowPosition(LEFT、TOP)
WIDTH、HEIGHT:
ウインドウモードで実行する場合のウインドウ表示位置を決定します。
320×240、640×480、800×600 全画面モードで実行する際の解像度を設定します。
Show Visual Effect 火花などの視覚効果を表示するかを選択します。
Play Sound Effect 効果音の再生を行うか選択します。
Play Music
(未対応)
WireFrame Mode ワイヤーフレーム(線画)で表示します。一般的に高速で表示されます。
Cube Mode ロボットを立方体で表示します。一般的にポリゴンデータの読み込みと描画が高速化されます。
Use Texture テクスチャ(ポリゴンにつける模様)を貼るか選択します。
Use Point Light 点光源を使用するか選択します。一部の武器から光が出るようになります。非常に遅くなりますが、実験的につけてみました。
 ここで設定したことはもう一度M3D.exeを起動するときまで変更できません。

次に赤チームと青チームのそれぞれ4機のロボットを指定するダイアログボックスが表示されます。

Entry 設計ファイルを選択するダイアログを開きます。
Cancel 選択されている設計ファイルを無効にします。無効にした状態で対戦を始めると、そこにロボットは配置されません。4対4ではなく、2対2などで対戦させる場合に使用します。
↓、↑ 矢印と同じ方向のファイルと同じファイルを指定します。一番上の↑ボタンは巡って一番下のファイルをコピーします。同様に一番下のしたボタンは一番上のファイルをコピーします。
ActionGameMode ファイル名の左のラジオボックスで選択したロボットを、キーボードで操作する事が出来るようになります。アクションゲームとして楽しむほか、デバッグなどに使う事が出来ます。
TimeLimit 対戦が終了する時間を設定します。大会などでは永久に終わらない試合を強制的に終了する目的で、ここに時間制限を設定する場合があります。
RandomSeed 対戦内容が複数のマシン上で同じである必要がある場合、ここに同一の数値を設定します。また、対戦終了時に表示されるリプレイ用のデータをここに設定しておけば、その試合をリプレイしてみることが出来ます。
SPEED 対戦を表示する速度を設定します。あまり大きくすると一度の書換え当たりの処理時間が長くなり、分かりづらくなります。試合の結果だけが重要な場合は、ここに極端に大きな値を設定することで、表示をキャンセルすることが出来ます。
CameraSensitivity 対戦を見る視点が、ロボットの移動やキー操作によってどれくらい即座に反応するかを設定します。数値が大きいほどロボットの動きに合わせてカメラが追従するようになります。
AutomaticCamera 自動的にカメラの位置と方向を変え、戦闘をカッコ良く演出します。現時点では選択する事が出来ません。(制作中)
Reset Camera カメラ位置を、デフォルト位置にリセットします。
 最初は、設計ファイルの欄に何も指定されていないので、適当なファイルを指定してください。拡張子が「m3d」のファイルが、MULTIPLY 29専用のロボット設計ファイルです。ここで、同じファイルを複数回指定しても問題ありません。同じ設計内容のロボットが複数出場するだけです。

【OK】ボタンを押すと、対戦が開始します。次のような画面になります。

ウインドウモードでの実行例
全画面モードでの実行例
 ここでActionGameModeを選択しなかった場合は、ロボットの対戦内容を左右することは出来ません。出来るのは対戦終了とカメラの位置とアングルの操作だけです。
【ESC】 対戦を終了します。
【F1〜F8】 対応しているロボットに注目します。既にそのロボットが消滅している場合は何も起こりません。
【RITURN】 存在する次のロボットに注目します。
【SPACE】 ロボットに注目するのを止めます。
↑→↓← カメラアングルやカメラ位置を変更します。
Ctrl、Shift カーソルキーとの組み合わせで、カーソルキーの効果を変えます。
ActionGameModeを選択した場合は、選択したロボットをキーボードで操作する事が出来ます。
↑→↓←
ロボットを平行移動させます。
Z、C
ロボットを方向転換させます。
D、S
Dキーでメインウエポン、Sキーでサブウエポンを発射します。キーを離すとキャンセルがかかりますので、発射し終えるまで押しっぱなしにする必要があります。
X
他のキーとの組み合わせによりコマンド攻撃を出します。 

【対応コマンド】 
D:ダッシュ右パンチ(ホバー) 
S:ダッシュ左パンチ(ホバー) 
→:右ダッシュ(タンク) 
←:左ダッシュ(タンク) 
 

 ロボットは体力をすべて失うか、自爆することによって死んでしまいます。赤チームと青チームのうち、どちらかが全滅するか制限時間が過ぎると対戦は終了し、試合結果を示すメッセージボックスが現れます。

乱数指定データ(リプレイ用) この4桁の整数を記録しておき、前述のRandomSeedの欄に設定すれば、この試合をリプレイすることが出来ます。大会などの結果でこの数が公開された時は、自分のロボットがどういう戦いをしたか確認することが出来ます。
耐久力、機体名(作者名) 機体の残り耐久力(最大:999、消滅:0)と、機体名、作者名を表示します。
残機数 チームごとの残機数を表示します。
合計耐久力 チームごとの耐久力の合計を表示します。
 これをOKすると、またロボットの設計ファイルのエントリーを行うダイアログが表示されます。対戦を始める前にMultiply.exeで設計ファイルを変更することも出来ます。

 

2-3 ロボットの取りうるアクションや状態

先ほどの対戦で動いていたロボットたちが、どうやって動かされていたのかを説明します。

ロボットは、次のような行動をとることが出来ます。

移動アクション 移動、方向転換 自機の移動と方向転換を行います。
攻撃アクション メインウエポン メインウエポンを使用します。攻撃準備から発射、攻撃後処理の三段階を経ます。
サブウエポン サブウエポンを使用します。攻撃準備から発射、攻撃後処理の三段階を経ます。
コマンド攻撃 複数の命令を連続的に処理すること(これをコマンド入力と呼びます)によって、コマンド攻撃を行います。コマンド入力に使用できるチップは、STOP、MOVE、ATTACK(いずれも後述)の3つです。 

コマンド攻撃を命令すると、現在実行中の移動アクションと攻撃アクション(コマンド攻撃を除く)を自動的に停止します。

ショック状態 機体が攻撃を受けた後のわずかな間、機体は何もすることが出来ません。移動アクションと攻撃アクションは自動的にストップします。
ニュートラル状態 上記のいかなるアクションを行っておらず、ショック状態でもない状態。
 ロボットがどのような状況に置かれているかを判断し、どのようなアクションを実行していくか、プログラムするわけです。
※移動アクションと攻撃アクション(コマンド攻撃を除く)は同時に実行することが出来ます。敵弾を避けながら攻撃を行ったり、適を追いつめながら攻撃を行ったり出来ます。(前作からの注意すべき変更点です)
移動アクションは、明示的にストップ(後述)してニュートラルの状態に戻すか、コマンド攻撃によって自動的に移動アクションを停止するか、新しく移動アクションを命令しない限り、現在の状態は終わりません。移動や方向転換が続きます。新しく移動アクションを命令した場合は、新しい方向や出力で移動を始めます。

攻撃アクションは、攻撃準備、攻撃、ニュートラル状態に戻す、という3段階を経て、自動的にニュートラル状態に戻ります。移動アクションと違って、その3段階の間は、新しく攻撃アクションを命令しても無視されるだけです。ストップを使用すれば、攻撃を取りやめてニュートラル状態に戻すことが出来ます。つまり、攻撃中に攻撃を取りやめたいときや、他の攻撃を行いたい時は、ストップ命令でニュートラル状態に戻します。

すべての攻撃アクションには、攻撃準備時間、攻撃時間、攻撃後処理時間、が必要です。このため、ロボットの思考回路プログラムから攻撃命令を出してから、実際に攻撃が行われるまでに、多少のタイムラグがあります。

 

2-4 ロボットの機体(ハードウェア)

次に、ロボットの機体の種類について説明します。

まず、移動形態を一つ選択しなければなりません。その移動形態の型によって、機体の移動速度や装甲の頑丈さ、装備できる武器などの性能が変わってきます。

次にその移動形態に搭載する武器を2つ選びます。メインウエポンとサブウエポンです。ホバー型の場合は、メインウエポンは右手に、サブウエポンは左手に装着します。タンク型の場合は、メインウエポンは前方に、サブウエポンは左右に二つ装着します。

また、メインウェポンを発射するにはメインチャージ、サブウェポンを発射するにはサブチャージが必要になります。十分に充電されていない状態で発射しようとすると、発射されないか、不完全な状態で発射されます。これらのバッテリーは、その武器を使用していない時に自動的に充電されます。

※コマンド攻撃には専用のチャージがない代わりに、メインチャージとサブチャージを消費します。また、移動用の電源を使用するものがあり、移動や方向転換の速度が落ちる場合があります。
いかに、武器を説明します。
武器名
チャージ消費
説明
レーザー 300 光学兵器。射程が長く、離れた敵を狙うのに適しています。また、爆発によって無力化することがありません。
ワイドレーザー 600 光学兵器。レーザーと同様に射程が長い。その巨大な出力で自機自体を損傷しないように、発射後最初のほうは小さい出力で、徐々に出力を大きくして。そのため最初のほうは敵にダメージを与えることが出来ません。但しこの間もロボットはワイドレーザーがあることをサーチ出来ます。
バルカン 400 射程が短く、遠くの敵を狙うことは出来ません。ただし、近距離では大きなダメージを与えます。
ボム 200 発射型爆弾。発射後大きな爆発を起こします。また、障害物や爆発によっても爆発します。
ナパーム 400 非誘導ミサイル。上記のボムとは違い推進力を内蔵しており、遠くの敵をねらうのに適しています。障害物やロボットにあたると爆発を起こします。
ホーミング 200 誘導ミサイル。ナパームほどの爆発力と推進力はないものの、前方にいるロボットを追尾することができます。ただし、味方が前方にいる時は、味方を追尾してしまう危険性もあります。
地雷 400 設置型爆弾。発射後滑らかに地面を滑り、フィールド上にとどまります。長時間経過するかロボットが上を通過すると爆発します。また、障害物や爆発によっても爆発します。地雷が密集していると誘爆を起こすので、上手くすれば大ダメージを与えることが出来ます。
 コマンド攻撃に関しては、チップの種類を理解しておく必要があるため、チップの後に説明します。

3 MULTIPLY 29の思考回路プログラミング :

3-1 思考回路の基礎

ここでは思考回路の設計の仕方について説明します。まず、「Multiply.exe」を実行してください。

起動したら、「ファイル(F)」メニューの中の「開く(O)」をクリックしてください。「開く」ダイアログボックスが開かれ、「Multiply.exe」と同じフォルダにある、拡張子が「m3d」のファイルがいくつか表示されていると思います。これがロボットの設計ファイルです。サンプルの一つを選んで、「開く(O)」をクリックしてください。

ロボットの思考回路のプログラミングは、20×20のマス目に、8種類の、チップと呼ばれるプログラムの最小単位を並べることによって、行います。そしてこれらのチップにはそれぞれ青い矢印(分岐する場合は赤い矢印も)がくっついていて、処理が進む方向を示しています。

ロボットには「現在処理中のチップ」が一つ存在します。対戦が始まると、まず一番左上のチップを処理します。チップの処理が完了すると、青い矢印と赤い矢印に従って次のターンで処理すべきチップを割り出し、1ターンの処理を終了します。この処理が全てのロボットについて行われ、次のターンの処理が行われます。この処理の仕方を見れば分かるように、一つのチップを処理するのにかかる時間は全て等しく、ロボット間での処理速度の違いもありません。

このように、思考回路の処理は、矢印によってチップを繋いでいくことによって行いますが、「条件分岐」チップには赤い矢印が存在し、チップに設定した条件が成立した場合に赤、そうでない場合に青の矢印に進ませることが出来ます。

※もしチップが無い場所へ処理を進めた時、ロボットは自爆命令であると判断して自爆行動を起こし、世界から亡くなってしまいます。このほか、 「計算」チップで、0による割り算を行った場合も自爆命令だと判断します。ロボットが自爆しないために、思考回路は処理が循環するように設計しなければ行けません。
 

3-2 エディタの操作

サンプルファイルのチップのどれかをダブルクリックしてみてください。ダイアログボックスが表示されたと思います。チップの種類によっては、チップのプロパティ(設定)が必要なものがあります。プロパティをこのダイアログボックスで設定してください。

チップを追加するには、ツールバーか「チップ(T)」メニューで、追加すべきチップの種類を選択し、さらに青い出口と、必要なら赤い出口の方向を選択してください。続いて四角形の中でダブルクリックするとそこにチップが追加されます。

チップの配置 配置したい枠の中でダブルクリックするかリターンキーを押すと、選択中のチップを置くことが出来ます。また、枠の中で右クリックしてポップアップメニューから<チップの配置>メニューを選ぶことによって、配置したいチップの種類を直接選ぶことが出来ます。
チップの出口の変更 すでに配置したチップの出口をドラッグすることによって、方向を変えることが出来ます。出口の方向を変えたいチップの上で右クリックして、ポップアップメニューからも同じ事が出来ます。 
チップの種類と出口の方向の選択 ツールバー上のボタンを押すか、<チップ>メニューから選択できます。同じようにしてチップの出口の方向を選択することが出来ます。 
チップのプロパティの設定 プロパティを設定したいチップの上でダブルクリックするかリターンキーを押すか、右クリックしてポップアップメニューから<プロパティ>を選択することによって、プロパティを設定するダイアログボックスを表示することが出来ます。
チップの選択 選択したい範囲をドラッグすることによって指定し、チップを選択状態(メッシュ表示)にすることが出来ます。CTRLキーを押しながらドラッグすれば、現在選択中のチップを選択したままで、追加的に選択することが出来ます。この時すでに選択されていたチップは非選択状態になります。また、スペースキーを押すことによって、カーソル位置のチップを選択することが出来ます。 
チップの編集 <編集>メニューやツールバーやポップアップメニューから、選択状態にあるチップに対して、切り取り、コピー、貼り付け、削除、を行うことが出来ます。貼り付けを行う際の貼り付け先は、赤い枠で示されるカーソルの場所を左上の隅として貼り付けられます。 
カーソルの移動 左クリックやキーボードの矢印キーによって、カーソル(赤い枠)を移動させることが出来ます。 
機体情報の入力  <ゲーム><機体情報入力>メニューを選択することによって、機体に名前を入力、作者名を入力、機体の型を選択、機体へのコメントを入力、そしてファイルにパスワードを設定して他人がプログラム内容を見ることが出来ないようにプロテクトをかけることが出来ます。 
  

3-3 チップの説明

それでは8種類のチップについて説明します。チップの設定の中で使われる「角度」は、ロボットから見て正面が0度、左がマイナス、右がプラスで表されます。さらに「距離」は、フィールド全体が900、ロボットの全長が40、程度を目安にしてください。

何もしないチップ

ロボットに対して何も行いません。つまり今まで行っていた行動を継続します。単にチップとチップをつなぐ役割をします。

停止チップ

ロボットに対して現在実行中のアクションをストップするよう命令します。

移動と攻撃を独立してストップすることが出来ます。たとえば移動しながら攻撃しようとしているとき、敵が射程外に出たため移動は続けながら攻撃を取りやめたい時は、【攻撃のみを停止】を選びます。

【ロボットが命令を…】は、ロボットがショック状態で命令を受け入れなかった場合に、分岐するよう設定します。停止命令が受け入れられない理由はショック状態しかありません。

コマンド入力チップの一つです。停止のタイプ(移動のみ、攻撃のみ、両方、等)が異なる場合は異なるコマンドだと判定される場合があります。

移動チップ

ロボットに対して移動や方向転換を開始するよう命令します。この時、移動すべき方向や出力を定数か変数で指定します。

ロボットは平行移動と方向転換を同時に行うことが出来ます。また、ロボットは移動と攻撃を同時に行うことが出来ます。

【ロボットが命令を…】は、ロボットがショック状態で命令を受け入れなかった場合に、分岐するよう設定します。移動命令が受け入れられない理由はショック状態しかありません。

コマンド入力チップの一つです。移動の方向や出力が異なる場合は異なるコマンドだと判定される場合があります。

攻撃チップ

ロボットに対して攻撃を開始するよう命令します。

ロボットは移動と攻撃を同時に行うことが出来ます。

【ロボットが命令を…】は、ロボットがショック状態か既に攻撃中で命令を受け入れなかった場合に、分岐するよう設定します。l攻撃命令が受け入れられない理由はショック状態と攻撃アクション中であることがあります。

コマンド入力チップの一つです。攻撃ののタイプ(メイン、サブ、等)が異なる場合は異なるコマンドだと判定される場合があります。

サーチチップ

2つの距離と2つの角度を指定して、その扇型の中にあるオブジェクトの個数をサーチします。そのとき、自機から遠ざかっているオブジェクトを無視することも出来ます(自機から発射されたものに対して反応させたくない時等に使用)。

得られた個数は変数に代入することや、条件にかけることができます。角度はロボットから見て−90度から90度の間で設定しなければいけません。つまり、前方180度しか、サーチすることができません。距離は0〜999の間で設定しなければ行けません。つまりロボットは最長999までしかサーチできません。

状態チェックチップ

自機の状態や、経過時間や残り時間、敵の数と味方の数をチェックします。得られた数は変数に代入することや、条件にかけることができます。

代入チップ

変数や定数、二値間の乱数、角度を指定してその角度に最も近い角度にいる味方の変数、のいずれかを、他の変数に代入したり、条件にかけることができます。

計算チップ
四則演算を行い、得られた結果を他の変数に代入したり、条件にかけることができます。
サブルーチンジャンプチップ
チップの処理を、サブルーチンにジャンプさせます。サブルーチン内でリターンチップを処理することで、サブルーチンを呼び出した場所に処理を戻す事が出来ます。 

サブルーチンの中で、サブルーチンを呼び出すことも可能です。ただし、その深さは最大16まで。16を越えてサブルーチンをネストしようとすると、ロボットは自爆してしまいます。

リターンチップ

サブルーチンから、その呼び出し元に処理を戻します。 

サブルーチンを呼び出していない状態でリターンチップを処理すると、ロボットは自爆してしまいます。

  

3-4 変数の説明

ロボットの内部には、20×20のチップのほかに、変数と呼ばれる数値の記憶領域があります。この数値はチップと連絡しながらチップに対して数値を渡したり、渡されたりします。チップのプロパティの中で、数値を指定する場合は定数と変数のどちらで指定するか決める事が出来ます。またチップから数値を変数内に格納することも出来ます。

変数はA〜Zまでのアルファベットで表されており、中に−9999〜9999までの整数値を記憶することが出来ます。また、変数のうち最後の3つX、Y、Zは、「通信変数」と呼ばれる特殊なもので、仲間同士の通信変数は常に同じに保たれます。つまり、通信変数の内容を変更すると、その変更が同じチームの全てのロボットにも及ぶということです。上級テクニックになりますが、ロボット同士のコミュニケーションが可能となります。

 

3-5 コマンド攻撃

ロボットは、以上で説明した命令(停止/平行移動/方向転換/メインウエポン使用/サブウエポン使用)以外にも、その移動形態や搭載武器によって異なる命令を実行することが出来ます。この特殊な命令を、コマンド攻撃といい、そのハードウェア依存という性質上、ソフトウェアの最小単位であるチップでは、直接的にはサポートされていません。

コマンド攻撃を命令するには、ロボットに対して複数の命令を連続的(チップを隣り合わせて)に実行する必要があります。コマンド入力が可能なチップは、停止チップ、移動チップ、攻撃チップ、の3つです。

それでは現時点で搭載されているコマンド攻撃の例を挙げてます。

 

攻撃名称 チャージ消費 コマンド入力 可能なハードウェア
右腕パンチ メイン 300 メイン→メイン ホバー型全機
左腕パンチ サブ 300 サブ→サブ ホバー型全機
ダッシュして右腕パンチ メイン 300 移動(0度方向)→メイン→メイン ホバー型全機
ダッシュして左腕パンチ サブ 300 移動(0度方向)→サブ→サブ ホバー型全機
左ダッシュ なし 移動(-90度方向)→移動(-90度方向) タンク型全機
右ダッシュ なし 移動(90度方向)→移動(90度方向) タンク型全機
 このコマンド攻撃はMULTIPLY29のバージョンアップごとに、追加されていきます。また、コマンドが伏せられた状態で【なぞのコマンド】が追加される可能性もあります。
 

3-6 サブルーチン

MULTIPLY29の思考回路は、サブルーチンを使って、機能毎に分割することが出来ます。サブルーチンとは、ある機能を持ったプログラムの部品ことです。サブルーチンを組み合わせて、一つの完成品を作ることが出来ます。

例えば、敵弾回避用の回路をサブルーチンとして独立させておけば、接近する敵弾を検知した後、処理を敵弾回避用のサブルーチンに飛ばす事が出来ます。さらに、サブルーチンを呼び出す場所は一つだけとは限りませんので、回路中の様々な個所で、敵弾回避用のサブルーチンを呼び出すことが出来ます。サブルーチン内でリターンチップが処理されると、処理はそのサブルーチンを呼び出した場所に戻ります。

処理をサブルーチンにジャンプさせるには、サブルーチンジャンプチップを使います。サブルーチンの開始位置を、(X、Y)座標で指定してください。座標はエディタ右下にマウスのポイント先の座標が表示されるので、それを参考にすれば分かりやすいと思います。

サブルーチンの中でもサブルーチンを呼び出す事が出来ます。これをサブルーチンのネスト(入れ子)と呼びますが、サブルーチンは16個までしかネストすることが出来ません。16個を越えてネストしようとすると、ロボットは自爆してしまうので注意しましょう。

また、サブルーチンではないところでのリターンチップの呼び出しも、ロボットの自爆につながります。
 
 
 

4 最後に :

最新の情報に関しては、こちらのページをご覧ください。

http://hp.vector.co.jp/authors/VA012411/