投稿
むゆー muyu-pon
質問です。 STGや格ゲー等の敵に、動き(AI?)をさせるようにしたいのですが、どこから始めれば良いのか分かりません…。具体的にどのようなプログラムにすれば良いのか教えて下さい!よろしくお願いします!
2そうだね
プレイ済み
返信[1]
親投稿
じてんしゃ kyabetu716
相手との距離から、近距離なら攻撃とかガードやらで、遠距離なら飛び道具やダッシュで近づくなどの行動をとらせればいいと思います。作ったことないけど。
1そうだね
プレイ済み
返信[2]
親投稿
むゆー muyu-pon
条件によって分岐させるって事ですね! IF文で飛ばすラベルを変えれば…イケル! とりあえずやってみます。じてんしゃさんコメントありがとうございました!
0そうだね
プレイ済み
返信[3]
親投稿
けい kei0baisoku
もしかしたら作ってるものと少し違うかもしれませんが一応。 人が動かす場合は「キー操作」が入力になっていると思います。 格ゲーでCPUに操作させる場合は、じてんしゃさんが書いてるようにif文で判断した後、「CPUのキー操作」だけを決めます。 そうしたら後は、動かしてるのが人かCPUかに関係なく、キー入力をキャラの制御処理に渡せばオッケーになります。 (人かCPUかで分ける必要がなくなります)
1そうだね
プレイ済み
返信[4]
親投稿
むゆー muyu-pon
ヤッタァァァ!できました! とりあえず今は 1.座標や確率によって分岐 2.それに応じた変数を入れる(ボタン) 3.ボタンに応じた動き という感じです!これだと色々改造するのも簡単そうなので今はこれでやってみます!お二人とも回答ありがとうございました!
1そうだね
プレイ済み
返信[5]
親投稿
むゆー muyu-pon
すいません…。お二人に追加で質問よろしいでしょうか。 けいさんの方法でやってはみたのですが、この方法の場合、「相手のボタンが離された瞬間」を取得するにはどうすれば良いのでしょうか?もしよろしければ答えてくれるとありがたいです。
0そうだね
プレイ済み
返信[6]
親投稿
けい kei0baisoku
あ、なるほど。 BUTTON()関数の中を自分で作る感じになると思います。(ビットを知らないとちょっと難しく見えるかも) B0'前のフレームの押してたか状態 B1'今のフレームの押してるか状態 DIM BCNT[10]'各ボタンを連続で押しっぱなしのカウンタ ↓ CPUのBUTTON(2)… (NOT B0)AND(B1) CPUのBUTTON(3)…(B0)AND(NOT B1) 省略しますが、リピート付きのBUTTON(1)はカウンタを利用します。 具体的にはこうなりますが、分かりますでしょうか?
0そうだね
プレイ済み
返信[7]
親投稿
じてんしゃ kyabetu716
IF N==2 AND N2!=0 THEN N=0 IF N==0 AND N2==0 THEN N=1 この間にメインプログラム。 IF N==1 THEN N=2 N2は相手のキー入力変数。 Nが1の時が離された瞬間になる...はず。
0そうだね
プレイ済み
返信[8]
親投稿
むゆー muyu-pon
うむむ……難しい…。 できればその時離されたボタンの種類が分かるようにしたいのですが、お二人のどの方法でやると良いのでしょうか?
0そうだね
プレイ済み
返信[9]
親投稿
じてんしゃ kyabetu716
自分がやると、汚くて長いプログラムができるので、けいさん任せた!(人任せ
1そうだね
プレイ済み
返信[10]
親投稿
むゆー muyu-pon
あ、別の方法で解決出来そうな気がしてきました。なので……更に更に質問です(えー)。 前のフレームの変数を保存しとくにはどのような方法がありますか? …できるだけ簡単な方法で…(ボソッ)
0そうだね
プレイ済み
返信[11]
親投稿
じてんしゃ kyabetu716
他の変数に移し替えるのはダメなん?
0そうだね
プレイ済み
返信[12]
親投稿
むゆー muyu-pon
どういうこっちゃ
0そうだね
プレイ済み
返信[13]
親投稿
けい kei0baisoku
いないうちに任されちゃったw >むゆーさん こういうことです。 WHI 1 'メインループ B0=B1 B1=BUTTON() : WEND これで、B0には常に前のフレームの値が入ってます。
0そうだね
プレイ済み
返信[14]
親投稿
けい kei0baisoku
あ、↑はもちろんユーザ操作のキーの場合です。 CPUとか他の情報も考え方は同じです。 ちなみに、私の例はBUTTON()関数と同じを想定してますので、どのボタンが離されたかの判定方法も同じです。 CPUHA=(B0)AND(NOT B1) IF CPUHA AND 16 THEN CPUがAを離した
0そうだね
プレイ済み
返信[15]
親投稿
むゆー muyu-pon
はいはーい。質問でーす (B0)AND(NOT B1) これどういう意味ですかー?
0そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
大事だけど難しい所の質問キタ!(°Д°) 余裕があったら後で説明してみますが、期待はしないでください…(´Д`) ちなみにビットと、ビット演算は分かりますか? ANDでどうなるとか、NOTでどうなるとか。 BUTTON()命令の値がどうなってるとか。
0そうだね
プレイ済み
返信[17]
親投稿
むゆー muyu-pon
うーん… 2進数に直して、 NOTなら1と0を全部ひっくり返して ANDなら2つの数を比べて共通して1のあるところは1、ないところ0… みたいな感じですよね…? でもプログラムでちゃんと考えて使うことはあんまりないです。
1そうだね
プレイ済み
返信[18]
親投稿
けい kei0baisoku
オッケー、基礎知識は大丈夫そうですね(^O^) ここから解説。 まず大前提として、目的は「相手のボタンを離した瞬間が分かるようにする」です。 また、AIのプログラムで相手のBUTTON(0)にあたる値は毎フレーム出して保存してます。 1つ前のフレームのBUTTON(0)の値も保存してます。 B0=前のフレームの値 B1=今のフレームの値 とします。 はい、準備はここまで。
0そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
で、知りたいのは「相手がボタンを離した瞬間か?」です。 離した瞬間というのは言い換えれば、「1つ前のフレームでは押していて、今のフレームでは押してない」です。 さて、B0は1つ前のフレームのBUTTON(0)なので、B0のビットは1になっているのが条件になります。 また、B1は今のフレームなので、0になっているのが条件になります。 だから、例えば一番下のビットだけをif文で判定するならこうなりますね。 IF (B0 AND 1)==1 && (B1 AND 1)==0 THEN
0そうだね
プレイ済み
返信[20]
親投稿
けい kei0baisoku
こんな感じでボタン1つ1つ判定すればこのままでもいけなくはないですが、めんどくさいです(´з`) 「離した瞬間のボタンだけビットが1になっている変数」を用意できれば、とても楽になります。 (つまりBUTTON(3)に相当する値ですね) ここで、ビット演算を利用します。 もう一度、B0は前のフレームの値なので、ビットが1であるのが条件です。そしてB1はビットが0であるのが条件です。 「両方1のビット」を判定するならこのままANDを使えばいいのですが、B1は「0のビット」の時なのでそのままは使えません。 そのままは使えませんが………B1のビットが全部、0と1が逆になってくれたら使えます。 ここでNOTです。 CPUが今離したボタンのビットが1になっている値=B0 AND B1のビットの01を逆にしたもの ↓ CPUHA=(B0) AND (NOT B1)
0そうだね
プレイ済み
返信[21]
親投稿
けい kei0baisoku
以上です。 文章ばっかりになりましたが、伝わりましたでしょうか?(´з`) 核の部分は、慣れないと思い付かないパズルみたいなやり方だと思います。 ビットの利用は慣れとかによるところが大きいので、他の人のやり方で便利そうなのがあればどんどんパクるのがいいと思います(^O^)/
0そうだね
プレイ済み
返信[22]
親投稿
むゆー muyu-pon
細かい説明ありがとうございます…! とりあえずわかった気がする。 …と思っていたんですが、いざ自分のプログラムに使ってみると上手くいきませんね…どうしてでしょうか?…少し考えてみます。
1そうだね
プレイ済み
返信[23]
親投稿
けい kei0baisoku
理屈は分かったけれど結果が思ったように行かないときは、途中計算のどこかが具体的に間違えてるはずですので、簡単な入力で途中の値をいろいろプリントして確かめると早いと思います。 頑張って!(^O^)
1そうだね
プレイ済み
返信[24]
親投稿
むゆー muyu-pon
できましたー! どうやら関数でいうBUTTON(0)のところで変数を入れる方法が誤っていたようです。 けいさん、じてんしゃさんわざわざ丁寧に教えてくれてありがとうございました!これからも活用させて頂きます。
1そうだね
プレイ済み