Menu
Coddy logo textTech

ゲームキャラクターシステム

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 109/110。

challenge icon

チャレンジ

簡単

これまでに習得したすべてのOOPコンセプトを統合したゲームキャラクターシステムを構築しましょう!ユニークな能力、ステータス、戦闘メカニズムを持つさまざまなキャラクタークラスを作成し、実際のゲームでキャラクターがどのように機能するかをモデリングします。

システムは6つのファイルで構成されます:

  • character.dart: すべてのキャラクタータイプの基礎となる抽象クラス Character を作成します。各キャラクターは name (String)、プライベートな _health (int)、attackPower (int)、および defense (int) を持ちます。health のゲッターと、以下のメソッドを含めてください:
    • takeDamage(int damage) - damage - defense 分だけ体力を減らします(最低ダメージは1、体力は0未満にはなりません)。name takes X damage! Health: Y と出力します。
    • bool isAlive() - 体力が0より大きい場合に true を返します。
    • 抽象メソッド String attack() - サブクラスが独自の攻撃スタイルを実装するために使用します。
    toString() をオーバーライドして、name [Class] - HP: health, ATK: attackPower, DEF: defense を返すようにします。ここで Class は runtimeType から取得します。
  • abilities.dart: 特殊能力を提供する2つのミックスインを作成します:
    • CanHeal - heal(int amount) メソッドを提供します。ミックスインはプライベートフィールドに直接アクセスできないため、このミックスインはキャラクタークラスが実装する抽象メソッド void restoreHealth(int amount) を定義する必要があります。heal() メソッドは restoreHealth(amount) を呼び出し、name heals for amount HP! と出力します。
    • CanCastSpells - int mana (デフォルトは100) と castSpell(String spellName, int manaCost) メソッドを提供します。マナが十分であればマナを減らし、name casts spellName! と出力して true を返します。マナが不足している場合は、Not enough mana! と出力して false を返します。
  • warrior.dart: Character を継承した Warrior クラスを作成します。戦士(Warrior)は高い防御力を持つタンクです。体力150、攻撃力20、防御力15で初期化します。attack() を実装し、name swings a mighty sword! を返すようにします。
  • mage.dart: Character を継承し、CanCastSpellsCanHeal ミックスインを使用する Mage クラスを作成します。魔道士(Mage)は脆弱ですが強力です。体力80、攻撃力35、防御力5で初期化します。attack() を実装し、name hurls a fireball! を返すようにします。restoreHealth(int amount) を実装して体力を増加させます(最大80)。
  • archer.dart: Character を継承した Archer クラスを作成します。弓使い(Archer)はバランスの取れたファイターです。体力100、攻撃力25、防御力10で初期化します。attack() を実装し、name fires a precise arrow! を返すようにします。
  • main.dart: 各キャラクタータイプを1つずつ作成して、キャラクターシステムを実演します:Thorin という名前の Warrior、Gandalf という名前の Mage、そして Legolas という名前の Archer です。 toString() を使用して各キャラクターを出力します。その後、戦闘シークエンスをシミュレートします:
    1. Thorin の攻撃メッセージを出力する
    2. Gandalf が30のダメージを受ける
    3. Gandalf が Healing Light を唱える(コスト25マナ)
    4. Gandalf が20 HP回復する
    5. Gandalf の攻撃メッセージを出力する
    6. Thorin が40のダメージを受ける
    7. Legolas の攻撃メッセージを出力する
    8. 各キャラクターが生きているかどうかを name alive: true/false の形式で出力する

期待される出力:

Thorin [Warrior] - HP: 150, ATK: 20, DEF: 15
Gandalf [Mage] - HP: 80, ATK: 35, DEF: 5
Legolas [Archer] - HP: 100, ATK: 25, DEF: 10
Thorin swings a mighty sword!
Gandalf takes 25 damage! Health: 55
Gandalf casts Healing Light!
Gandalf heals for 20 HP!
Gandalf hurls a fireball!
Thorin takes 25 damage! Health: 125
Legolas fires a precise arrow!
Thorin alive: true
Gandalf alive: true
Legolas alive: true

自分で試してみよう

import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';

void main() {
  // TODO: "Thorin" という名前の Warrior を作成する

  // TODO: "Gandalf" という名前の Mage を作成する

  // TODO: "Legolas" という名前の Archer を作成する

  // TODO: toString() を使用して各キャラクターを表示する

  // TODO: バトルシークエンスをシミュレートする:
  // 1. Thorin の攻撃メッセージを表示する
  // 2. Gandalf が 30 ダメージを受ける
  // 3. Gandalf が "Healing Light" を唱える (25 マナを消費)
  // 4. Gandalf が 20 HP 回復する
  // 5. Gandalf の攻撃メッセージを表示する
  // 6. Thorin が 40 ダメージを受ける
  // 7. Legolas の攻撃メッセージを表示する
  // 8. 各キャラクターが生存しているかを表示する: "name alive: true/false"
}

オブジェクト指向プログラミングのすべてのレッスン