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.
Görev
KolayKarmaşı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,MAGICALveRANGEDdeğ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ürenattack(Character target)ve bir DamageType döndürengetDamageType()metotlarını bildirin.Healable.java: İyileştirme yetenekleri için bir arayüz oluşturun. İyileştirme eylemini açıklayan bir String döndürenheal(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) velevel(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ı birsetHealth(int health)metodu ekleyin. Sağlığı azaltan vetakeDamage(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 birisAlive()metodu ekleyin. String döndüren soyut birgetCharacterClass()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()metodunuPHYSICALdö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) vemana(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()metodunuMAGICALdö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:strengthCREATE_MAGE:name:maxHealth:level:intelligence:manaATTACK:attackerName:targetNameHEAL:mageName:amountSTATUS: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 healdeğ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 - AliveBu 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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi