Menu
Coddy logo textTech

Powtórka — system magazynowy

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 67 z 70.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 ma name i value (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 atrybut damage. Nadpisz :getInfo(), aby zwracała "{name}: {value} gold, {damage} damage".
  • Potion.lua: Inny wyspecjalizowany przedmiot dziedziczący po Item. Mikstury mają atrybut healAmount. 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:

  1. Typ pierwszego przedmiotu ("weapon" lub "potion")
  2. Nazwa pierwszego przedmiotu
  3. Wartość pierwszego przedmiotu (liczba)
  4. Typ drugiego przedmiotu ("weapon" lub "potion")
  5. Nazwa drugiego przedmiotu
  6. 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 gold

Jeś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 gold

Spró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

Poćwicz samodzielnie: Kompilator Lua online