【C#入門】public bool IsAlive => HP > 0; を読み解く|式形式プロパティと生存判定

広告

public bool IsAlive => HP > 0;は、ゲームで「キャラクターが生きているか」を表す、とても短いC#のコードです。たった1行の中に、プロパティ、bool、比較演算子、式形式メンバーという大切な考え方が詰まっています。

この記事のゴール

  • コードを左から順に日本語で説明できる
  • HP > 0truefalseになる条件を理解する
  • =>を使った式形式プロパティを通常の書き方に直せる
  • IsAliveif文で利用できる

今回読み解くコード

public bool IsAlive => HP > 0;

日本語にすると、次の意味です。

「HPが0より大きければ、IsAliveはtrue(生きている)。そうでなければfalse(生きていない)」

図で見る生存判定

HPはいくつ?
HP > 0 を判定
HPが1以上
true
生きている
HPが0以下
false
生きていない

左から順に読み解こう

public:クラスの外から使える

publicはアクセス修飾子です。このプロパティを、ほかのクラスからも利用できることを表します。

Player player = new Player();
Console.WriteLine(player.IsAlive);

bool:答えはtrueかfalse

boolは、true(正しい)またはfalse(正しくない)の2択を扱う型です。生存中か、ゲームクリア済みか、鍵を持っているかなど、「はい/いいえ」で答えられる状態に向いています。

IsAlive:生きているかを表す名前

IsAliveはプロパティ名です。boolの名前には、IsHasCanなどを付けると意味が伝わりやすくなります。

  • IsAlive:生きているか
  • HasKey:鍵を持っているか
  • CanJump:ジャンプできるか

=>:右側の式を結果として返す

=>を使った書き方を式形式プロパティと呼びます。右側の式を計算し、その結果をプロパティの値として返します。

注意:=>は「以上」を表す記号ではありません。C#で「以上」は>=です。記号の順番を区別しましょう。

HP > 0:HPが0より大きいか比べる

>は「左側が右側より大きいか」を調べる比較演算子です。比較した結果は必ずboolになります。

HP HP > 0 IsAlive
100 成り立つ true
1 成り立つ true
0 成り立たない false
-10 成り立たない false

通常のプロパティに書き直すと?

式形式プロパティは短くて便利ですが、最初は通常の書き方と見比べると理解しやすくなります。次の2つは同じ働きです。

短い書き方(式形式)

public bool IsAlive => HP > 0;

通常の書き方

public bool IsAlive
{
    get
    {
        return HP > 0;
    }
}

HP > 0の結果がそのままtrueまたはfalseになるため、ifを書いて値を作る必要はありません。

クラス全体のサンプル

public class Player
{
    public int HP { get; private set; } = 100;

    public bool IsAlive => HP > 0;

    public void TakeDamage(int damage)
    {
        HP -= damage;

        if (HP < 0)
        {
            HP = 0;
        }
    }
}

TakeDamageでHPが減ると、IsAliveの結果も自動的に変わります。IsAliveが値を保存しているのではなく、読み取られるたびにHP > 0を計算するためです。

if文で使ってみよう

Player player = new Player();

player.TakeDamage(30);

if (player.IsAlive)
{
    Console.WriteLine("プレイヤーは生きています");
}
else
{
    Console.WriteLine("プレイヤーは倒れました");
}

player.IsAlive自体がboolなので、if (player.IsAlive == true)と書かなくてもかまいません。

次はターン制バトルの中で使ってみよう

IsAliveの仕組みを理解できたら、次はキャラクター生成、攻撃、回復、手番交代、勝敗判定を組み合わせたターン制バトルへ発展させてみましょう。

完成版を一度動かした後、クラスやバトルループの外枠から再構築すると、IsAliveがゲーム全体のどこで働いているかを確認できます。

境界値「0」を必ず確認しよう

条件式では、判定が切り替わる値を境界値と呼びます。今回の境界値は0です。

  • HPが1:生きている
  • HPが0:生きていない
  • HPが-1:生きていない

HP >= 0と書くと、HPが0でも生きている判定になります。ゲームのルールに合っているか、境界値を使って確認しましょう。

よくある間違い

=> と >= を混同する

=>は式形式メンバーで使う記号、>=は「以上」を表す比較演算子です。

IsAliveをフィールドだと思う

これは読み取り専用のプロパティです。player.IsAlive = true;のように外から値を代入することはできません。

HPがマイナスになる場合を考えていない

HP > 0なら負の値も死亡扱いになるため、生存判定は正しく動きます。ただし、HP表示を分かりやすくするなら、ダメージ処理で0未満にならないよう補正するとよいでしょう。

授業での確認ポイント

  1. HPを100、1、0、-1に変えて結果を予想する
  2. 式形式を通常のgetreturn形式に書き直す
  3. =>>=の意味を言葉で説明する
  4. if (player.IsAlive)で分岐を作る

練習課題

  1. 満タン判定:MaxHPHPが等しいときtrueになるIsFullHealthを作ってください。
  2. 瀕死判定:HPが1以上30以下のときtrueになるIsCriticalを作ってください。
  3. 鍵の所持判定:鍵の数KeyCountが1個以上ならtrueになるHasKeyを作ってください。
  4. 攻撃可能判定:生きていて、さらにMPが10以上ならtrueになるCanAttackを作ってください。
  5. テスト:HPが1、0、-1のとき、IsAliveが期待どおりになるか確認してください。
練習課題の解答例
public bool IsFullHealth => HP == MaxHP;

public bool IsCritical => HP >= 1 && HP <= 30;

public bool HasKey => KeyCount > 0;

public bool CanAttack => IsAlive && MP >= 10;

まとめ

  • booltrueまたはfalseを表す型
  • IsAliveは生存状態を読み取るプロパティ
  • =>は右側の式を結果として返す短い書き方
  • HP > 0はHPが1以上ならtrueになる
  • 0のような境界値を使って条件を確認することが大切

この形を覚えると、IsGameOverHasItemCanMoveなど、ゲーム内のさまざまな状態を読みやすく表現できます。

訪問数 25 回, 今日の訪問数 25回

広告