Pengembangan Karakter Game
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 86 dari 87.
Dalam tantangan ini, kamu akan membangun sistem Pengembangan Karakter Game yang menunjukkan keunggulan OOP dalam memodelkan entitas yang kompleks dan interaktif.
Rancang hierarki karakter dengan class dasar Character yang mendefinisikan atribut umum seperti kesehatan, nama, dan level. Class khusus seperti Warrior, Mage, dan Archer memperluas class dasar ini dengan kemampuan dan gaya bertarung yang unik.
Interface cocok digunakan di sini: Attackable dapat mendefinisikan method pertarungan, sedangkan Healable menangani kemampuan pemulihan. Mage dapat mengimplementasikan keduanya, sementara Warrior hanya berfokus pada menyerang.
Pertimbangkan untuk menggunakan pola Strategy untuk perilaku serangan yang berbeda, sehingga karakter dapat berganti gaya bertarung secara dinamis. Pola State dapat mengelola kondisi karakter seperti normal, terkena racun, atau terkena stun yang memengaruhi perilaku.
Pikirkan tentang komposisi untuk sistem perlengkapan, tempat karakter "memiliki" senjata dan zirah alih-alih mewarisinya. Gunakan enum untuk class karakter atau tipe damage, dan terapkan enkapsulasi untuk melindungi statistik dari perubahan yang tidak valid.
Tantangan
MudahMari bangun sistem Pengembangan Karakter Game yang menampilkan kekuatan OOP dalam memodelkan entitas game yang kompleks dan interaktif! Kamu akan membuat hierarki karakter dengan gaya pertarungan yang berbeda, kemampuan khusus, dan sistem status yang memengaruhi perilaku karakter.
Kamu akan mengatur kodemu dalam tujuh file:
DamageType.java: Buat enum yang mewakili berbagai jenis damage dalam game. Sertakan nilaiPHYSICAL,MAGICAL, danRANGED. Tambahkan field privatdescription(String), constructor untuk menetapkannya, dan getter. Damage fisik harus memiliki description "brute force", damage magis harus memiliki "arcane energy", dan damage jarak jauh harus memiliki "precision strike".Attackable.java: Buat interface yang mendefinisikan kemampuan bertarung. Deklarasikan methodattack(Character target)yang mengembalikan String untuk menjelaskan serangan, dangetDamageType()yang mengembalikan DamageType.Healable.java: Buat interface untuk kemampuan pemulihan. Deklarasikan methodheal(int amount)yang mengembalikan String untuk menjelaskan tindakan pemulihan.Character.java: Buat class dasar abstrak untuk semua karakter game. Sertakan field privat untukname(String),health(int),maxHealth(int), danlevel(int). Constructor menerima name, maxHealth, dan level, lalu menetapkan health sama dengan maxHealth pada awalnya. Sertakan getter untuk semua field. Tambahkan method protectedsetHealth(int health)yang memastikan health tetap di antara 0 dan maxHealth. Buat methodtakeDamage(int damage)yang mengurangi health dan mengembalikan"[name] takes [damage] damage! Health: [health]/[maxHealth]". Tambahkan methodisAlive()yang mengembalikan true jika health lebih besar dari 0. Deklarasikan method abstrakgetCharacterClass()yang mengembalikan String.Warrior.java: Buat class yang mewarisi Character dan mengimplementasikan Attackable. Tambahkan field privatstrength(int). Constructor menerima name, maxHealth, level, dan strength. ImplementasikangetCharacterClass()agar mengembalikan"Warrior". ImplementasikangetDamageType()agar mengembalikanPHYSICAL. Implementasikanattack(Character target)agar memberikan damage sebesar strength ditambah level, memanggil method takeDamage milik target, dan mengembalikan"[name] strikes with [damageType description] for [damage] damage!"diikuti baris baru dan hasil takeDamage.Mage.java: Buat class yang mewarisi Character dan mengimplementasikan Attackable serta Healable. Tambahkan field privatintelligence(int) danmana(int). Constructor menerima name, maxHealth, level, intelligence, dan mana. ImplementasikangetCharacterClass()agar mengembalikan"Mage". ImplementasikangetDamageType()agar mengembalikanMAGICAL. Implementasikanattack(Character target)agar memberikan damage sebesar intelligence dikalikan 2, dengan format yang sama seperti Warrior. Implementasikanheal(int amount)untuk memulihkan health (menggunakan setHealth) dan mengembalikan"[name] channels healing magic! Health: [health]/[maxHealth]".Main.java: Hidupkan sistem gamemu! Kamu akan menerima string perintah yang dipisahkan koma:CREATE_WARRIOR:name:maxHealth:level:strengthCREATE_MAGE:name:maxHealth:level:intelligence:manaATTACK:attackerName:targetNameHEAL:mageName:amountSTATUS:characterName
Simpan kumpulan karakter. Proses setiap perintah dan cetak:
- CREATE_WARRIOR/CREATE_MAGE:
[name] the [characterClass] joins the battle! - ATTACK: Cetak hasil serangan (String yang dikembalikan oleh method attack)
- HEAL: Cetak hasil pemulihan, atau
[name] cannot healjika karakter tersebut bukan Mage - STATUS:
[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]
Setelah semua perintah, cetak
--- Battle Summary ---diikuti status setiap karakter.
Kamu akan menerima satu input: string perintah yang dipisahkan koma.
Contohnya, dengan input CREATE_WARRIOR:Thorin:100:5:15,CREATE_MAGE:Gandalf:80:7:12:50,ATTACK:Thorin:Gandalf,HEAL:Gandalf:25,STATUS:Gandalf, outputmu akan menjadi:
Thorin the Warrior joins the battle!
Gandalf the Mage joins the battle!
Thorin strikes with brute force for 20 damage!
Gandalf takes 20 damage! Health: 60/80
Gandalf channels healing magic! Health: 80/80
Gandalf (Mage) - Level 7 - Health: 80/80 - Alive
--- Battle Summary ---
Thorin (Warrior) - Level 5 - Health: 100/100 - Alive
Gandalf (Mage) - Level 7 - Health: 80/80 - AliveTantangan ini menggabungkan pewarisan (hierarki Character), implementasi beberapa interface (Mage mengimplementasikan Attackable dan Healable), enum dengan method (DamageType), polimorfisme (memperlakukan berbagai jenis karakter secara seragam), dan enkapsulasi (pengelolaan health protected) menjadi sistem game yang menarik!
Coba sendiri
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
import java.util.LinkedHashMap;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Gunakan koleksi untuk menyimpan karakter (LinkedHashMap mempertahankan urutan penyisipan)
// LinkedHashMap<String, Character> characters = new LinkedHashMap<>();
// TODO: Pisahkan input berdasarkan koma untuk mendapatkan setiap perintah
// String[] commands = input.split(",");
// TODO: Proses setiap perintah:
// - CREATE_WARRIOR:name:maxHealth:level:strength
// Cetak: "[name] the Warrior joins the battle!"
//
// - CREATE_MAGE:name:maxHealth:level:intelligence:mana
// Cetak: "[name] the Mage joins the battle!"
//
// - ATTACK:attackerName:targetName
// Cetak hasil serangan dari method attack
//
// - HEAL:mageName:amount
// Cetak hasil penyembuhan, atau "[name] cannot heal" jika bukan Mage
//
// - STATUS:characterName
// Cetak: "[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]"
// TODO: Setelah semua perintah selesai, cetak "--- Battle Summary ---"
// Lalu cetak status setiap karakter
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy14Tantangan Akhir
Platform E-LearningSistem PerbankanPengembangan Karakter GameLayanan Penyewaan Kendaraan3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online