Menu
Coddy logo textTech

Oyun Karakteri Bileşeni

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 69 / 70.

challenge icon

Görev

Kolay

Bileş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.Components ad alanında (namespace) bir IComponent arayüzü tanımlayın. Her bileşenin, bileşenin ne yaptığını yazdıran bir Update() metoduna sahip olması gerekir.
  • HealthComponent.cs: IComponent arayüzünü uygulayan bir HealthComponent sınıfı oluşturun. Mevcut ve maksimum sağlık puanlarını takip etmeli, TakeDamage(int amount) ve Heal(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 bir event Action<int> HealthChanged ekleyin. Update() metodu mevcut sağlık durumunu yazdırmalıdır.
  • InventoryComponent.cs: IComponent arayüzünü uygulayan bir InventoryComponent sınıfı oluşturun. AddItem(string item) ve RemoveItem(string item) (başarıyı belirten bir bool döndürür) metodlarıyla bir öğe isimleri listesini yönetir. Update() metodu envanter içeriğini yazdırmalıdır.
  • Character.cs: Game ad alanında, bir bileşen koleksiyonu tutan bir Character sınıfı oluşturun. Karakterinizin bir Name özelliğine ve şu metodlara ihtiyacı vardır:
    • AddComponent(IComponent component) - karaktere bir bileşen ekler
    • GetComponent<T>() (burada T : IComponent) - T türündeki ilk bileşeni döndürür veya bulunamazsa null döndürür
    • UpdateAll() - ekli olan her bileşen üzerinde Update() 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} veya Item not found: {itemName}
  • HealthComponent'in Update() çıktısı: Health: {current}/{max}
  • InventoryComponent'in Update() çıktısı: Inventory: {item1}, {item2}, ... veya Inventory: 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: Shield

Karakterin ö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