『吾輩は猫である』の書生から猫を逃がすフローチャート｜文章題で身に付くプログラミング思考入門️（12/25）

## はじめに

この記事は、以下の前提で進行しています。
- 35度以上のお湯が存在しない優しい世界です
- 猫を「食う」という表現は全て、猫を「吸う」という意味で捉えています
  - 言葉を置き換えても良かったのですが、原作への敬意も込めてそのまま使わせて頂いてます

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は、フローチャートについて考えていきます。

## これまでのまとめ

https://qiita.com/advent-calendar/2024/thewaggle

## 対象者
- プログラミングの考え方を学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 概要

次の文章は、[夏目漱石著『吾輩は猫である』](https://www.aozora.gr.jp/cards/000148/files/789_14547.html)の一節です。
> この書生というのは時々我々を捕えて煮て食うという話である。

ということで、お風呂に入れたがり・猫吸いしたがりの書生（`はじめに`を参照のこと）からネコチャンを逃がすゲームの流れを作ってみたいと思います。

さて、以下記事にて猫と書生の行動を洗い出しました。

https://qiita.com/yuki_thewaggle/items/70ee14ef1f2fb18f5399

こちらを利用して猫と書生のバトルを作っていきましょう。

```
【猫：データ】
名前：吾輩猫
一人称：吾輩
生まれ：見当がつかない場所
鳴き声：ニャーニャー

【猫：行動】
- 泣く
- 記憶する（泣いていた事）
- 見る（人間を）
- 聞く（書生という人間であった／書生は猫を食う）
- 思う（恐ろしいと）


【書生：データ】
名前：初エンカ書生

【書生：行動】
- 捕える（猫を）
- 煮る（猫を）
- 食う（猫を）
```

こうして見てみると、猫の行動があまりに無力ですね。
猫を強化していきましょう。

猫が鳴くと可愛いので破壊力があります。書生の心を破壊できそうです。「泣く」は攻撃として残し、それ以外は全て削除しましょう。
シンプルに考えるためです。

```
【猫：データ】
名前：吾輩猫
鳴き声：ニャーニャー

【猫：行動】
- 泣く

【書生：データ】
名前：初エンカ書生

【書生：行動】
- 捕える（猫を）
- 煮る（猫を）
- 食う（猫を）
```

これは書生と猫のバトルですから、ゲームのルールが必要です。
どんなルールにしましょうか？

そうですね、今回は
**書生が「捕える」→「煮る」→「食う」と行動する中で、猫は「泣く」ことによって書生を攻撃して倒して逃げる**
というルールにしましょう。

まず、書生の行動が大きな流れとなりますから、そこの部分を図にしてみます。
簡単なフローチャートです。
フローチャートとは、流れ図のことです。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147743/5d25a144-3fcc-85da-8b94-0915881d0a63.png">

さて、あまりに理不尽な流れ図ができました。
このままでは猫が抵抗できず、お風呂に入れられ、吸われてしまいます。

ということで、猫のターンを追加していきたいのですが、その前に、バトルのルールを整理しましょう。
猫の攻撃によって書生を倒すことができたらハッピーエンドとしましょうか。
猫は泣き声によって書生の心を破壊するので、書生の心の数値化が必要ですね。
書生にはMPを持たせましょう。

そして、バトルといえばターン制が一般的かなと思いますので、書生と猫は1回ずつ交代で行動するようにしましょうか。

整理します。

- バトル終了条件
    - 猫が食われたら、書生の勝ち（デッドエンド）
    - 書生のMPが0になったら、猫の勝ち（ハッピーエンド）
- バトル進行の流れ
    - 書生と猫は交代で行動する

では、一つずつ要素を足していきましょう。
まずは、ハッピーエンドを作りましょうか。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147743/6b2cd13d-a7b9-a420-057a-3f9f0d242ef0.png">

次に、ハッピーエンドに到達する流れを作っていきましょう。

- 書生が行動したら、次は強制的に猫の行動に移ります。
- 猫は「泣く」ことだけできます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147743/382fe77d-4d8f-f25d-3940-7e6deb1c5d10.png">

こうなります。

そして、猫が泣くことによって、
- 書生のMPが0以下になったら、ハッピーエンドへ移る
- そうでなければ、次の書生の行動へ移る

わけですね。
ということは、猫が泣いた後は毎回、書生のMPが0以下になったかどうかをチェックする必要があります。条件分岐ですね。

これを図に追加すると、

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147743/c3d05451-fc7f-5d83-2967-d73088f9a813.png">

こうなります。ちょっと見にくいですね。
見やすいように要素を移動してみましょうか。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147743/9fb694a7-f35c-ad06-1f6f-617a8977aa01.png">

ちょっと見やすくなりましたかね？
縦軸で見てみると、以下のように区分けできます。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147743/4c716562-f04f-bfd0-8fc2-a0522854087f.png">

- 書生は、「捕える」→「煮る」→「食う」とステータスが変わる
- ゲームマスターは書生のMPとステータスをチェックし、バトル終了を判断する
- 猫はひたすら泣く

と役割分担させることができますね。
もちろんこの流れ図が正解というわけではなく、もっと上手いやり方もあると思います。
どのようにしたらもっと良い仕組みになるでしょうか？
ぜひ試してみてください。

なお、この流れ図は [miro](https://miro.com/ja/) を使って作成しました。
無料でも使える便利なツールなので、よかったら試してみてください。
ただし、無料だと非公開モードが選択できないなどのデメリットもあります。
**ツールを利用する前にしっかり仕様を読み、メリットとデメリットを把握してから使うようにしましょう。**

miroの料金プラン別仕様は [こちら](https://miro.com/ja/pricing/)

### 発展
さらに、猫に「泣く」以外の行動を取らせることができたら、どのように流れ図が変化するでしょうか？
また、その際には、猫の行動を選択するための分岐が必要になります。
例えば、書生・ゲームマスター・猫以外に、プレイヤーという役割分担が発生し、プレイヤーが猫の行動を選択することになるかもしれませんね。

### きっちり役割分担をし、独立した部品作りを心がけると、システムの拡張性は高まります。

次回は、デバッグ思考について考えていこうと思います。

## まとめ
- 順を追って、少しずつ流れ図を作っていきました。
- きっちり役割分担をし、独立した部品作りを心がけると、システムの拡張性は高まります。

## 最後に
ここまで読んでくださってありがとうございます！
少しでも役に立ったら「いいね」をください。続ける励みになります。
原作の言葉をそのまま使おうとしてこの形になったのですが、いっそのこと「書生が猫をお風呂に入れる」「書生が猫を吸う」に変えちゃった方が良かったかもしれません。アドバイスください。