# 条件分岐

## 練習課題

[記入できるファイルをダウンロード](https://class.illogic.games/attachments/8)

### C#の処理を完成してみましょう

1\. 以下のC#のプログラムを完成してください

```c#
// ゲームでダメージを受け、残機を確認し、ゲームオーバーかどかう判定する

int hp = 50; // 体力
int lives = 1; // 残機
int damage = 100; // ダメージ

// ダメージを受け、体力を減らす

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

// もし、体力が０以下だったら...

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
{
    // 残機を一つ減らす

    ＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
}

// もし、残機がゼロだったら

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
{
    Debug.Log("ゲームオーバー");
}

// そうじゃない場合は、残機を表示
else
{
    Debug.Log($"残機：{lives}");
}
```

<details id="bkmrk-%E7%AD%94%E3%81%88-%2F%2F-%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%A7%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E5%8F%97%E3%81%91%E3%80%81%E6%AE%8B%E6%A9%9F"><summary>答え</summary>

```c#
// ゲームでダメージを受け、残機を確認し、ゲームオーバーかどかう判定する

int hp = 50; // 体力
int lives = 1; // 残機
int damage = 100; // ダメージ

// ダメージを受け、体力を減らす
hp -= damage; // または hp = hp - damage;

// もし、体力が０以下だったら...
if (hp <= 0)
{
    // 残機を一つ減らす
    lives--;
}

// もし、残機がゼロだったら
if (lives == 0)
{
    Debug.Log("ゲームオーバー");
}

// そうじゃない場合は、残機を表示
else
{
    Debug.Log($"残機：{lives}");
}
```

</details>このプログラムはコンソールで何を表示するか？その出力を書いてください：

<table border="1" id="bkmrk-" style="border-collapse: collapse; width: 100%; height: 87.8px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 87.8px;"><td style="height: 87.8px;"><details><summary>答え</summary>

ゲームオーバー

</details></td></tr></tbody></table>

---

2\. 以下のC#のプログラムを完成してください

```c#
// レースゲームで、チェックポイントを通過することにより、時間切れを延期する

float timeLeft = 8.51; // 残りの時間（秒数）
float raceDistance = 3643.43; //走行距離

float checkPoint01 = 2300; // スタート → チェックポイント1の距離
float checkPoint02 = 1500; //  チェックポイント1 → チェックポイント2距離
float goalPoint = 2500; // チェックポイント2 → ゴールまでの距離

// もし、ゴールを超えていたら...

_____________________________________________________
{
    Debug.Log("レース終了！");
}

// 一方、もし走行距離がチェックポイント２を超えたら...

_____________________________________________________
{
    Debug.Log("チェックポイント２通過！");
    timeLeft += 80;
}

// 一方、もし走行距離がチェックポイント１を超えたら...

_____________________________________________________
{
    Debug.Log("チェックポイント1通過！");
    timeLeft += 60;
}

// 残りの時間を表示
Debug.Log($"残りの時間：{timeLeft}");
```

<details id="bkmrk-%E7%AD%94%E3%81%88-%2F%2F-%E3%83%AC%E3%83%BC%E3%82%B9%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%A7%E3%80%81%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9D%E3%82%A4"><summary>答え</summary>

```c#
// レースゲームで、チェックポイントを通過することにより、時間切れを延期する

float timeLeft = 8.51; // 残りの時間（秒数）
float raceDistance = 3643.43; //走行距離

float checkPoint01 = 2300; // スタート → チェックポイント1の距離
float checkPoint02 = 1500; //  チェックポイント1 → チェックポイント2距離
float goalPoint = 2500; // チェックポイント2 → ゴールまでの距離

// もし、ゴールを超えていたら...
if (raceDistance >= checkPoint01 + checkPoint02 + goalPoint)
{
    Debug.Log("レース終了！");
}

// 一方、もし走行距離がチェックポイント２を超えたら...
else if (raceDistance >= checkPoint01 + checkPoint02)
{
    Debug.Log("チェックポイント２通過！");
    timeLeft += 80;
}

// 一方、もし走行距離がチェックポイント１を超えたら...
else if (raceDistance >= checkPoint01)
{
    Debug.Log("チェックポイント1通過！");
    timeLeft += 60;
}

// 残りの時間を表示
Debug.Log($"残りの時間：{timeLeft}");
```

</details>このプログラムはコンソールで何を表示するか？その出力を書いてください：

<table border="1" id="bkmrk--2" style="border-collapse: collapse; width: 100%; height: 87.8px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 87.8px;"><td style="height: 87.8px;"><details><summary>答え</summary>

チェックポイント１通過！

残りの時間：68.51

</details></td></tr></tbody></table>

### Unityで練習

体重と身長でBMIを計算し、画面で適切な出力を表示しよう（参考：[ＢＭＩと適正体重 ](https://keisan.casio.jp/exec/system/1161228732)）

<table border="1" id="bkmrk-%E5%BC%8F%EF%BC%9Abmi-%EF%BC%9D-%E4%BD%93%E9%87%8Dkg-%C3%B7-%28%E8%BA%AB%E9%95%B7m%29" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 30.5952%;"></col><col style="width: 69.4048%;"></col></colgroup><tbody><tr><td style="border-width: 0px;"><sup>![BMI Table](https://class.illogic.games/uploads/images/gallery/2026-03/scaled-1680-/2026-03-23-172118.png)</sup></td><td style="border-width: 0px;">式：BMI ＝ 体重kg ÷ (身長m)<sup>2</sup></td></tr></tbody></table>

ヒント：

- 体重と慎重の変数を作成し、適当な数値を代入
- BMIを計算
- if分でBMIの判定し、コンソールで表示

<details id="bkmrk-%E7%AD%94%E3%81%88-%2F%2F-%E4%BD%93%E9%87%8D-float-weigh"><summary>答え</summary>

```c#
// 体重
float weight = 70;

// 身長
float height = 1.71;

// BMIを計算
float bmi = weight / (height * height);

if (bmi < 18.5)
{
    Debug.Log("低体重");
}
else if (bmi < 25)
{
    Debug.Log("普通体重");
}
else if (bmi < 30)
{
    Debug.Log("肥満(1度)");
}
else if (bmi < 35)
{
    Debug.Log("肥満(2度)");
}
else if (bmi < 40)
{
    Debug.Log("肥満(3度)");
}
else 
{
    Debug.Log("肥満(4度)");
}
```

</details>---

## 比較の改良

### 同じ変数をなんども「==」で比較する「switch-case」

次の問題について考えてみてください

サイコロの数値は1から6までの間にして、その値を漢字で表示したい。つまり「1」の場合は「一」、「2」の場合は「二」など。if-elseで作成するとしたら、以下のようなプログラムになる：

```c#
// サイコロの値
int dice = 5;

if (dice == 1)
{
    Debug.Log("一");
}
else if (dice == 2)
{
    Debug.Log("二");
}
else if (dice == 3)
{
    Debug.Log("三");
}
else if (dice == 4)
{
    Debug.Log("四");
}
else if (dice == 5)
{
    Debug.Log("五");
}
else if (dice == 6)
{
    Debug.Log("六");
}
else
{
    Debug.Log("無効な数値");
}
```

このプログラムは、カスケードのように「1じゃなければ、2を確認する、2じゃなければ、3を確認する」、次々に「==」で比較するパターンは時々に現れる。この場合は「switch-case」が便利。上のプログラムは以下のようになる：

```c#
// サイコロの値
int dice = 5;

switch(dice)
{
case 1: // dice == 1 と同じ 
    Debug.Log("一");
    break;
case 2: // dice == 2 と同じ
    Debug.Log("二");
    break;
case 3: // dice == 3 と同じ
    Debug.Log("三");
    break;
case 4: // dice == 4 と同じ
    Debug.Log("四");
    break;
case 5: // dice == 5 と同じ
    Debug.Log("五");
    break;
case 6: // dice == 6 と同じ
    Debug.Log("六");
    break;
default: // elseと同じ
    Debug.Log("無効な数値");
    break;
}
```

### 整数に名前を付ける「列挙」（enum）

次の問題について考えてみてください。武器の種類により、攻撃力を変える処理を作りたい。処理しやすくするため、それぞれの武器に整数を与えた：

0: 非武装（攻撃力: 1）  
1: 剣（攻撃力: 5）  
2: ナイフ（攻撃力: 2）  
3: 鉄砲（攻撃力: 10）

「switch-case」を使えば、以下のような処理になる：

```c#
int damage = 0;
int weapon = 2;
switch(weapon)
{
case 0: 
  damage = 1;
  break;
case 1: 
  damage = 5;
  break;
case 2: 
  damage = 2;
  break;
case 3: 
  damage = 10;
  break;
}
Debug.Log($"攻撃力：{damage}");
```

これでも実行ができるが、時間がたてば「０はなんだったっけ？」「１は？」のように、それぞれの整数の意味を忘れてしまう可能性がある。各数値に忘れないように、名前を付ける方法がある。「列挙」を作成することにより、各整数に読みやすい名前を付けることができる。

まず、列挙を定義しなければならない：

<span style="text-decoration: underline;">**書式**</span>

```c#
enum 列挙名 
{
  整数「0」の名前,
  整数「1」の名前,
  整数「2」の名前,
  ...
  整数「n」の名前,
}
```

武器の例で、以下の列挙は適切でしょう：

```c#
enum Weapon
{
  Unarmed, // 0:非武装
  Sword,   // 1:剣
  Knife,   // 2:ナイフ
  Pistol,  // 3:鉄砲
}
```

そして、「switch-case」はとても分かりやすくなる！

```c#
int damage;
Weapon wpn = Weapon.Knife;  // 新し「Weapon」というデータ型を使える！
switch(wpn)
{
case Weapon.Unarmed: // 「0」と同じ
  damage = 1;
  break;
case Weapon.Sword:   // 「1」と同じ
  damage = 5;
  break;
case Weapon.Knife:   //「2」と同じ
  damage = 2;
  break;
case Weapon.Pistol:  //「3」と同じ
  damage = 10;
  break;
}
Debug.Log($"攻撃力：{damage}");
```

## 練習課題

ゲームでのアイテムショップを作ろうとして、以下のアイテムとその価格が決まった：

<table border="1" id="bkmrk-%E3%83%9D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E5%B0%8F%EF%BC%89-10%E3%82%BC%E3%83%8B-%E3%83%9D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88" style="border-collapse: collapse; width: 34.1667%; height: 208.6px;"><colgroup><col style="width: 66.2776%;"></col><col style="width: 33.7224%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td style="height: 29.8px;">ポーション（小）</td><td style="height: 29.8px;">10ゼニ</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">ポーション（大）</td><td style="height: 29.8px;">25ゼニ</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">木の盾</td><td style="height: 29.8px;">50ゼニ</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">鉄の盾</td><td style="height: 29.8px;">100ゼニ</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">皮のブーツ</td><td style="height: 29.8px;">40ゼニ</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">魔法のマント</td><td style="height: 29.8px;">250ゼニ</td></tr></tbody></table>

ここで、次のプログラムをC#で作成し、Unityで確認してください

1. 各種のアイテムを表すことができる「`ItemType`」の列挙を作成
2. プレーヤーを持っているお金の変数を準備（`playerMoney` - 整数型）
3. プレーヤーが買いたいアイテムの変数を準備（`buyItem` - `ItemType`の列挙型）
4. switch-caseで定めたアイテムの価格を求める（`itemCost` - 整数）
5. 変えるかどうかをif分で判定し、コンソールで結果を表示

<details id="bkmrk-%E7%AD%94%E3%81%88-%2F%2F-%E5%90%84%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%AE%E5%88%97%E6%8C%99%EF%BC%88%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%9A%E5%B0%91"><summary>答え</summary>

```c#
// 各アイテムの列挙（名前を多少に異なる可能性あり！）
enum ItemType
{
  PotionSmall,   // ポーション（小）
  PotionLarge,   // ポーション（大）
  WoodShield,    // 木の盾
  IronShield,    // 鉄の盾
  LeatherBoots,  // 皮のブーツ
  MagicCape,     // 魔法のマント
}

// 持っているお金
int playerMoney = 150;

// 買いたいアイテム
ItemType buyItem = ItemType.WoodShield; // なんでもOK

// 買いたいアイテムの価格
int itemCost; 
switch(buyItem)
{
    case ItemType.PotionSmall:
        itemCost = 10;
        break;
    case ItemType.PotionLarge:
        itemCost = 25;
        break;
    case ItemType.WoodShield:
        itemCost = 50;
        break;
    case ItemType.IronShield:
        itemCost = 100;
        break;
    case ItemType.LeatherBoots:
        itemCost = 40;
        break;
    case ItemType.MagicCape:
        itemCost = 250;
        break;
}

// 買えるかどうかを確認
if (itemCost <= playerMoney)
{
    Debug.Log("購入可能！");
}
else
{
    Debug.Log("お金不足～");
}
    
```

</details>