Özet - Envanter Sistemi
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama 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 oluşturalım! Öğe türlerinden oluşan bir hiyerarşi ve bunları düzenlemek için bir yönetici sınıfı oluşturacaksın: kalıtım, çok biçimlilik ve bileşimi tek bir bütünlüklü projede bir araya getireceksin.
Kodunu beş dosyaya ayıracaksın:
Item.lua: Tüm öğeler için temel sınıf. Her öğenin birnameve birvalue(altın paraları cinsinden) değeri vardır.:getInfo()biçiminde bir dize döndüren bir"{name}: {value} gold"yöntemi ekle.Weapon.lua: Item sınıfından miras alan özelleştirilmiş bir öğe. Silahların ek birdamageözniteliği vardır.:getInfo()yöntemini,"{name}: {value} gold, {damage} damage"döndürecek şekilde geçersiz kıl.Potion.lua: Item sınıfından miras alan başka bir özelleştirilmiş öğe. İksirlerin birhealAmountözniteliği vardır.:getInfo()yöntemini,"{name}: {value} gold, heals {healAmount} HP"döndürecek şekilde geçersiz kıl.Inventory.lua: Bir öğe koleksiyonu depolayan bir yönetici sınıfı. Her türden öğeyi eklemek için bir:addItem(item)yöntemi, her öğe için:listItems()çıktısını (satır başına bir tane) yazdıran bir:getInfo()yöntemi ve tüm öğe değerlerinin toplamını döndüren bir:getTotalValue()yöntemi ekle.main.lua: Her şeyi bir araya getir! Bir envanter oluştur ve aldığın girdilere göre öğelerle doldur. Ardından tüm öğeleri listele ve son satırda toplam envanter değerini yazdır.
Bu tasarımın güzelliği, çok biçimliliği uygulamalı olarak göstermesidir. Inventory'ın bir Weapon mı yoksa Potion mı depoladığını bilmesine gerek yoktur. Yalnızca :getInfo() yöntemini çağırır ve her öğe türüne göre uygun şekilde yanıt verir.
Eklenecek iki öğeyi açıklayan altı girdi alacaksın:
- İlk öğe türü (
"weapon"veya"potion") - İlk öğe adı
- İlk öğ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 bir 25 hasar değeri kullan. İksirler için sabit bir 50 iyileştirme miktarı kullan.
Her iki öğeyi ekledikten sonra, her öğenin bilgilerini yazdırmak için :listItems() yöntemini çağır; ardından son satıra Total: {value} gold yazdır.
Örneğin girdiler weapon, Iron Sword, 150, potion, Health Elixir ve 75 ise çıktı şöyle 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ı şöyle 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 hasara sahip, iksirler 50 HP iyileştirir
-- TODO: Bir envanter oluştur
-- TODO: type1'e göre ilk öğeyi oluştur ("weapon" veya "potion")
-- ve onu envantere ekle
-- TODO: type2'ye göre ikinci öğeyi oluştur ("weapon" veya "potion")
-- ve onu envantere ekle
-- TODO: Her öğenin bilgisini yazdırmak için listItems() çağır
-- TODO: getTotalValue() kullanarak "Total: {value} gold" yazdır
Nesne Yönelimli Programlama 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üKendi başına pratik yap: Online Lua derleyicisi