Mini-proyek Bagian 6: Sistem Inventaris

Proyek ini menggunakan bab 26 dan 27: method, sintaks titik dua, pola constructor .new, satu metatable per class. Item dan Inventory mengelola tas berisi barang rampasan.

Yang harus dibangun

Dua class dalam satu file modul:

Item — satu benda yang bisa dikumpulkan.

  • Item.new(name, weight, value) — constructor.
  • Field: name (string), weight (angka), value (angka).
  • Item:describe() — ringkasan satu baris, misalnya "sword (3.5kg, 50g)".

Inventory — wadah untuk menyimpan item.

  • Inventory.new() — constructor; dimulai dengan daftar kosong.
  • Field: items (daftar instance Item).
  • Inventory:add(item) — menambahkan sebuah item.
  • Inventory:remove(name) — menghapus item pertama dengan nama tersebut; mengembalikannya, atau nil jika tidak ada yang cocok.
  • Inventory:list() — mencetak :describe() setiap item di baris tersendiri, lalu baris total di bagian bawah.
  • Inventory:totalWeight() — jumlah semua berat.
  • Inventory:totalValue() — jumlah semua nilai.

main.lua:

  1. Membuat beberapa item.
  2. Membuat inventaris dan menambahkan item-item tersebut.
  3. Menampilkan daftar inventaris.
  4. Menghapus satu item berdasarkan nama.
  5. Menampilkan daftar lagi.
  6. Mencetak total berat dan nilai sebagai ringkasan.

Contoh keluaran:

Inventory (3 items):
  - sword (3.5kg, 50g)
  - shield (5.0kg, 30g)
  - potion (0.2kg, 5g)
  Totals: 8.70kg, 85g

(removed sword)

Inventory (2 items):
  - shield (5.0kg, 30g)
  - potion (0.2kg, 5g)
  Totals: 5.20kg, 35g

Struktur file

Dua file. Seperti di Bagian 5, masuk ke folder proyek terlebih dahulu dengan cd:

cd projects/05-inventory/starter
lua main.lua

File-file (ada di starter/ dan finished/):

  • inventory.lua — mendefinisikan Item dan Inventory, mengembalikan tabel berisi keduanya:

    local M = {}
    M.Item = Item
    M.Inventory = Inventory
    return M
  • main.luarequire modulnya, mengambil kedua class, menjalankan skenario.

Petunjuk

  • Kedua class menggunakan pola __index dari bab 27: dua tabel class, dua metatable, dua constructor.
  • Inventory:remove(name) menelusuri self.items dengan ipairs untuk mencari name yang cocok, lalu table.remove(self.items, i) menghapusnya.
  • Gunakan string.format untuk baris total di Inventory:list: "Totals: %.2fkg, %dg".

Apa saja yang boleh dipakai

Apa pun dari Bagian 2-6: variabel, alur kontrol, fungsi, modul, tabel, method, metatable.

Sudah selesai?

Kalau skenario berjalan lancar dari main.lua, kamu sudah selesai. Selanjutnya: Bab 31 — From Lua to Luau, jembatan menuju Roblox Studio.