ゲームキャラクターシステム
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 109/110。
チャレンジ
簡単これまでに習得したすべての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を継承し、CanCastSpellsとCanHealミックスインを使用する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()を使用して各キャラクターを出力します。その後、戦闘シークエンスをシミュレートします:- Thorin の攻撃メッセージを出力する
- Gandalf が30のダメージを受ける
- Gandalf が
Healing Lightを唱える(コスト25マナ) - Gandalf が20 HP回復する
- Gandalf の攻撃メッセージを出力する
- Thorin が40のダメージを受ける
- Legolas の攻撃メッセージを出力する
- 各キャラクターが生きているかどうかを
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"
}
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ