Menu
Coddy logo textTech

Oyun Karakteri Geliştirme

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 90 / 91.

challenge icon

Görev

Kolay

Farklı karakter sınıflarının benzersiz yetenekleri kullanarak savaştığı bir Oyun Karakteri Geliştirme sistemi oluşturalım. Kalıtım, arayüzler, trait'ler ve kapsüllemenin bir oyun bağlamında birlikte nasıl çalıştığını göstermek için deneyim ve seviye atlama sistemine sahip bir karakter hiyerarşisi oluşturacaksın.

Kodunu altı dosyaya ayıracaksın:

  • Ability.php: İki metoda sahip bir Ability arayüzü tanımla: getName(): string ve use(Character $target): string. Bu sözleşme, belirli etkilerinden bağımsız olarak tüm yeteneklerin tutarlı bir şekilde kullanılabilmesini sağlar.
  • CombatLogger.php: Bir CombatLogger trait'i oluştur ve logAction(string $action): string metodunu sağla. Bu metot, eylem dizesinin başına "[COMBAT] " ekleyerek geri döndürmelidir. Karakterler, savaş mesajlarını tutarlı bir biçimde biçimlendirmek için bu trait'i kullanacaktır.
  • Character.php: Ability ve CombatLogger dosyalarını dahil et. CombatLogger trait'ini kullanan soyut bir Character sınıfı oluştur. name (string, public readonly) için yapıcı terfisini kullan. health (int, 100 ile başlayan), level (int, 1 ile başlayan) ve experience (int, 0 ile başlayan) için private özellikler ekle. Şunları uygula:
    • getHealth(): int ve getLevel(): int: private özellikler için getter'lar
    • takeDamage(int $amount): void: canı azaltır ancak 0'ın altına düşürmez
    • heal(int $amount): void: canı artırır ancak 100'ün üzerine çıkarmaz
    • gainExperience(int $xp): string: XP ekler; deneyim 100 veya daha fazlasına ulaşırsa seviye atlatır (XP'yi 0'a sıfırlar, seviyeyi artırır, 20 HP iyileştirir), "[name] leveled up to [level]!" döndürür; aksi takdirde "[name] gained [xp] XP" döndürür
    • isAlive(): bool: can 0'dan büyükse true döndürür
    • abstract getSpecialAbility(): Ability: her karakter türü kendi benzersiz yeteneğini sağlar
    • attack(Character $target): string: hedefe 10 hasar verir, logAction() kullanarak "[COMBAT] [name] attacks [target name] for 10 damage" döndürür
  • Warrior.php: Character dosyasını dahil et. Character sınıfını genişleten bir Warrior sınıfı oluştur. getSpecialAbility() metodunu, Ability arayüzünü uygulayan anonim bir sınıf döndürecek şekilde uygula:
    • getName() "Shield Bash" döndürür
    • use() 25 hasar verir ve "[COMBAT] Shield Bash hits [target name] for 25 damage!" döndürür (trait'in logAction() metodunu kullan)
  • Mage.php: Character dosyasını dahil et. Character sınıfını genişleten bir Mage sınıfı oluştur. getSpecialAbility() metodunu, Ability arayüzünü uygulayan anonim bir sınıf döndürecek şekilde uygula:
    • getName() "Fireball" döndürür
    • use() 35 hasar verir ve "[COMBAT] Fireball engulfs [target name] for 35 damage!" döndürür
  • main.php: Warrior ve Mage dosyalarını dahil et. İki girdi alacaksın: karakter verileri (JSON) ve bir dizi savaş eylemi (JSON).

    Karakterlerin JSON biçimi:

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

    Eylemlerin JSON biçimi:

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

    Tüm karakterleri oluştur ve bir dizide sakla (indeks 0, 1 vb.). Her eylemi işle:

    • "attack": attacker indeksindeki karakter hedefe saldırır; sonucu yazdır
    • "special": karakter özel yeteneğini hedef üzerinde kullanır; sonucu yazdır
    • "xp": karakter deneyim kazanır; sonucu yazdır
    • "heal": karakter verilen miktar kadar iyileşir; "[name] healed to [health] HP" yazdır
    • "status": "[name] - Level [level], HP: [health], Alive: [Yes/No]" yazdır

    Her sonucu yeni bir satıra yazdır.

Bu sistem; soyut sınıfların paylaşılan karakter davranışlarını nasıl tanımladığını, arayüzlerin yeteneklerin tutarlı bir sözleşmeye uymasını nasıl sağladığını, trait'lerin yeniden kullanılabilir günlük kaydı işlevselliği sunduğunu ve anonim sınıfların kod tabanını tek kullanımlık sınıflarla karmaşıklaştırmadan benzersiz yetenek uygulamalarının nasıl oluşturulacağını gösterir.

Kendin dene

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

// Girişi oku
$charactersJson = trim(fgets(STDIN));
$actionsJson = trim(fgets(STDIN));

// JSON girdilerini ayrıştır
$charactersData = (array)json_decode($charactersJson, true);
$actionsData = (array)json_decode($actionsJson, true);

// TODO: Karakter nesnelerini saklamak için bir dizi oluştur
$characters = [];

// TODO: $charactersData üzerinde döngü yap ve Warrior veya Mage nesneleri oluştur
// "type" alanına göre, bunları $characters dizisinde sakla

// TODO: $actionsData içindeki her eylemi işle
// Bu eylem türlerini işle:
// - "attack": Saldırgan indeksindeki karakter hedefe saldırır; sonucu yazdır
// - "special": Karakter hedef üzerinde getSpecialAbility()->use() kullanır; sonucu yazdır
// - "xp": Karakter deneyim kazanır; sonucu yazdır
// - "heal": Karakter iyileşir; "[name] healed to [health] HP" yazdır
// - "status": "[name] - Level [level], HP: [health], Alive: [Yes/No]" yazdır

?>

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi