Özet - Envanter Sistemi
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 67 / 70.
Görev
KolayBir rol yapma oyunu için eksiksiz bir envanter yönetim sistemi kuralım! Kalıtım, polimorfizm ve kompozisyonu tek bir uyumlu projede bir araya getirerek, öğe türlerinden oluşan bir hiyerarşi ve bunları organize etmek için bir yönetici sınıfı oluşturacaksınız.
Kodunuzu beş dosya halinde düzenleyeceksiniz:
Item.lua: Tüm öğeler için temel sınıf. Her öğenin birnameve birvalue(altın para cinsinden) değeri vardır."{name}: {value} gold"formatında bir dize döndüren bir:getInfo()metodu ekleyin.Weapon.lua: Item sınıfından miras alan özelleşmiş bir öğe. Silahların ek birdamageözniteliği vardır."{name}: {value} gold, {damage} damage"döndürecek şekilde:getInfo()metodunu geçersiz kılın (override).Potion.lua: Item sınıfından miras alan başka bir özelleşmiş öğe. İksirlerin birhealAmountözniteliği vardır."{name}: {value} gold, heals {healAmount} HP"döndürecek şekilde:getInfo()metodunu geçersiz kılın (override).Inventory.lua: Bir öğe koleksiyonunu saklayan bir yönetici sınıfı. Herhangi bir türde öğe eklemek için bir:addItem(item)metodu, her öğe için:getInfo()sonucunu yazdıran (her satıra bir tane) bir:listItems()metodu ve tüm öğe değerlerinin toplamını döndüren bir:getTotalValue()metodu ekleyin.main.lua: Her şeyi bir araya getirin! Bir envanter oluşturun ve aldığınız girdilere göre onu öğelerle doldurun. Ardından tüm öğeleri listeleyin ve son satırda toplam envanter değerini yazdırın.
Bu tasarımın güzelliği polimorfizmin iş başında olmasıdır; Inventory sınıfınızın bir Weapon mı yoksa bir Potion mı sakladığını bilmesine gerek yoktur. Sadece :getInfo() metodunu çağırır ve her öğe kendi türüne göre uygun şekilde yanıt verir.
Eklenecek iki öğeyi tanımlayan altı girdi alacaksınız:
- Birinci öğe türü (
"weapon"veya"potion") - Birinci öğe adı
- Birinci öğe değeri (bir sayı)
- İkinci öğe türü (
"weapon"veya"potion") - İkinci öğe adı
- İkinci öğe değeri (bir sayı)
Silahlar için sabit 25 hasar (damage) kullanın. İksirler için sabit 50 iyileştirme miktarı (heal amount) kullanın.
Her iki öğeyi de ekledikten sonra, her öğenin bilgisini yazdırmak için :listItems() metodunu çağırın, ardından son satıra Total: {value} gold yazdırın.
Örneğin, girdiler weapon, Iron Sword, 150, potion, Health Elixir ve 75 ise çıktı şu şekilde olmalıdır:
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldGirdiler potion, Mana Potion, 50, weapon, Steel Axe ve 200 ise çıktı şu şekilde olmalıdır:
Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 goldKendin dene
-- main.lua: Her şeyi bir araya getir
local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')
-- İlk öğe için girdileri oku
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())
-- İkinci öğe için girdileri oku
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- Sabit değerler: silahlar 25 hasar verir, iksirler 50 HP iyileştirir
-- TODO: Bir envanter oluştur
-- TODO: type1'e göre ("weapon" veya "potion") ilk öğeyi oluştur
-- ve envantere ekle
-- TODO: type2'ye göre ("weapon" veya "potion") ikinci öğeyi oluştur
-- ve envantere ekle
-- TODO: Her öğenin bilgisini yazdırmak için listItems() fonksiyonunu çağır
-- TODO: getTotalValue() kullanarak "Total: {value} gold" yazdır
Object Oriented Programming bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi9Kompozisyon ve Mixin'ler
Has-A İlişkisiDelegasyonBasit Mixin'lerBirden Fazla Mixin UygulamaMixin'ler ve KalıtımÖzet - Robot Birleştirme12Son Görevler
Özet - Envanter SistemiÖzet - Kullanıcı YöneticisiÖzet - Skor TakipçisiFinal OOP Kontrolü