Oyun Karakteri Bileşeni
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 69 / 70.
Görev
KolayBileşen tabanlı mimari desenini kullanarak bir oyun karakter sistemi oluşturalım! Katı kalıtım hiyerarşileri oluşturmak yerine, belirli davranışları yöneten bağımsız bileşenleri ekleyerek karakterleri oluşturacaksınız - bu, oyun geliştirmede yaygın olarak kullanılan esnek bir yaklaşımdır.
Kodunuzu beş dosya halinde düzenleyeceksiniz:
IComponent.cs:Game.Componentsad alanında (namespace) birIComponentarayüzü tanımlayın. Her bileşenin, bileşenin ne yaptığını yazdıran birUpdate()metoduna sahip olması gerekir.HealthComponent.cs:IComponentarayüzünü uygulayan birHealthComponentsınıfı oluşturun. Mevcut ve maksimum sağlık puanlarını takip etmeli,TakeDamage(int amount)veHeal(int amount)metodlarına sahip olmalıdır. Sağlık asla 0'ın altına düşmemeli veya maksimumun üzerine çıkmamalıdır. Sağlık her değiştiğinde yeni sağlık değerini ileten birevent Action<int> HealthChangedekleyin.Update()metodu mevcut sağlık durumunu yazdırmalıdır.InventoryComponent.cs:IComponentarayüzünü uygulayan birInventoryComponentsınıfı oluşturun.AddItem(string item)veRemoveItem(string item)(başarıyı belirten birbooldöndürür) metodlarıyla bir öğe isimleri listesini yönetir.Update()metodu envanter içeriğini yazdırmalıdır.Character.cs:Gamead alanında, bir bileşen koleksiyonu tutan birCharactersınıfı oluşturun. Karakterinizin birNameözelliğine ve şu metodlara ihtiyacı vardır:AddComponent(IComponent component)- karaktere bir bileşen eklerGetComponent<T>()(burada T : IComponent) - T türündeki ilk bileşeni döndürür veya bulunamazsa null döndürürUpdateAll()- ekli olan her bileşen üzerindeUpdate()metodunu çağırır
Program.cs: Bir karakter oluşturarak, bileşenleri ekleyerek ve komutları işleyerek her şeyi bir araya getirin.
Aşağıdaki girdileri alacaksınız:
- Karakter adı
- HealthComponent için başlangıç maksimum sağlığı
- İşlenecek komut sayısı
- Her komut için: eylem ve ardından ilgili veriler
Komut formatları:
damage
{amount}
heal
{amount}
add_item
{itemName}
remove_item
{itemName}
updateÇıktı formatları:
- Sağlık değiştiğinde (olay/event yoluyla):
Health changed: {newHealth} - Bir öğe eklendiğinde:
Added: {itemName} - Bir öğe çıkarıldığında:
Removed: {itemName}veyaItem not found: {itemName} - HealthComponent'in
Update()çıktısı:Health: {current}/{max} - InventoryComponent'in
Update()çıktısı:Inventory: {item1}, {item2}, ...veyaInventory: empty
Örneğin, girdiler şunlarsa:
Hero
100
7
add_item
Sword
add_item
Shield
damage
30
heal
10
remove_item
Potion
remove_item
Sword
updateÇıktı şöyle olmalıdır:
Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: ShieldKarakterin özel bir şeyden kalıtım almadığına dikkat edin - sadece davranış sağlayan bileşenleri tutar. GetComponent<T>() metodu, tip güvenli erişim için generic yapıları kullanır ve olaylar (events) sağlık değiştiğinde bildirimde bulunur. Bu bileşim (composition) yaklaşımı, bileşenleri özgürce karıştırıp eşleştirmenize olanak tanır!
Kendin dene
using System;
using Game;
using Game.Components;
class Program
{
public static void Main(string[] args)
{
// Karakter adını oku
string characterName = Console.ReadLine();
// Başlangıç maksimum can değerini oku
int maxHealth = Convert.ToInt32(Console.ReadLine());
// Komut sayısını oku
int numCommands = Convert.ToInt32(Console.ReadLine());
// TODO: Verilen isimle bir Character oluştur
// TODO: maxHealth ile HealthComponent ve InventoryComponent oluştur
// TODO: "Health changed: {newHealth}" yazdırmak için HealthChanged olayına abone ol
// TODO: Her iki bileşeni de karaktere ekle
// TODO: Her komutu işle
for (int i = 0; i < numCommands; i++)
{
string command = Console.ReadLine();
// TODO: Her komut türünü işle:
// - "damage": miktarı oku, health bileşeni üzerinde TakeDamage çağır
// - "heal": miktarı oku, health bileşeni üzerinde Heal çağır
// - "add_item": eşya adını oku, inventory bileşeni üzerinde AddItem çağır
// - "remove_item": eşya adını oku, inventory bileşeni üzerinde RemoveItem çağır
// - "update": karakter üzerinde UpdateAll çağır
}
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarı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ı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları