- ベストアンサー
ゲームのアルゴリズム
VC++.net(DirectX)でゲームを格闘ゲームを制作しようとしています。 一つ判らない事があり悩んでおります。 格闘ゲームの敵キャラ(CPU)の動きは、どのようにしてコードを書いているのでしょうか? 思い浮かんだのが、いくつかのパターンを持たせる…? だったのですが、コードレベルでどう書けば良いのか判らなくて・・・ 知っている方いましたらご教授お願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
AIについてですね。 やり方ということであれば方法はたくさんあります。 ゲームAIに特化した書籍も多く出版されていますので、そういった書籍を読んでみるとよいとおもいます。 コードレベルでどう書けばよいかわからないということは、どういう行動をさせたいかが具体的に見えていない状態であるとおもいます。 質問者さんが言っているようにパターンを持たせて特定の条件下に発動させるという方法もあります。 格闘ゲームであれば、できる行動というのは決まっている(限られている)はずです。 例えば、弱攻撃・強攻撃・ジャンプ・移動・ガードなど。 まず攻撃に関しては、パターンによる方法であれば、 複数ある攻撃をどうつなげたら有効かということからいくつかパターンをつくる。 そのパターンがどういう状況下で発動したら有効か(どういう条件で発動させたいか)を考える。 例えばPCとの距離が一定以内になった場合、一定確率で弱攻撃をだす。 弱攻撃がヒットした場合は、弱→弱→強など弱から続くパターンを再生させる。 2回目の攻撃があたらなかったらその場でやめ、ガード含めて一応あたったら続けるなど。 初めからパターンで定義されているものを行うようにするというのも方法のひとつでしょう。 質問者さんは、コードレベルでの実装方法で躓いているわけではなく、AI(COMキャラ)がどういう風に行動してほしいか、どう反応して欲しいかなど、どういう思考をさせたいかというところがまだ決まっていないようにおもいます。 自分ならどういう風に行動させる(操作する)かとか、どういうときにガードしたい(させたい)かなどAIの具体的な行動を考えてみてください、 そして、その行動が連続行動(弱→弱→強とか)など連続する行動であるなら、どういう条件なら続け、どういう条件になったら中断するかなどを考えてみてください。 そしてそれらの行動がどういう条件のときに発動したらよいのかを考えてみてください。 ウマくいけば無限ともいえるほど行動を思いつくかもしれません。 其の中から有効性が高いものを検討し、どれを実際に実装するかの取捨選択をし、どれを行うかとか発生確率などの優先順位をつけてみてください。 それらが具体的に決まれば、どのようにコードレベルで実装すればよいかはいろいろとアイデアが浮かぶとおもいます。 どのようにコードを書くかというのは、どのような行動をさせるか、どのように思考させるかが決まっていれば、ある程度は必然的にどのようにコードを書いたら実現できるかというふうに絞り込まれてきます。 ある程度経験をつめば、どのような仕組みで思考するようにコードを書いておけば汎用性が高いかというのが解るようになるでしょう。
その他の回答 (1)
- sha-girl
- ベストアンサー率52% (430/816)
参考になるかどうかわかりませんが 落ちものゲーム等のコンピュータのアルゴリズムを作った事があります。 (後将棋とかも。) AIをとういう仕組みで実装するかはゲームに依るところが大きいと 思いますが、基本的に別スレッドで動かしていました。 相手の状態や自分の状態を数値化して表し、 落ちてくるブロックに対して制限時間内にパターン検索を始めます。 その中で最適な候補を何個かもたせ、更にその中から ランダムで選びました。 コンシュマーやアーケード(例えばバーチャや鉄拳)などはフレーム単位 で処理していますが、PCの場合その部分が違うので実装の仕方も異なってきます。 似たようなアルゴリズムで走らせるなら 描画ルーチンとは別に60fpsで走るスレッドをつくりそこに処理する形になるのかな。 #1さんもいっておられますが、結局自分がコンピューターだったら どうするか、から考えていくことになるでしょう。 コンピューターの場合、ガードなんかの反射能力は最強なので その辺のバランスが難しそうです。 投げ間合いにはいった瞬間、投げ確定とか強すぎですからね・・・ とりあえず対戦できるもの作って、その後でAIを考えたので問題ないと思います。 もちろんコントロールの部分はちゃんと分けないと駄目です。
お礼
> 投げ間合いにはいった瞬間、投げ確定とか強すぎですからね・・・ これでは、強すぎですね^^; そういったのも考えて作らないといけないとは 単純そうに見えて奥が深いです。 レスありがとうございました。
お礼
> どういう思考をさせたいかというところがまだ決まっていないようにおもいます。 その通りです。。。 先にそちらを決めなければなりませんね・・・ 早速考えてみたいと思います。 ありがとうございました。