Komponen Karakter Game
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 69 dari 70.
Tantangan
MudahMari 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 antarmukaIComponentdi namespaceGame.Components. Setiap komponen harus memiliki methodUpdate()yang mencetak tindakan komponen tersebut.HealthComponent.cs: Buat classHealthComponentyang mengimplementasikanIComponent. Class ini harus melacak poin kesehatan saat ini dan maksimum, dengan method untukTakeDamage(int amount)danHeal(int amount). Kesehatan tidak boleh kurang dari 0 atau melebihi nilai maksimum. Sertakanevent Action<int> HealthChangedyang aktif setiap kali kesehatan berubah, dengan meneruskan nilai kesehatan yang baru. MethodUpdate()harus mencetak status kesehatan saat ini.InventoryComponent.cs: Buat classInventoryComponentyang mengimplementasikanIComponent. Class ini mengelola list nama item dengan methodAddItem(string item)danRemoveItem(string item)(mengembalikanbooluntuk menunjukkan keberhasilan). MethodUpdate()harus mencetak isi inventaris.Character.cs: Buat classCharacterdi namespaceGameyang menyimpan kumpulan komponen. Karaktermu memerlukan propertyNamedan method berikut:AddComponent(IComponent component)- memasang komponen ke karakterGetComponent<T>()where T : IComponent - mengembalikan komponen pertama bertipe T, atau null jika tidak ditemukanUpdateAll()- memanggilUpdate()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}
updateFormat output:
- Saat kesehatan berubah (melalui event):
Health changed: {newHealth} - Saat menambahkan item:
Added: {itemName} - Saat menghapus item:
Removed: {itemName}atauItem not found: {itemName} Update()milik HealthComponent:Health: {current}/{max}Update()milik InventoryComponent:Inventory: {item1}, {item2}, ...atauInventory: empty
Contohnya, jika inputnya adalah:
Hero
100
7
add_item
Sword
add_item
Shield
damage
30
heal
10
remove_item
Potion
remove_item
Sword
updateOutputnya adalah:
Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: ShieldPerhatikan 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
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online