Oyun Karakter Sistemi
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 109 / 110.
Görev
KolayUstalaştığınız tüm OOP kavramlarını bir araya getiren bir Oyun Karakter Sistemi inşa edelim! Benzersiz yeteneklere, istatistiklere ve dövüş mekaniklerine sahip farklı karakter sınıfları oluşturacaksınız - karakterlerin gerçek bir oyunda nasıl çalışabileceğini modelleyeceksiniz.
Sisteminiz altı dosya halinde organize edilecektir:
character.dart: Tüm karakter türleri için temel teşkil eden soyut birCharactersınıfı oluşturun. Her karakterin birname(String), özel_health(int),attackPower(int) vedefense(int) değeri vardır. Sağlık için bir getter ve şu metotları ekleyin:takeDamage(int damage)- sağlığıdamage - defensekadar azaltır (en az 1 hasar alınır, sağlık 0'ın altına düşemez).name takes X damage! Health: Yyazdırır.bool isAlive()- sağlık 0'dan büyükse true döndürür.- Alt sınıfların benzersiz saldırı stilleri için uygulayacağı soyut bir
String attack()metodu.
toString()metodunu,name [Class] - HP: health, ATK: attackPower, DEF: defensedöndürecek şekilde geçersiz kılın (override); burada Class değeriruntimeType'dan gelir.abilities.dart: Özel yetenekler sağlayan iki mixin oluşturun:CanHeal- birheal(int amount)metodu sağlar. Mixin'ler doğrudan özel (private) alanlara erişemediği için, bu mixin karakter sınıfının uygulayacağı soyut birvoid restoreHealth(int amount)tanımlamalıdır.heal()metodurestoreHealth(amount)metodunu çağırır vename heals for amount HP!yazdırır.CanCastSpells-int mana(varsayılan 100) ve yeterli mana varsa manayı azaltan,name casts spellName!yazdıran ve true döndüren bircastSpell(String spellName, int manaCost)metodu sağlar. Mana yetersizseNot enough mana!yazdırır ve false döndürür.
warrior.dart:Charactersınıfını genişleten birWarriorsınıfı oluşturun. Savaşçılar (Warriors) yüksek savunmaya sahip tanklardır. 150 sağlık, 20 saldırı gücü ve 15 savunma ile başlatın.attack()metodununame swings a mighty sword!döndürecek şekilde uygulayın.mage.dart:Charactersınıfını genişleten veCanCastSpellsileCanHealmixin'lerini kullanan birMagesınıfı oluşturun. Büyücüler (Mages) kırılgandır ancak güçlüdür. 80 sağlık, 35 saldırı gücü ve 5 savunma ile başlatın.attack()metodununame hurls a fireball!döndürecek şekilde uygulayın. Sağlığı artırmak için (en fazla 80 olacak şekilde)restoreHealth(int amount)metodunu uygulayın.archer.dart:Charactersınıfını genişleten birArchersınıfı oluşturun. Okçular (Archers) dengeli dövüşçülerdir. 100 sağlık, 25 saldırı gücü ve 10 savunma ile başlatın.attack()metodununame fires a precise arrow!döndürecek şekilde uygulayın.main.dart: Her karakter türünden birer tane oluşturarak karakter sisteminizi gösterin:Thorinadında bir Warrior,Gandalfadında bir Mage veLegolasadında bir Archer. Her karakteritoString()kullanarak yazdırın. Ardından bir savaş sekansı simüle edin:- Thorin'in saldırı mesajını yazdırın
- Gandalf 30 hasar alır
- Gandalf
Healing Lightbüyüsü yapar (25 mana harcar) - Gandalf 20 HP iyileşir
- Gandalf'ın saldırı mesajını yazdırın
- Thorin 40 hasar alır
- Legolas'ın saldırı mesajını yazdırın
- Her karakterin hayatta olup olmadığını şu formatta yazdırın:
name alive: true/false
Beklenen çıktı:
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: trueKendin dene
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: "Thorin" adında bir Warrior oluşturun
// TODO: "Gandalf" adında bir Mage oluşturun
// TODO: "Legolas" adında bir Archer oluşturun
// TODO: toString() kullanarak her karakteri yazdırın
// TODO: Savaş dizisini simüle edin:
// 1. Thorin'in saldırı mesajını yazdırın
// 2. Gandalf 30 hasar alır
// 3. Gandalf "Healing Light" büyüsü yapar (25 mana harcar)
// 4. Gandalf 20 HP iyileşir
// 5. Gandalf'ın saldırı mesajını yazdırın
// 6. Thorin 40 hasar alır
// 7. Legolas'ın saldırı mesajını yazdırın
// 8. Her karakterin hayatta olup olmadığını yazdırın: "name alive: true/false"
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı