はじプロにおけるアルゴリズムとシーケンス制御


## ０.はじめに

この記事は筆者が個人的に勝手に思っていたり解釈している事を軸に書かれてます

ですので、あくまで個人的な思考で書かれておりますので、その辺りはご容赦下さい





## １.自動化のきっかけ


今回は、はじプロというビジュアル言語で制作するアルゴリズムとシーケンス制御について思っていることを話したいと思います

そもそも、自分がプログラムに興味を持ったきっかけは、子供の頃、ACTで敵キャラもプレイヤーのように考えて動けないものか
というところから始まっています


まあ、大昔の話です


その後、MDやSFCが主流になり、ストⅡでCPUと対戦みたいなのが主流になってゆくのですが、いまだに僕の心に大きな影響を残しているのが、MDで発売されていた、テクノソフトのヘルツォーク・ツヴァイというゲームです

今でいうところのリアルタイムストラテジーなのですが(当時はストラテジーという言葉が一般的でなかった)、シミュレーションとアクションを足したようなゲーム性は、少なからずともプレイする人を選び、知名度や人気度で言えば、低くはないですが、それほど高いものでもなかったと思います



このゲームは、自分が子供の頃思っていたゲームと全く同じで、初めて見たときは衝撃を受けました



ざっくり説明すると、ロボット↔戦闘機と変形する自機があるACTでありながら、自軍のユニットを大量生産して、進軍するリアルタイムシミュレーション(ストラテジー)でした

リアルタイムなので、敵軍のユニットと自軍のユニットが弾を打ち合って進軍してゆく様や、ACTでもあるので、そこに自機を参戦させてプレイヤーがユニットの援護をしたりと、まるでその世界に自分が入り込んだような感覚でした






## ２.条件の言語化


さて、今回のお題でもあるアルゴリズムとシーケンス制御

はじプロでこういったある程度自動で動いてくれるユニットを制作する上で、これらは絶対に外せないモノだと思っています
(個人的にですが)




この手の、動きを自動で行うキャラクタを制作、あるいは制御するとき、あなたなら、どこから着手するでしょうか？



試しに、ヘルツォークツヴァイのような敵陣に進軍しながら戦闘を行うユニットを仮定して分析してみます




まず、このユニットが最低限しなければならない事を言語化していきます


敵陣へ向かう為の手段
①移動能力
敵と交戦する為の手段
②戦闘能力


この２つの能力をいつ使うかを分析します

①の移動能力を使う条件
②の戦闘能力を使う条件

これらを言語化し、かつ、その言語化された中で、この２つを使用する際の矛盾点を洗い出す事が、制作、制御する上での最短の道と思っています

ここをはっきりさせないままプログラミングに着手すると、おそらく地獄のようなデバッグが待っているハズです



では、手始めに行動分析を始めます

最初、自陣を出発したユニットは、当然自陣近くにおり、敵陣からは離れてます

なので、敵陣の座標に向かわなければなりません

ここはとりあえず、敵陣の座標に向かわせるだけです

これが、①の移動能力を使う条件１となります
(敵陣にたどり着いたかの判定)



次に、移動中に敵ユニットに遭遇した場合、戦闘してこれを排除しなければなりません


では、敵の座標に向かって弾を撃てばいいのでしょうか？


例えば、ゲームが始まった瞬間は、自軍のユニットは自軍近くにいます
これは敵にも言えることです

単に、敵の座標に向かって弾を撃つだけのプログラムだと、敵陣にいるユニットと自陣にいるユニットが、何kmあるいは何十kmも離れた状態でいきなり弾を撃ち合ってしまいます

まあ、あまり自然な感じはしませんし、恐らく弾も当たりません

そういうゲームだ！と言うことにする！というのであれば構いませんが、ここは”遭遇”という概念をゲームに導入することとします

これが、②の戦闘能力を使う条件１となりますが、ここで注意しないとヌマる事項があります

自動化において、とても重要なことです

通常のACTゲームと違うのは、CPUが扱うユニットが攻撃対象とするのが、プレイヤーだけ、あるいは敵性ユニット一機だけでない

というところです

ここが通常のACTやSTGと大きく異なるところです

つまり、攻撃対象の探索を行わなければならない、ということです

通常のゲームなら、プレイヤーの座標だけを考えてアルゴリズムを組めば良いのですが、攻撃目標を取捨選択しなければなりません

加えて、遭遇という概念を導入してます

遭遇とはいったい何なのでしょうか

自分の中ではひとつ、距離というものがあります

遭遇とは、双方、あるいは一方が、相手を発見、認知した状態です


特に人間は、視野が目標発見の重要な示唆となりますが、ゲームという世界は、それらが全て制作者のプログラムに委ねられます。

自分の場合、大体、ユニット同士の距離を持って、遭遇したか、しないかを決めています

距離を図る対象は…、全ての敵です！

そして、最も近く、かつ、設定した距離範囲内に入っている敵のみを攻撃対象とします

仮に、距離が全く同じだった場合、通常はプログラム上、先に処理された方が優先となったり、リアルタイム処理なので何フレームも距離が同数のままっていうのもなさそうなので、あまり深く考えなくても良いかと思ってます
(あえて同数で処理を入れるのも、複雑にはなりますが有りかと思います)

これが、②の戦闘能力を使う条件１となります
(全敵の中で、一番距離が近く、かつ、設定距離内のキャラ)


これだけで、かなり複雑になってきましたが、おおよそ、ここを理解していれば残りは大体だいじょうぶです

さて、アルゴリズム及びシーケンス制御化です

アルゴリズムとシーケンス制御は非常によく似てます

どちらも、プログラム制御の事です

ざっくりいうと、アルゴリズムとは、現在の状況をyes及びnoで選択していって処理を決めてゆくみたいな感じの事です


シーケンス制御とは、Aボタンを押したら〇〇し、〇〇が完了したら△△して〜…みたいな制御の事です

そもそもシーケンス制御とは、機械制御に使われているもので、一見するとあまりゲームプログラミングには関係なさそうな気がします

しかし、個人的にではありますが、はじプロというビジュアルプログラミングと物理エンジンという２つの枠組みの中において、この２つは非常に似通いつつ、かつ、それぞれに重要な役割があるのでは？と思っています





## ３.シーケンスを組む

シーケンスとはなんぞや…、簡単です
はじプロならではの制御です

例えば、触ってるセンサーを用いて、センサーに反応があれば、反応で拾った数値を信号としてモノ発射に送り、弾を撃つ

ただこれだけです

簡単じゃん！って思った方！、そう簡単です

本当は、もう少し複雑になるのですが、考え方として、例えば、製造ラインにおけるベルトコンベヤで、品物が流れてきた場合、赤外線センサーが品物を検知して信号がオンしたら、その信号をインクジェットプリンターに送り、インクジェットプリンタが印字するみたいな事と全く同じです

ちなみに、ここでいうインクジェットプリンターとは、家庭用のプリンタのことではなく、圧力でインクをドット化して吹き飛ばし、印刷する工業用非接触型プリンタのことです

ペットボトルや缶ジュースの賞味期間などに使われています
よく、点の塊で文字や数字が書いてあるアレですｗ

![20230102_121540~3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952859/d7a932d8-ee61-185e-04d2-152b6181f900.jpeg)



ちょっと話がズレましたが、おおよそそんな感じのイメージです

これは、はじプロが基本的に物理演算エンジンを持っており、ある程度、はじプロの物理世界の中で処理できる事項にのみ対応できます

簡単に言うと、現実世界のセンサーと同じ条件で使えるという事です




## ４.アルゴリズムを組む

一方で、センサーの使えない場面があります

全敵との距離測定などです

同じくセンサーが使えれば問題ないのですが、あいにくセンサー自体に個別判定する機能はありません
これは現実世界とも同じですが…

ですので、ここは個別に不等号記号を使ってそれぞれの敵の距離を比較、より近い距離にいる敵を取捨選択していきます

それで残った敵の距離を、遭遇として設定している距離より近いかどうかの判定をします

ここは、ソートプログラムなどと同等のプログラムになりますので、いわゆるアルゴリズム的な作りになるかと思われます
計算で座標なりルートなりと使わなければならないと思います

はじプロにおいてのユニット自動化は、特にこの二種類の計算方法を使いこなす事が一番ベストなのかなと思っております






記事としては以上になりますが、なぜこのネタを記事化したのかというと、察してる方もいると思いますが、自分の作るゲームは総じてユニットが自己判断して動くものが多いです

紹介させてもらうと




### 第９惑星を守れ(３ファイル)
プレイヤーがエイリアンから太陽系前線基地である第９惑星を守るゲームで、３機の敵の攻撃対象が、自機か護衛対象の第９惑星かを、条件によって変わる仕組みを搭載してます



### アンリッシュド.レーサー(３ファイル)
レースゲームで、２台のライバルマシンが道なき道を障害物を回避しながら疾走します



### おめくり☆ウォーズ(１ファイル)
４VS４のリアルタイムストラテジーで、各ユニットが自動で敵を撃破したり目標地点を陣取ったりする中、プレイヤーもユニットの一つとして操作します



### スターフォックスGBG(４ファイル)
フォックスチームの４人で２VS２に別れて戦闘訓練をします
単に撃ち合うだけでなく、自機が被弾したらチームメイトが援護に来たり、自機が適性キャラを攻撃すると、敵の相方に追っかけられたりします






思い浮かぶだけでこれだけありますが、
興味があれば、プログラミングが参考にならずとも動きなどだけでも見て貰えれば幸いです

また、今作ってる戦車ゲームも敵が自動で動きますのでお楽しみにしていてください

まあ、自動で動くのが楽しいのは作り手だけなのですがｗ

あと、これらは単にアルゴリズムだけでなく、センサー等も駆使して容量減に努めています


記事としては以上以下もない他愛もないものですが、
もし、はじプロでの制作にお役に立つことがあればと思い記事にしました

最後に超遅くなりましたが、なんとか完成してよかったです
最後までご覧いただき誠にありがとうございました