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 karakteri 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 bir araya getireceksin; bu, oyun geliştirmede yaygın olarak kullanılan esnek bir yaklaşımdır.
Kodunu beş dosyaya ayıracaksın:
IComponent.cs:IComponentad alanında birGame.Componentsarayüzü tanımla. Her bileşenin, bileşenin ne yaptığını yazdıran birUpdate()yöntemi olmalıdır.HealthComponent.cs:HealthComponentuygulayan birIComponentsınıfı oluştur. Bu sınıf, mevcut ve maksimum sağlık puanlarını takip etmeli veTakeDamage(int amount)ileHeal(int amount)yöntemlerine sahip olmalıdır. Sağlık hiçbir zaman 0'ın altına veya maksimum değerin üzerine çıkmamalıdır. Sağlık değiştiğinde tetiklenen ve yeni sağlık değerini ileten birevent Action<int> HealthChangedekle.Update()yöntemi mevcut sağlık durumunu yazdırmalıdır.InventoryComponent.cs:InventoryComponentuygulayan birIComponentsınıfı oluştur. Bu sınıf,AddItem(string item)veRemoveItem(string item)yöntemleriyle (başarı durumunu belirtenbooldöndürür) öğe adlarından oluşan bir listeyi yönetir.Update()yöntemi envanter içeriğini yazdırmalıdır.Character.cs:Characterad alanında bir bileşen koleksiyonu tutan birGamesınıfı oluştur. Karakterinin birNameözelliğine ve şu yöntemlere ihtiyacı vardır:AddComponent(IComponent component)- bir bileşeni karaktere eklerGetComponent<T>()where T : IComponent - T türündeki ilk bileşeni döndürür; bulunamazsa null döndürürUpdateAll()- eklenmiş her bileşen üzerindeUpdate()çağrısı yapar
Program.cs: Bir karakter oluşturarak, bileşenleri ekleyerek ve komutları işleyerek her şeyi bir araya getir.
Aşağıdaki girdileri alacaksın:
- Karakter adı
- HealthComponent için başlangıç maksimum sağlık değeri
- İşlenecek komut sayısı
- Her komut için: ilgili verinin ardından eylem
Komut biçimleri:
damage
{amount}
heal
{amount}
add_item
{itemName}
remove_item
{itemName}
updateÇıktı biçimleri:
- Sağlık değiştiğinde (olay aracılığıyla):
Health changed: {newHealth} - Bir öğe eklenirken:
Added: {itemName} - Bir öğe kaldırılırken:
Removed: {itemName}veyaItem not found: {itemName} - HealthComponent'ın
Update()yöntemi:Health: {current}/{max} - InventoryComponent'ın
Update()yöntemi: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 et; yalnızca davranış sağlayan bileşenleri tutar. GetComponent<T>() yöntemi tür güvenli erişim için generic'leri kullanır ve olaylar sağlık değiştiğinde bildirim gönderir. Bu birleştirme yaklaşımı, bileşenleri özgürce bir araya getirip kullanmanı sağlar!
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ıKendi başına pratik yap: Online C# derleyicisi