Menu
CoddyTech

Komponen Karakter Game

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 69 dari 70.

challenge icon

Tantangan

Mudah

Mari buat sistem karakter game menggunakan pola arsitektur berbasis komponen! Alih-alih membuat hierarki pewarisan yang kaku, kamu akan menyusun karakter dengan memasang komponen independen yang menangani perilaku tertentu. Pendekatan fleksibel ini banyak digunakan dalam pengembangan game.

Kamu akan mengatur kodemu dalam lima file:

  • IComponent.cs: Definisikan antarmuka IComponent di namespace Game.Components. Setiap komponen harus memiliki method Update() yang mencetak tindakan komponen tersebut.
  • HealthComponent.cs: Buat class HealthComponent yang mengimplementasikan IComponent. Class ini harus melacak poin kesehatan saat ini dan maksimum, dengan method untuk TakeDamage(int amount) dan Heal(int amount). Kesehatan tidak boleh kurang dari 0 atau melebihi nilai maksimum. Sertakan event Action<int> HealthChanged yang aktif setiap kali kesehatan berubah, dengan meneruskan nilai kesehatan yang baru. Method Update() harus mencetak status kesehatan saat ini.
  • InventoryComponent.cs: Buat class InventoryComponent yang mengimplementasikan IComponent. Class ini mengelola list nama item dengan method AddItem(string item) dan RemoveItem(string item) (mengembalikan bool untuk menunjukkan keberhasilan). Method Update() harus mencetak isi inventaris.
  • Character.cs: Buat class Character di namespace Game yang menyimpan kumpulan komponen. Karaktermu memerlukan property Name dan method berikut:
    • AddComponent(IComponent component) - memasang komponen ke karakter
    • GetComponent<T>() where T : IComponent - mengembalikan komponen pertama bertipe T, atau null jika tidak ditemukan
    • UpdateAll() - memanggil Update() pada setiap komponen yang terpasang
  • Program.cs: Gabungkan semuanya dengan membuat karakter, memasang komponen, dan memproses perintah.

Kamu akan menerima input berikut:

  • Nama karakter
  • Kesehatan maksimum awal untuk HealthComponent
  • Jumlah perintah yang akan diproses
  • Untuk setiap perintah: tindakan, lalu data yang sesuai

Format perintah:

damage
{amount}

heal
{amount}

add_item
{itemName}

remove_item
{itemName}

update

Format output:

  • Saat kesehatan berubah (melalui event): Health changed: {newHealth}
  • Saat menambahkan item: Added: {itemName}
  • Saat menghapus item: Removed: {itemName} atau Item not found: {itemName}
  • Update() milik HealthComponent: Health: {current}/{max}
  • Update() milik InventoryComponent: Inventory: {item1}, {item2}, ... atau Inventory: empty

Contohnya, jika inputnya adalah:

Hero
100
7
add_item
Sword
add_item
Shield
damage
30
heal
10
remove_item
Potion
remove_item
Sword
update

Outputnya adalah:

Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: Shield

Perhatikan bahwa karakter tidak mewarisi apa pun yang khusus. Karakter hanya menyimpan komponen yang menyediakan perilaku. Method GetComponent<T>() menggunakan generik untuk mengambil komponen dengan tipe yang aman, dan event memberi tahu saat kesehatan berubah. Pendekatan komposisi ini memungkinkanmu memadukan komponen dengan bebas!

Coba sendiri

using System;
using Game;
using Game.Components;

class Program
{
    public static void Main(string[] args)
    {
        // Baca nama karakter
        string characterName = Console.ReadLine();
        
        // Baca batas kesehatan awal
        int maxHealth = Convert.ToInt32(Console.ReadLine());
        
        // Baca jumlah perintah
        int numCommands = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Buat Character dengan nama yang diberikan
        
        // TODO: Buat HealthComponent dengan maxHealth dan InventoryComponent
        
        // TODO: Berlangganan event HealthChanged untuk mencetak: Health changed: {newHealth}
        
        // TODO: Tambahkan kedua komponen ke karakter
        
        // TODO: Proses setiap perintah
        for (int i = 0; i < numCommands; i++)
        {
            string command = Console.ReadLine();
            
            // TODO: Tangani setiap jenis perintah:
            // - "damage": baca jumlahnya, panggil TakeDamage pada komponen kesehatan
            // - "heal": baca jumlahnya, panggil Heal pada komponen kesehatan
            // - "add_item": baca nama item, panggil AddItem pada komponen inventaris
            // - "remove_item": baca nama item, panggil RemoveItem pada komponen inventaris
            // - "update": panggil UpdateAll pada karakter
        }
    }
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online