Powtórka — system magazynowy
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 67 z 70.
Wyzwanie
ŁatwyZbudujmy kompletny system zarządzania ekwipunkiem w grze fabularnej! Utworzysz hierarchię typów przedmiotów i klasę zarządzającą, która je uporządkuje, łącząc dziedziczenie, polimorfizm i kompozycję w jednym spójnym projekcie.
Podzielisz kod na pięć plików:
Item.lua: Klasa bazowa dla wszystkich przedmiotów. Każdy przedmiot manameivalue(w sztukach złota). Dodaj metodę:getInfo(), która zwraca ciąg znaków w formacie"{name}: {value} gold".Weapon.lua: Wyspecjalizowany przedmiot dziedziczący po Item. Broń ma dodatkowy atrybutdamage. Nadpisz:getInfo(), aby zwracała"{name}: {value} gold, {damage} damage".Potion.lua: Inny wyspecjalizowany przedmiot dziedziczący po Item. Mikstury mają atrybuthealAmount. Nadpisz:getInfo(), aby zwracała"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: Klasa zarządzająca, która przechowuje kolekcję przedmiotów. Dodaj metodę:addItem(item), aby dodawać przedmioty dowolnego typu, metodę:listItems(), która wypisuje:getInfo()dla każdego przedmiotu (po jednym w wierszu), oraz metodę:getTotalValue(), która zwraca sumę wartości wszystkich przedmiotów.main.lua: Połącz wszystko w całość! Utwórz ekwipunek i wypełnij go przedmiotami na podstawie otrzymanych danych wejściowych. Następnie wypisz wszystkie przedmioty i łączną wartość ekwipunku w ostatnim wierszu.
Zaletą tego projektu jest działający w praktyce polimorfizm. Klasa Inventory nie musi wiedzieć, czy przechowuje obiekt Weapon, czy Potion. Po prostu wywołuje :getInfo(), a każdy przedmiot odpowiada odpowiednio do swojego typu.
Otrzymasz sześć danych wejściowych opisujących dwa przedmioty do dodania:
- Typ pierwszego przedmiotu (
"weapon"lub"potion") - Nazwa pierwszego przedmiotu
- Wartość pierwszego przedmiotu (liczba)
- Typ drugiego przedmiotu (
"weapon"lub"potion") - Nazwa drugiego przedmiotu
- Wartość drugiego przedmiotu (liczba)
W przypadku broni użyj stałej wartości obrażeń równej 25. W przypadku mikstur użyj stałej wartości leczenia równej 50.
Po dodaniu obu przedmiotów wywołaj :listItems(), aby wypisać informacje o każdym przedmiocie, a następnie wypisz Total: {value} gold w ostatnim wierszu.
Na przykład jeśli danymi wejściowymi są weapon, Iron Sword, 150, potion, Health Elixir i 75, wynik powinien wyglądać tak:
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldJeśli danymi wejściowymi są potion, Mana Potion, 50, weapon, Steel Axe i 200, wynik powinien wyglądać tak:
Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 goldSpróbuj swoich sił
-- main.lua: Połącz wszystko w całość
local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')
-- Odczytaj dane wejściowe dla pierwszego przedmiotu
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())
-- Odczytaj dane wejściowe dla drugiego przedmiotu
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- Stałe wartości: broń zadaje 25 obrażeń, mikstury przywracają 50 HP
-- TODO: Utwórz ekwipunek
-- TODO: Utwórz pierwszy przedmiot na podstawie type1 ("weapon" lub "potion")
-- i dodaj go do ekwipunku
-- TODO: Utwórz drugi przedmiot na podstawie type2 ("weapon" lub "potion")
-- i dodaj go do ekwipunku
-- TODO: Wywołaj listItems(), aby wypisać informacje o każdym przedmiocie
-- TODO: Wypisz "Total: {value} gold", używając getTotalValue()
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtów9Kompozycja i mixiny
Relacja Has-ADelegowanieProste mixinyStosowanie wielu mixinówMixiny a dziedziczeniePodsumowanie — składanie robota12Końcowe wyzwania
Powtórka — system magazynowyPowtórka — menedżer użytkownikówPowtórka — śledzenie wynikówKońcowy sprawdzian z OOPPoćwicz samodzielnie: Kompilator Lua online