Skip to main content

AIの課題(5月12日)

見張りモンスターAIを設計せよ

ねらい

敵は何を見ているのか?
↓
それをどんなフラグにするのか?
↓
フラグによってどの行動を選ぶのか?
↓
それをif文にするとどうなるのか?

課題タイトル

「お宝を守るモンスターを設計しよう」


シチュエーション

あなたはダンジョンゲームの敵AIを作ることになった。

モンスターは部屋の中にある宝箱を守っている。

プレイヤーは部屋に侵入して、宝箱を開けようとする。

モンスターは状況に応じて行動を変える。


モンスターの基本行動

使ってよい行動は以下。

Idle       その場で待つ
Patrol     決められた範囲を歩く
Chase      プレイヤーを追いかける
Attack     プレイヤーを攻撃する
Return     持ち場に戻る
Guard      宝箱の前に立つ
Search     プレイヤーを探す

使ってよいフラグ

最初はこれだけ与えるとよいです。

bool isFindPlayer;       // プレイヤーを見つけた
bool isNearPlayer;       // プレイヤーが近い
bool isAttackRange;      // 攻撃範囲にいる
bool isPlayerNearTreasure; // プレイヤーが宝箱に近い
bool isFarFromHome;      // 持ち場から離れすぎた
bool isLostPlayer;       // プレイヤーを見失った

考えること!

1. どの行動を優先するか

例えば、

攻撃できるなら攻撃
宝箱に近づいたら追い払う
見つけたら追跡
見失ったら探す
遠くまで行きすぎたら戻る
普段は巡回

この優先順位を考える。


2. if文に直す

最終的にこういう形にする。

if (isAttackRange)
{
    Attack();
}
else if (isPlayerNearTreasure)
{
    Chase();
}
else if (isFindPlayer)
{
    Chase();
}
else if (isLostPlayer)
{
    Search();
}
else if (isFarFromHome)
{
    Return();
}
else
{
    Patrol();
}

自習の進め方

0〜10分

課題説明を読む

配布資料に以下を載せる。

あなたはゲームAI担当です。
宝箱を守るモンスターの行動ルールを設計してください。

考えるゴールは、

フラグ
↓
条件分岐
↓
行動

です。


10〜25分

ゲーム内状況を洗い出す

問い

モンスターが判断に使いそうな情報は何か?

例:

プレイヤーとの距離
プレイヤーの方向
宝箱との距離
自分の持ち場からの距離
HP
プレイヤーを見失った時間

25〜40分

フラグを作る

洗い出した情報を bool に変換する。

例:

プレイヤーとの距離が近い
↓
isNearPlayer

攻撃できる距離にいる
↓
isAttackRange

宝箱に近づいている
↓
isPlayerNearTreasure

40〜55分

行動の優先順位を決める

ここが面白いところです。

行動パターンでモンスター(AI)の性格が変わる。

例1:短気なモンスター

攻撃
追跡
探索
巡回

例2:宝箱優先モンスター

宝箱防衛
攻撃
追跡
持ち場に戻る
巡回

例3:臆病なモンスター

宝箱防衛
攻撃
追跡
持ち場に戻る
巡回

55〜70分

if文にする

疑似コードで書いてみる

if (__________)
{
    __________();
}
else if (__________)
{
    __________();
}
else
{
    __________();
}