- 索引
-
- └ サンプル目次
- 1章:短編集
- 2章:診断系コンテンツ
- 3章:製品抽出系コンテンツ
-
- ├ 構成の確認
- ├ 回答の確認
- ├ 点数表の作成
- ├ 得点の集計(1)
- ├ 得点の集計(2)
- ├ 結果画面の作成(1)
- └ 結果画面の作成(2)
- 番外:Simulation Game
-
- ├ 地形データの読込
- ├ ユニットの移動
- ├ 敵ユニットの扱い
- ├ 敵AI:目的地に移動出
- └ 一応の終わり
敵AI:目的地に移動出
占領する街の優先順位を決める
近い街から占領する
ゲームを有利に進めるためには多くの街を占領して収入を上げる必要があります。なのでAIでは街の占領を最優先とします。一番効率の良い戦略は近い街から占領していくことだと思うので、まずは街までの距離を算出する処理を作成しました。
→サンプル(sample/06_dist.html)

距離を求める基準は?
まずユニットを生産する場所から街までの距離を測定する。その結果により作成するユニットを決定する。例えばサンプルでは海上に街があるが、ここには歩兵はたどり着けないのでヘリ部隊が必要となる。
歩兵自体も随時チェック
街の状態は変化します。例えば自軍によって占領された街に移動しても無意味です。そのため歩兵(占領部隊)は移動の度に最寄りの街をチェックするようにしなければなりません。
まずは歩兵の処理から
まずは簡単そうな歩兵の処理「最寄りの街を探す」から実装しました。考え方はシンプルで、まずは移動量98(海を渡れない最大値)で移動範囲を走査します。次に街の位置の数値を調べて、一番大きい値を持つ街が最寄りとなります。
通行不能マスの移動コストを再考
通行不能の場所の移動コストを99としているため操作範囲は最大で98となってしまう。これだと大きなマップの場合、捜査対象に入らない街がでる可能性がある。なので実制作の時には通行不能の移動コストを999にしようと思う。あとFinal Fantasy Tacticsのようなファンタジー系のゲームの場合は「テリトリー(操作範囲)に入ったユニットに攻撃する」という思考ルーチンも作成できると思う。
懸案事項(1)
このサンプルでは街のデータを地形データとして組み込んでいる。そのため不変のデータと扱われるのですが、実際は占領されることにより状態が変わる。このサンプルでも地形データから街のデータを分離して個別に持つようにしているが、現状では陣営の管理ができないので管理方法を検討する必要がある。
懸案事項(2)
このサンプルでは街までの距離を求める時に敵ユニットを考慮しないようにした。もし考慮してしまうと、敵ユニットがいる街にはAIのユニットが近寄らず無視してしまうため。しかし攻撃ユニットが存在する本番では、最優先破壊対象として街の周りにいるユニットを破壊するようにするので、このような処置は必要ないかもしれない。
AI作成は予想以上に複雑そう...。
実際に移動させる

最寄りの街に移動
実際はAIの指示によって敵ユニットを移動させますが、今回はとりあえずユニットをクリックしたら移動するようにしました。以下のサンプルで赤い歩兵をクリックしてみてください。最寄りの街に向かい4歩(歩兵の移動量)だけ近づいていきます。さらにクリックすると都市に到着します。
→サンプル(sample/07_go.html)
最短経路を求める処理を使い回す
街までの道筋は以前作成したrouteSearchFuncを利用して求めています。味方ユニットの処理ではクリックした場所まで移動を繰り返すようにしましたが、敵ユニットの場合は移動量に応じて進む距離を算出しなくてはなりません。そこでアニメの処理を以下の様に作成しました。地形を調べて移動コストを計算し、自身の移動量が0になる(または目的地に到着する)まで再帰的に移動(アニメ)するようにしています。
function enemyMoveFunc(mov,movCostList){//===敵のユニットを移動する if (routeList.length == 0 || mov <=0) {//===目的地に到着、または移動量が0になったら停止 $("#selectArea").empty(); $("#unitArea").one("click",".unit",tempFunc); debugTextFunc(); }else{ var targetPos = routeList.pop(); var x = targetPos[0];var y = targetPos[1]; var moveCost = movCostList[mapData[y][x]]; var nowMov = mov - moveCost;//==================移動コストを引く $("#"+nowUnitID).data({"x":x,"y":y}); $("#"+nowUnitID).animate({left:x*hexSize,top:y*hexSize},function(){ enemyMoveFunc(nowMov,movCostList);//=======アニメが終わったら再帰処理 }); } }
これで当初「難しそうだ」と思っていた部分は理解できました。しかし総合的なAIの作成は想像以上に大変そうです...。どの様なユニットを生産して、どのように目的地や攻撃対象を決めるかなど。しかしユニット生産や都市占領を除けば以外とシンプルなAIで済みそうなので、それらを除いたゲームを作成しようと思う。たぶんタワーディフェンスとファミコンウォーズを合わせた感じになると思います。
ということで、今回でjQueryでのアルゴリズム模索は終了してcocos2d-xでの制作に入ろうと思う。というか、すでにcocos2d-xにある程度移植が完了しています。ですので次回はcocos2d-xで完成しているところまでを紹介(たぶんyoutube)して、この番外編を締めくくろうと思います。
次のページ: 一応の終わり