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 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: IComponent ad alanında bir Game.Components arayüzü tanımla. Her bileşenin, bileşenin ne yaptığını yazdıran bir Update() yöntemi olmalıdır.
  • HealthComponent.cs: HealthComponent uygulayan bir IComponent sınıfı oluştur. Bu sınıf, mevcut ve maksimum sağlık puanlarını takip etmeli ve TakeDamage(int amount) ile Heal(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 bir event Action<int> HealthChanged ekle. Update() yöntemi mevcut sağlık durumunu yazdırmalıdır.
  • InventoryComponent.cs: InventoryComponent uygulayan bir IComponent sınıfı oluştur. Bu sınıf, AddItem(string item) ve RemoveItem(string item) yöntemleriyle (başarı durumunu belirten bool dö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: Character ad alanında bir bileşen koleksiyonu tutan bir Game sınıfı oluştur. Karakterinin bir Name özelliğine ve şu yöntemlere ihtiyacı vardır:
    • AddComponent(IComponent component) - bir bileşeni karaktere ekler
    • GetComponent<T>() where T : IComponent - T türündeki ilk bileşeni döndürür; bulunamazsa null döndürür
    • UpdateAll() - eklenmiş her bileşen üzerinde Update() ç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} veya Item not found: {itemName}
  • HealthComponent'ın Update() yöntemi: Health: {current}/{max}
  • InventoryComponent'ın Update() yöntemi: 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 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

Kendi başına pratik yap: Online C# derleyicisi