もどる
fire1.gif 思考ルーチン(1)データとフラグを結べ! 00/08/05
マップエディタにめどがついたので、本体側の作成に着手することに。 まずは、夏休みの三大課題のひとつ、思考ルーチンです。今回は、格闘ゲームにおける思考ルーチンを考えてみます。

僕は、思考ルーチンは次のような処理に簡略化できると思ってます。それは、

  • 周囲の状況を見る
  • 状況を自分なりに考える
  • 行動を決定する
の三つです。ちなみにこれは、「入力→計算→出力」という流れといっしょです。 ここで、二つ目をプログラムで書こうとすると、必ずと言っていいほど「if文」が増えてしまいます。 凝った思考ルーチンを作ろうと思えばなおさらです。そこで今回は、できるだけif文を減らそうってことで、 「データとフラグの結び方」を考えていきます。

うまく説明できる自身がないので、結論から入ります。今日僕は、思考ルーチンは次のように簡略化できるんじゃないか? と思いつきました。次に示します。

行動 = とりうる行動テーブル[周囲の状況];

「テーブルからひっぱってくるのはいいけど、周囲の状況をどうやって整数にするんだよ!」っていう話になりますが、 それも簡単です。次のような感じになります。

//相手との距離に応じて行動を変える思考ルーチンのサンプル
//距離<10なら接近、
//10<距離<30
var
  Dst:Integer; //相手との距離
  ThinkTable:array [0..255] of procedure;

procedure Think;
const
  NearValue   = 1;
  MiddleValue = 2;
  FarValue    = 4;
var
  Index:Integer;
begin
  Index:=Integer(Dst<10)*NearValue or
         Integer((Dst>=10)and(Dst<30))*MiddleValue or
         Integer((Dst>=30)and(Dst<50))*FarValue;    
  ThinkTable[Index];    
end;

しかし、これには大きな欠点があります。 例えば、上記のような行動テーブルが255個しかない場合には、 行動を決定付けるフラグが8個しか作れません。 行動テーブルを65536にしてみても、たったの16個です。 行動テーブルには行動(procedure)へのポインタを入れておくとすると、 4*65536バイトの領域を使います。およそ240キロバイトくらいです。

行動テーブルは敵キャラ全員に使いまわしをさせるとしても、結構実用的です。 こういう思考ルーチンの実装方があっても、いいんじゃないでしょうか?

次へ進む
夏休み三大課題
マップエディタの作り直し、思考ルーチンの改良、システムの改造、の三つを指す。 現段階では、マップエディタしか片付いていない。








もどる