コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
オワたず ◆w7BXxYlkW2NJ
2019/12/16 19:29
情報交換
NPCの移動AIを作るとしたらどうしますか
こんにちは
NPCのAIなんて作ったものがないものですから、また行き詰まってしまいました()

こんな感じのプログラムで、移動AI(縦と横)を作るとしたらどんな風に作りますか?
公開キー【C3A3EECS】(374行目、@ENEMY_AI)

コメント

アバター
Na 2019/12/16 20:08 ◆QoELVrBXBQCI
ランダムな方向に歩き、プレイヤーと一定の距離まで近づいたら撃ってくるとか?
アバター
こういち 2019/12/16 20:18 ◆ou0jbJnEJ0Kb
Naさんに同意。
あと、あまり正確に撃ってくるとバランスブレイカーになるので、狙うときにちょっとブレさせると良いかも。
アバター
オワたず 2019/12/16 20:47 ◆w7BXxYlkW2NJ
自分もそう思います。それで、「ランダムな方向に歩く」ってのが自分にとって難しいんですよね、ぶるぶる震えてどこかに行ってしまう
アバター
こういち 2019/12/16 20:58 ◆ou0jbJnEJ0Kb
障害物にぶつかるまで直進とかがシンプルで良いと思います。
アバター
でんぺん 2019/12/16 21:17 ◆HfSy5ayxtyTa
ランダムに移動させたいなら、ランダムに目的地地点を決めて、そこまで歩いたらまた次の目的地点をランダムに決めるという方法もありますね。
障害物などで移動できなかった時はまた次の目的地点を決める感じで。
アバター
あまさとしおん 2019/12/17 16:54 ◆mzDKTVUAtwqE
「残り移動時間」で管理してもいいかもね
残り移動時間をET、移動方向をERとして

WHILE 1
 VSYNC
 IF ET<=0 THEN
  ER=ランダムな値:ET=ランダムな値(※)
 ELSE
  DEC ET
 ENDIF
 (ERをもとに敵を動かす)
 (メインループの中身)
WEND 的な
アバター
あまさとしおん 2019/12/17 16:59 ◆mzDKTVUAtwqE
(※)
残り時間にランダム値を入れるときは20以上とか40以上などある程度大きな数にする
こうすることで同じ場所でブルブルを防ぐことができる

WHILE 1〜WENDはメインループを表してるだけなので@MAIN〜GOTO @MAINなどほかの形式でも大丈夫です
アバター
あきと 2019/12/17 18:16 ◆Q/mp.qcMuPYu
プレイヤーを追いかけるだけだと子供のサッカーみたいになってしまうので、こいつはこの通路に留まるというような範囲を設定してあげるのもいいと思います。
あとメタルギアみたいにルートを作ってあげてそのルート上を歩くとか。実際は複数の座標を指定して順番に向かうようにする処理になると思います。
アバター
GRS 2019/12/17 21:23 ◆yVrf9Z5Kq57E
元のプログラムを理解していないので`DEF`で機能追加してみました。
406が敵のスプライト番号なので`ENEMY_AI 406`と呼び出しています。

■ アルゴリズム

@ 現在のプレイヤー座標を目的地とする
A 3秒間は脇目も振らず目的地へ進む
B 時間になったので@に戻る

基本的にプレイヤーに近づくので何処かに行ってしまうことはない
目的地を決めたら一定時間行動を固定化するのでプルプル震えることはない

■ 簡単にプログラムの説明

スプライト用内部変数`7`にタイマーを保存
スプライト用内部変数`5``6`にX/Y方向の移動量を保存
初期値としてタイマーは3秒(ETIME:60*3 フレーム)にしている
※グローバル変数を極力使いたくないのでスプライトの内部変数を使っています

移動方向に障害物がある場合避けるようにしたけど少し複雑になったので割愛
(あまり難しいことはしていませんが…)
目的地を決定する場合プレイヤーの向いてる方向の50ドット前方にしたり後方にしたりしても面白いと思います。(三角関数を使えば求めることが出来ます)
簡単にするならプレイヤーの近くを乱数で目的地を決めるのも良いですね
ETIMEの初期値を乱数で変えると敵の癖みたいなものが生まれるので面白い
敵の攻撃はプレイヤーから一定の距離以内に入ると撃ってくるとか(三平方の定理で距離がわかる)


面白そうなシューティングだったのでついサンプルコードを書いてみました。(着弾音が特にお気に入り)
プログラムが長くなってくると頭がコンガラガッてくるので関数化(DEF)して機能毎にまとめてシンプルにしたほうが良いと思います。(少し考え方を変えないといけないけど)

関係ないけどフローチャートは説明する時に便利なので使っていますが、自分でプログラムを組む時に書く必要はありませんよ〜
アバター
オワたず 2019/12/17 23:16 ◆w7BXxYlkW2NJ
ひゃーみなさん本当ありがとうございます!
ちょっともらった意見を自分でやってみて、それでも納得行く物が作れなかったらとりあえずGRSさんのものを写してみたいと思います(
アバター
オワたず 2019/12/18 22:37 ◆w7BXxYlkW2NJ
GRSさん>ごめんなさい、画像のプログラムと説明が合っていない気がするのですが…(敵は動かない、当たり判定の処理はない、ETIMEが機能していない)
自分でなんとかして敵が追いかけてくるようにはなりましたが、ETIMEがよく分かりませんでした…
もしかして、ETIMEって敵が複数になると挙動がおかしくなったりしますか?(DEFがよく分かっていないので)
最新版の公開キー【4KNJRE8D】
アバター
GRS 2019/12/18 23:20 ◆yVrf9Z5Kq57E
SPVAR E_ID,7,SPVAR(E_ID,7)-1 'TIMER進める

SPOFS E_ID OUT EX,EY ' この一行を忘れてました ごめんなさい

INC EX,SPVAR(E-ID,5) ' 敵 少し移動


元のプログラムでは機能満載だったので説明に不向きと思い削った時に削り過ぎししまいました。
申し訳ないです。取り急ぎ修正箇所をお知らせ致します。

敵が複数でも問題ないように作成しているので`E_ID`の番号さえ間違わなければ大丈夫だと思います。
アバター
ツララ 2019/12/19 0:51 ◆ArUdBYOYME1V
ランダムプルプルが嫌なら完全なランダムじゃなくすればいいんじゃないんです?
進みたい方向だけ確率高くするとか。
あと直前に進んだ方向を変数にでも記憶しておいて、それを選択肢から削ることで急にバックもしないようにできますし。

私もあきとさんのルート巡回方式がいいと思いますな。
面白い動きのパターンを思いついた時にデータ文の活用ですぐ具体化できそうですし。
アバター
オワたず 2019/12/20 1:11 ◆w7BXxYlkW2NJ
GRSさん>わざわざありがとうございます
ツララさん>個人的な思いから、ルート巡回はやりたくないんですよね

あと、最終的にこうなりました【D8J23X3】
この方針で作るのがいいか、それとも他の方法を試した方がいいか、迷うんですけども──他の方法の方がいいのかな...
敵が時々めり込むのに関しては、プレイヤーと同様に四隅に当たり判定作れば何とかなるかなと思っているんですがどうでしょう。
アバター
でんぺん 2019/12/20 2:24 ◆HfSy5ayxtyTa
見てみましたー。

めり込みは気にならなかったですが障害物に引っかかって止まっているのが気になる感じもありますね。

複数の動きを条件で切り換えるのがいいんじゃないかと思いますよ。例えばルート巡回でも単純にルート巡回しているだけじゃなくてユーザーが近づいてきたら追跡に切り換える、とかすると見回りをしている敵キャラっぽくなると思います。

先ほどの障害物もきちんと回避したうえで追跡するプログラムとかを書ければその方がよい動きが作れるかもしれませんが、そうじゃなくても例えば障害物にぶつかったら一時的にランダムウォークに切り替えて、しばらく歩けそうなところまで移動してからまた追跡に戻る、とかすればその場で止まってしまうようなことはなくなると思います。まあ動きによってはまた戻ってきて引っかかる(同じことを繰り返す)可能性もありますが…。

ただ一つのアルゴリズムではなく条件によって動きを切り換えるのはAIの定石のような感じですし、色々工夫してみるとより面白い動きができるんじゃないかなって思います。
アバター
オワたず 2019/12/21 23:32 ◆w7BXxYlkW2NJ
焦らず、じっくり考えることにします(いつまで経っても完成しないフラグ)
アバター
オワたず 2019/12/21 23:32 ◆w7BXxYlkW2NJ
本当に皆さん、ありがとうございました
とても感謝しています
アバター
ツララ 2019/12/22 14:23 ◆ArUdBYOYME1V
複数のパラメータ調整で色んな行動パターンを表現できるようなの期待。

個人的な思いってぼかさないで、オワたずさんが考えるルート巡回式のデメリットを挙げてほしいですな。
想定通りの行動パターンを割と簡単に実装できそうなのがメリットとして、あきとさんの意見に便乗しただけですし
私を名指しするなら、あきとさんの名前も挙げないと変じゃないです?

めり込み防止はドット単位で判定するんじゃなくて、キャラ単位の座標系も作って
そっちで判定すればいいんじゃないんです?
アバター
オワたず 2019/12/22 16:23 ◆w7BXxYlkW2NJ
ツララさん>
[私を名指しするなら、あきとさんの名前も挙げないと変じゃないです?]
ツララさんへの返答なので、宛先を書いただけです。名指ししたわけではないので。

[ルート巡回式のデメリットを挙げてほしいですな。]
前はプレイヤーに動きを読まれてヌルゲーになるのを危惧してましたが、他のいろいろなゲームを見てる限り、そうでもなさそうなので今少しそちらの方も検討しています。

[めり込み防止はドット単位で判定するんじゃなくて、キャラ単位の座標系も作ってそっちで判定すればいいんじゃないんです?]
オブジェクトのサイズ(不確定)とキャラクターのサイズ(16*16)でズレが生じるので難しそうです。
.......とこの返答を書いてて思ったんですけど自分の解釈間違ってる気がしてきた。
キャラ単位でって言うのはどう言うことでしょうか
アバター
あきと 2019/12/22 20:17 ◆qGd5dQw2g3a2
飛び火してますが、誰の手伝いとか気にせずに作りたいもの作ってくださいね。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -