Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 nilai PHYSICAL, MAGICAL, dan RANGED. Tambahkan field privat description (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 method attack(Character target) yang mengembalikan String untuk menjelaskan serangan, dan getDamageType() yang mengembalikan DamageType.
  • Healable.java: Buat interface untuk kemampuan pemulihan. Deklarasikan method heal(int amount) yang mengembalikan String untuk menjelaskan tindakan pemulihan.
  • Character.java: Buat class dasar abstrak untuk semua karakter game. Sertakan field privat untuk name (String), health (int), maxHealth (int), dan level (int). Constructor menerima name, maxHealth, dan level, lalu menetapkan health sama dengan maxHealth pada awalnya. Sertakan getter untuk semua field. Tambahkan method protected setHealth(int health) yang memastikan health tetap di antara 0 dan maxHealth. Buat method takeDamage(int damage) yang mengurangi health dan mengembalikan "[name] takes [damage] damage! Health: [health]/[maxHealth]". Tambahkan method isAlive() yang mengembalikan true jika health lebih besar dari 0. Deklarasikan method abstrak getCharacterClass() yang mengembalikan String.
  • Warrior.java: Buat class yang mewarisi Character dan mengimplementasikan Attackable. Tambahkan field privat strength (int). Constructor menerima name, maxHealth, level, dan strength. Implementasikan getCharacterClass() agar mengembalikan "Warrior". Implementasikan getDamageType() agar mengembalikan PHYSICAL. Implementasikan attack(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 privat intelligence (int) dan mana (int). Constructor menerima name, maxHealth, level, intelligence, dan mana. Implementasikan getCharacterClass() agar mengembalikan "Mage". Implementasikan getDamageType() agar mengembalikan MAGICAL. Implementasikan attack(Character target) agar memberikan damage sebesar intelligence dikalikan 2, dengan format yang sama seperti Warrior. Implementasikan heal(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:strength
    • CREATE_MAGE:name:maxHealth:level:intelligence:mana
    • ATTACK:attackerName:targetName
    • HEAL:mageName:amount
    • STATUS: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 heal jika 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 - Alive

Tantangan 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
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online