# AIの課題（５月１２日）

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

### ねらい

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

---

## 課題タイトル

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

---

## シチュエーション

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

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

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

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

---

## モンスターの基本行動

使ってよい行動は以下。

```c++
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分

## フラグを作る

<span style="white-space: pre-wrap;">洗い出した情報を </span>`<span class="editor-theme-code">bool</span>`<span style="white-space: pre-wrap;"> に変換する。</span>

例：

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

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

宝箱に近づいている
↓
isPlayerNearTreasure
```

---

## 40〜55分

## 行動の優先順位を決める

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

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

### 例1：短気なモンスター

```
攻撃
追跡
探索
巡回
```

### 例2：宝箱優先モンスター

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

### 例3：臆病なモンスター

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

---

## 55〜70分

## if文にする

疑似コードで書いてみる

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