Menu
Coddy logo textTech

System postaci w grze

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 109 z 110.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system postaci do gry, który łączy wszystkie opanowane przez Ciebie koncepcje OOP! Utworzysz różne klasy postaci o unikalnych umiejętnościach, statystykach i mechanikach walki — modelując to, jak postacie mogłyby działać w prawdziwej grze.

Twój system będzie zorganizowany w sześciu plikach:

  • character.dart: Utwórz abstrakcyjną klasę Character, która będzie podstawą wszystkich typów postaci. Każda postać ma name (String), prywatne pole _health (int), attackPower (int) oraz defense (int). Dodaj getter dla zdrowia i następujące metody:
    • takeDamage(int damage) — zmniejsza zdrowie o damage - defense (otrzymane obrażenia wynoszą co najmniej 1, a zdrowie nie może spaść poniżej 0). Wyświetla name takes X damage! Health: Y
    • bool isAlive() — zwraca true, jeśli zdrowie jest większe od 0
    • Abstrakcyjna metoda String attack(), którą podklasy implementują, aby określić swój unikalny styl ataku
    Nadpisz toString(), aby zwracała name [Class] - HP: health, ATK: attackPower, DEF: defense, gdzie Class pochodzi z runtimeType.
  • abilities.dart: Utwórz dwa miksy zapewniające specjalne umiejętności:
    • CanHeal — udostępnia metodę heal(int amount). Ponieważ miksy nie mogą bezpośrednio uzyskiwać dostępu do pól prywatnych, ten miks powinien definiować abstrakcyjną metodę void restoreHealth(int amount), którą implementuje klasa postaci. Metoda heal() wywołuje restoreHealth(amount) i wyświetla name heals for amount HP!
    • CanCastSpells — udostępnia int mana (domyślnie 100) oraz metodę castSpell(String spellName, int manaCost), która zmniejsza manę, jeśli jest jej wystarczająco dużo, wyświetla name casts spellName! i zwraca true. Jeśli many jest za mało, wyświetla Not enough mana! i zwraca false.
  • warrior.dart: Utwórz klasę Warrior rozszerzającą Character. Wojownicy są tankami o wysokiej obronie. Zainicjuj postać z 150 punktami zdrowia, 20 punktami siły ataku i 15 punktami obrony. Zaimplementuj attack(), aby zwracała name swings a mighty sword!
  • mage.dart: Utwórz klasę Mage rozszerzającą Character i używającą miksów CanCastSpells oraz CanHeal. Magowie są delikatni, ale potężni. Zainicjuj postać z 80 punktami zdrowia, 35 punktami siły ataku i 5 punktami obrony. Zaimplementuj attack(), aby zwracała name hurls a fireball!. Zaimplementuj restoreHealth(int amount), aby zwiększała zdrowie (maksymalnie do 80).
  • archer.dart: Utwórz klasę Archer rozszerzającą Character. Łucznicy to wszechstronni wojownicy. Zainicjuj postać z 100 punktami zdrowia, 25 punktami siły ataku i 10 punktami obrony. Zaimplementuj attack(), aby zwracała name fires a precise arrow!
  • main.dart: Zademonstruj działanie systemu postaci, tworząc po jednej postaci każdego typu: Wojownika o imieniu Thorin, Maga o imieniu Gandalf i Łucznika o imieniu Legolas. Wyświetl każdą postać za pomocą toString(). Następnie zasymuluj przebieg walki:
    1. Wyświetl komunikat o ataku Thorina
    2. Gandalf otrzymuje 30 punktów obrażeń
    3. Gandalf rzuca zaklęcie Healing Light (kosztuje 25 punktów many)
    4. Gandalf leczy się o 20 punktów HP
    5. Wyświetl komunikat o ataku Gandalfa
    6. Thorin otrzymuje 40 punktów obrażeń
    7. Wyświetl komunikat o ataku Legolasa
    8. Wyświetl, czy każda postać żyje, w formacie: name alive: true/false

Oczekiwany wynik:

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

Spróbuj swoich sił

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

void main() {
  // TODO: Utwórz postać Warrior o imieniu "Thorin"

  // TODO: Utwórz postać Mage o imieniu "Gandalf"

  // TODO: Utwórz postać Archer o imieniu "Legolas"

  // TODO: Wypisz każdą postać, używając toString()

  // TODO: Zasymuluj przebieg walki:
  // 1. Wypisz komunikat o ataku Thorina
  // 2. Gandalf otrzymuje 30 obrażeń
  // 3. Gandalf rzuca zaklęcie "Healing Light" (kosztuje 25 punktów many)
  // 4. Gandalf odzyskuje 20 HP
  // 5. Wypisz komunikat o ataku Gandalfa
  // 6. Thorin otrzymuje 40 obrażeń
  // 7. Wypisz komunikat o ataku Legolasa
  // 8. Wypisz, czy każda postać żyje: "name alive: true/false"
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online