Menu
Coddy logo textTech

Oyun Karakteri Geliştirme

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 86 / 87.

Bu meydan okuma, karmaşık ve etkileşimli varlıkları modellemede OOP'nin gücünü sergileyen bir Oyun Karakteri Geliştirme sistemi oluşturmanızı sağlar.

Bir temel Character sınıfının sağlık, ad ve seviye gibi ortak öznitelikleri tanımladığı bir karakter hiyerarşisi tasarlayın. Warrior, Mage ve Archer gibi özelleştirilmiş sınıflar, benzersiz yetenekler ve savaş tarzlarıyla bu temeli genişletir.

Arayüzler burada doğal bir şekilde çalışır: Attackable savaş yöntemlerini tanımlayabilirken, Healable iyileştirme yeteneklerini ele alır. Bir Mage her ikisini de uygulayabilirken, bir Warrior yalnızca saldırmaya odaklanır.

Farklı saldırı davranışları için Strategy kalıbını kullanmayı düşünün; bu, karakterlerin savaş stillerini dinamik olarak değiştirmesine olanak tanır. State kalıbı, davranışı etkileyen normal, poisoned veya stunned durumları gibi karakter koşullarını yönetebilir.

Karakterlerin silahları ve zırhları miras almak yerine onlara "sahip olduğu" ekipman sistemleri için bileşimi düşünün. Karakter sınıfları veya hasar türleri için enum'ları kullanın ve istatistikleri geçersiz değişikliklerden korumak için kapsüllemeyi uygulayın.

challenge icon

Görev

Kolay

Karmaşık, etkileşimli oyun varlıklarını modellemede OOP'nin gücünü sergileyen bir Oyun Karakteri Geliştirme sistemi oluşturalım! Farklı savaş stillerine, özel yeteneklere ve karakterlerin nasıl davrandığını etkileyen bir durum sistemine sahip bir karakter hiyerarşisi oluşturacaksınız.

Kodunuzu yedi dosyaya düzenleyeceksiniz:

  • DamageType.java: Oyundaki farklı hasar türlerini temsil eden bir enum oluşturun. PHYSICAL, MAGICAL ve RANGED değerlerini ekleyin. description (String) adlı özel bir alan, bunu ayarlayan bir oluşturucu ve bir getter ekleyin. Fiziksel hasarın açıklaması "brute force", büyülü hasarın açıklaması "arcane energy" ve menzilli hasarın açıklaması "precision strike" olmalıdır.
  • Attackable.java: Savaş yeteneklerini tanımlayan bir arayüz oluşturun. Saldırıyı açıklayan bir String döndüren attack(Character target) ve bir DamageType döndüren getDamageType() metotlarını bildirin.
  • Healable.java: İyileştirme yetenekleri için bir arayüz oluşturun. İyileştirme eylemini açıklayan bir String döndüren heal(int amount) metodunu bildirin.
  • Character.java: Tüm oyun karakterleri için soyut bir temel sınıf oluşturun. name (String), health (int), maxHealth (int) ve level (int) için özel alanlar ekleyin. Oluşturucu name, maxHealth ve level değerlerini almalı ve başlangıçta health değerini maxHealth değerine eşitlemelidir. Tüm alanlar için getter'lar ekleyin. health değerinin 0 ile maxHealth arasında kalmasını sağlayan korumalı bir setHealth(int health) metodu ekleyin. Sağlığı azaltan ve takeDamage(int damage) döndüren bir "[name] takes [damage] damage! Health: [health]/[maxHealth]" metodu oluşturun. health değeri 0'dan büyükse true döndüren bir isAlive() metodu ekleyin. String döndüren soyut bir getCharacterClass() metodu bildirin.
  • Warrior.java: Character sınıfını genişleten ve Attackable uygulayan bir sınıf oluşturun. strength (int) adlı özel bir alan ekleyin. Oluşturucu name, maxHealth, level ve strength değerlerini almalıdır. getCharacterClass() metodunu "Warrior" döndürecek şekilde uygulayın. getDamageType() metodunu PHYSICAL döndürecek şekilde uygulayın. attack(Character target) metodunda strength artı level değerine eşit hasar verin, hedefin takeDamage metodunu çağırın ve ardından yeni satır ile takeDamage sonucunu izleyen "[name] strikes with [damageType description] for [damage] damage!" değerini döndürün.
  • Mage.java: Character sınıfını genişleten ve hem Attackable hem de Healable uygulayan bir sınıf oluşturun. intelligence (int) ve mana (int) adlı özel alanları ekleyin. Oluşturucu name, maxHealth, level, intelligence ve mana değerlerini almalıdır. getCharacterClass() metodunu "Mage" döndürecek şekilde uygulayın. getDamageType() metodunu MAGICAL döndürecek şekilde uygulayın. attack(Character target) metodunda intelligence değerinin 2 katına eşit hasar verin ve Warrior ile aynı biçimi izleyin. heal(int amount) metodunda (setHealth kullanarak) sağlığı geri yükleyin ve "[name] channels healing magic! Health: [health]/[maxHealth]" değerini döndürün.
  • Main.java: Oyun sisteminizi hayata geçirin! Virgülle ayrılmış bir komut dizisi alacaksınız:
    • CREATE_WARRIOR:name:maxHealth:level:strength
    • CREATE_MAGE:name:maxHealth:level:intelligence:mana
    • ATTACK:attackerName:targetName
    • HEAL:mageName:amount
    • STATUS:characterName

    Bir karakter koleksiyonu tutun. Her komutu işleyin ve şunları yazdırın:

    • CREATE_WARRIOR/CREATE_MAGE: [name] the [characterClass] joins the battle!
    • ATTACK: Saldırı sonucunu yazdırın (attack metodu tarafından döndürülen String)
    • HEAL: İyileştirme sonucunu veya karakter bir Mage değilse [name] cannot heal değerini yazdırın
    • STATUS: [name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]

    Tüm komutlardan sonra --- Battle Summary --- satırını ve ardından her karakterin durumunu yazdırın.

Tek bir girdi alacaksınız: virgülle ayrılmış komut dizisi.

Örneğin, girdi CREATE_WARRIOR:Thorin:100:5:15,CREATE_MAGE:Gandalf:80:7:12:50,ATTACK:Thorin:Gandalf,HEAL:Gandalf:25,STATUS:Gandalf olduğunda çıktınız şöyle olacaktır:

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

Bu meydan okuma; kalıtımı (Character hiyerarşisi), birden fazla arayüz uygulamasını (Mage hem Attackable hem de Healable uygular), metotlara sahip enum'ları (DamageType), çok biçimliliği (farklı karakter türlerini tek biçimde ele alma) ve kapsüllemeyi (korumalı sağlık yönetimi) ilgi çekici bir oyun sisteminde bir araya getirir!

Kendin dene

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: Karakterleri tutmak için bir koleksiyon kullan (LinkedHashMap ekleme sırasını korur)
        // LinkedHashMap<String, Character> characters = new LinkedHashMap<>();
        
        // TODO: Bireysel komutları almak için girdiyi virgülle ayır
        // String[] commands = input.split(",");
        
        // TODO: Her komutu işle:
        // - CREATE_WARRIOR:name:maxHealth:level:strength
        //   Print: "[name] the Warrior joins the battle!"
        // 
        // - CREATE_MAGE:name:maxHealth:level:intelligence:mana
        //   Print: "[name] the Mage joins the battle!"
        // 
        // - ATTACK:attackerName:targetName
        //   Saldırı sonucunu attack metodundan yazdır
        // 
        // - HEAL:mageName:amount
        //   İyileştirme sonucunu yazdır, veya Mage değilse "[name] cannot heal"
        // 
        // - STATUS:characterName
        //   Yazdır: "[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]"
        
        // TODO: After all commands, print "--- Battle Summary ---"
        // Ardından her karakterin durumunu yazdır
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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

Kendi başına pratik yap: Online Java derleyicisi