【C#入門】public bool IsAlive => HP > 0; を読み解く|式形式プロパティと生存判定
public bool IsAlive => HP > 0;は、ゲームで「キャラクターが生きているか」を表す、とても短いC#のコードです。たった1行の中に、プロパティ、bool、比較演算子、式形式メンバーという大切な考え方が詰まっています。
- コードを左から順に日本語で説明できる
HP > 0がtrue/falseになる条件を理解する=>を使った式形式プロパティを通常の書き方に直せるIsAliveをif文で利用できる
今回読み解くコード
public bool IsAlive => HP > 0;
日本語にすると、次の意味です。
図で見る生存判定
true生きている
false生きていない
左から順に読み解こう
public:クラスの外から使える
publicはアクセス修飾子です。このプロパティを、ほかのクラスからも利用できることを表します。
Player player = new Player();
Console.WriteLine(player.IsAlive);
bool:答えはtrueかfalse
boolは、true(正しい)またはfalse(正しくない)の2択を扱う型です。生存中か、ゲームクリア済みか、鍵を持っているかなど、「はい/いいえ」で答えられる状態に向いています。
IsAlive:生きているかを表す名前
IsAliveはプロパティ名です。boolの名前には、Is、Has、Canなどを付けると意味が伝わりやすくなります。
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未満にならないよう補正するとよいでしょう。
- HPを100、1、0、-1に変えて結果を予想する
- 式形式を通常の
get/return形式に書き直す =>と>=の意味を言葉で説明するif (player.IsAlive)で分岐を作る
練習課題
- 満タン判定:
MaxHPとHPが等しいときtrueになるIsFullHealthを作ってください。 - 瀕死判定:HPが1以上30以下のとき
trueになるIsCriticalを作ってください。 - 鍵の所持判定:鍵の数
KeyCountが1個以上ならtrueになるHasKeyを作ってください。 - 攻撃可能判定:生きていて、さらにMPが10以上なら
trueになるCanAttackを作ってください。 - テスト: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;
まとめ
boolはtrueまたはfalseを表す型IsAliveは生存状態を読み取るプロパティ=>は右側の式を結果として返す短い書き方HP > 0はHPが1以上ならtrueになる- 0のような境界値を使って条件を確認することが大切
この形を覚えると、IsGameOver、HasItem、CanMoveなど、ゲーム内のさまざまな状態を読みやすく表現できます。









ディスカッション
コメント一覧
まだ、コメントがありません