
AIと作る「嫌がらせアイテム」

前回は、ブロックの通路を自動配置するシステムを作った。
今回は、待っている間に相手に嫌がらせするアイテムを作ってみる。
ローグライクなテニスゲームを目標にするなら、ブロックを破壊したらランダムでアイテム出てくるってのは必須でしょ。
アドバイザーのAIはCopilotさん
嫌がらせアイテム
相手が自陣でブロック崩しをしている間、片方は待ってるだけなので、嫌がらせアイテムとパワーアップアイテムを確率で出してみる。
ブロックを破壊したらアイテムを出すのは、ブロック崩しでやっているが、一応、AIに聞いてみる。
ブロックを破壊したらアイテムを発生させるプログラムを教えて
ブロック破壊時の処理:
ブロックオブジェクトが破壊された時に、ランダムにアイテムを生成します。
このコードでは、ブロックがマウスクリックで破壊された時に50%の確率でobj_itemを生成します。obj_itemは、obj_blockが破壊された位置に生成されます。
// 破壊イベント (例えば、マウスクリックで破壊する場合)
if (mouse_check_button_pressed(mb_left)) {
instance_destroy();
// アイテムの生成
if (irandom(1) == 0) { // 50%の確率でアイテムを生成
instance_create_layer(x, y, "Instances", obj_item);
}
}
はいはい。同じですね。
確率で出す出さないを決めた上で、負けてる側に有利なアイテムが出る可能性を高め、嫌がらせアイテム系を出す確率を高くするようにしよう。
アイテムの種類
有利アイテム
・ボールスピードDown
・巨大化
嫌がらせアイテム
・ボールスピードUP
・敵の移動スピードDown
・敵を小さくする
・ボールを小さくする
アイテム画像を作る

記号化は重要
形の記号化 「バーは四角」「ボールは丸」
・プレイヤーやCPUキャラなどのバーに作用するものは四角
・ボールに作用するものは丸にしている
色の記号化 「巨大化は橙」「SLOWは黄」「Smallは緑」「青は加速」
・効果は色で分けていてオレンジは巨大化
・SLOWは黄色
・Smallは緑
・青がスピードUP
※分かりやすくするためには記号化が重要
アイテムを出現
アイテムをオブジェ化して壁が壊れたら出現するようにしたのがこちら。
アイテムは3分の2で出現。負けている方に高確率で出るようにした。

アイテム効果のコードを書く
「巨大化」「ボールスロー」「ボールスピードUP」「敵をスロー」「敵をスモール」「ボールスモール」6種類の効果を作った。
コードは簡単。拡大縮小は「image_xscale, image_yscale」、速度は「speed」この2種類の対象を変えるだけで6種類を作ることができる。
alarmの問題発生
時間制限があるものは、alarmをobj_itemに設定したがうまくいかん。
obj_itemは取った瞬間なくなるのに、alarmを設定したのが問題だった。
バフがかかるオブジェクトにalarmを設定して問題解決。ややこしい。
AIが動かない問題発生をAIに相談
AIがアイテムを取りに行くコードを書いたら「アイテムのインスタンスが存在しません」というエラー発生。Copilotさんに聞いてみる。
インスタンスが存在するかどうかを確認するコードを教えてください
特定のオブジェクトタイプのインスタンスが存在するかどうかチェックする場合は、以下のコードを使ってください。
if (instance_exists(obj_block)) {
// obj_blockタイプのインスタンスが存在する場合の処理
}
Copilotさんはいくつかの方法を提案してくれたが、今回は、オブジェクトを使った方法で作った。

gifアニメでは、時間が短くてすんまそん。
恒例のガッチャンコ

相手が自陣でブロック崩ししてボールが回ってこない間も、アイテムを待ってるから、緊張感は出てきた。
ローグライクなブロック崩しアクションへの道
次は、ローグライクなダンジョンで繰り広げるブロック崩しを作ってみようと思う。
ローグライクなブロック崩しアクション
1.自由に動き回って、タメ撃ちでボールを発射して敵や壁を壊す
2.プレイヤーに向かってくるザコ敵
3.ザコをぶっ飛ばしてボールにできるようにする
4.ボスの発射する弾も打ち返せる
5.ローグライクな広いダンジョンで戦う
6.トルネコみたいに強い武器やアイテムを取ってくる感じにしよう。
いつまはガッチリ思考実験をしてから仕様を固めて作ってもらうのだが、今回は自分で作るので、あえて作りながら考えるという感じでやってみる。
エンカウント方式にしてブロックテニスになるとかでもいいな。
「創造>破壊>再構築>実証>結果を楽しむ」というループは1人で作ると以外に楽だな。モッククオリティで良いし。
タスクも書きながら作ってるけど、自分にだけ分かればいいからしようというよりはメモで良いし。