Menu
CoddyTech

Pengembangan Karakter Game

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 90 dari 91.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem Pengembangan Karakter Game yang memungkinkan berbagai class karakter bertarung menggunakan kemampuan unik. Kamu akan membuat hierarki karakter dengan sistem pengalaman dan kenaikan level, untuk menunjukkan cara pewarisan, interface, trait, dan enkapsulasi bekerja bersama dalam konteks game.

Kamu akan mengatur kodemu dalam enam file:

  • Ability.php: Definisikan interface Ability dengan dua method: getName(): string dan use(Character $target): string. Kontrak ini memastikan semua kemampuan dapat digunakan secara konsisten, terlepas dari efek spesifiknya.
  • CombatLogger.php: Buat trait CombatLogger yang menyediakan method logAction(string $action): string. Method ini harus mengembalikan string aksi yang diawali dengan "[COMBAT] ". Karakter akan menggunakan trait ini untuk memformat pesan pertarungan secara konsisten.
  • Character.php: Sertakan file Ability dan CombatLogger. Buat class abstrak Character yang menggunakan trait CombatLogger. Gunakan promosi constructor untuk name (string, public readonly). Sertakan property privat untuk health (int, dimulai dari 100), level (int, dimulai dari 1), dan experience (int, dimulai dari 0). Implementasikan:
    • getHealth(): int dan getLevel(): int: getter untuk property privat
    • takeDamage(int $amount): void: mengurangi health, tetapi tidak pernah kurang dari 0
    • heal(int $amount): void: menambah health, tetapi tidak pernah lebih dari 100
    • gainExperience(int $xp): string: menambahkan XP; jika experience mencapai 100 atau lebih, naikkan level (atur ulang XP ke 0, naikkan level, pulihkan 20 HP), lalu kembalikan "[name] leveled up to [level]!"; jika tidak, kembalikan "[name] gained [xp] XP"
    • isAlive(): bool: mengembalikan true jika health lebih besar dari 0
    • abstract getSpecialAbility(): Ability: setiap jenis karakter menyediakan kemampuan uniknya
    • attack(Character $target): string: memberikan 10 damage kepada target, menggunakan logAction() untuk mengembalikan "[COMBAT] [name] attacks [target name] for 10 damage"
  • Warrior.php: Sertakan file Character. Buat class Warrior yang mewarisi Character. Implementasikan getSpecialAbility() agar mengembalikan class anonim yang mengimplementasikan Ability:
    • getName() mengembalikan "Shield Bash"
    • use() memberikan 25 damage dan mengembalikan "[COMBAT] Shield Bash hits [target name] for 25 damage!" (gunakan logAction() dari trait)
  • Mage.php: Sertakan file Character. Buat class Mage yang mewarisi Character. Implementasikan getSpecialAbility() agar mengembalikan class anonim yang mengimplementasikan Ability:
    • getName() mengembalikan "Fireball"
    • use() memberikan 35 damage dan mengembalikan "[COMBAT] Fireball engulfs [target name] for 35 damage!"
  • main.php: Sertakan file Warrior dan Mage. Kamu akan menerima dua input: data karakter (JSON) dan rangkaian aksi pertarungan (JSON).

    Format JSON karakter:

    [{"type": "warrior", "name": "Thorin"}, {"type": "mage", "name": "Gandalf"}]

    Format JSON aksi:

    [{"action": "attack", "attacker": 0, "target": 1}, {"action": "special", "attacker": 1, "target": 0}, {"action": "xp", "character": 0, "amount": 100}, {"action": "status", "character": 0}]

    Buat semua karakter dan simpan dalam array (indeks 0, 1, dan seterusnya). Proses setiap aksi:

    • "attack": Karakter pada indeks attacker menyerang target; cetak hasilnya
    • "special": Karakter menggunakan kemampuan khususnya pada target; cetak hasilnya
    • "xp": Karakter mendapatkan pengalaman; cetak hasilnya
    • "heal": Karakter memulihkan health sebesar nilai yang diberikan; cetak "[name] healed to [health] HP"
    • "status": Cetak "[name] - Level [level], HP: [health], Alive: [Yes/No]"

    Cetak setiap hasil pada baris baru.

Sistem ini menunjukkan cara class abstrak mendefinisikan perilaku karakter bersama, interface memastikan kemampuan mengikuti kontrak yang konsisten, trait menyediakan fungsi pencatatan yang dapat digunakan kembali, dan class anonim membuat implementasi kemampuan unik tanpa memenuhi codebase-mu dengan class yang hanya digunakan sekali.

Coba sendiri

<?php
require_once 'Warrior.php';
require_once 'Mage.php';

// Baca input
$charactersJson = trim(fgets(STDIN));
$actionsJson = trim(fgets(STDIN));

// Uraikan input JSON
$charactersData = (array)json_decode($charactersJson, true);
$actionsData = (array)json_decode($actionsJson, true);

// TODO: Buat array untuk menyimpan object karakter
$characters = [];

// TODO: Lakukan perulangan pada $charactersData dan buat object Warrior atau Mage
// berdasarkan field "type", lalu simpan dalam array $characters

// TODO: Proses setiap aksi dalam $actionsData
// Tangani jenis aksi berikut:
// - "attack": Karakter pada indeks penyerang menyerang target; cetak hasilnya
// - "special": Karakter menggunakan getSpecialAbility()->use() pada target; cetak hasilnya
// - "xp": Karakter memperoleh pengalaman; cetak hasilnya
// - "heal": Karakter memulihkan kesehatan; cetak "[name] healed to [health] HP"
// - "status": Cetak "[name] - Level [level], HP: [health], Alive: [Yes/No]"

?>

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online