28. Banyak objek sekaligus — Solusi PR

File solusi ada di exercises/28/homework/solutions/. Keempat soal menggunakan class Hero kecil yang sama dari bagian atas masing-masing file starter.

Soal 1 — Regu para pahlawan

Soal. Buat daftar tiga pahlawan lalu cetak masing-masing.

Solusi.

local party = {
    Hero.new("Ada", 100),
    Hero.new("Ben", 80),
    Hero.new("Cara", 120),
}

for _, h in ipairs(party) do
    print(h.name .. ": " .. h.hp .. " HP")
end

Keluaran:

Ada: 100 HP
Ben: 80 HP
Cara: 120 HP

Soal 2 — Total HP

Soal. Jumlahkan HP semua anggota regu.

Solusi.

local total = 0
for _, h in ipairs(party) do
    total = total + h.hp
end
print("Team HP: " .. total)   -- Team HP: 300

Ini adalah pola akumulasi dari Bab 20, hanya saja sekarang kita membaca sebuah field alih-alih angka biasa.

Soal 3 — Siapa yang terluka?

Soal. Cetak setiap pahlawan yang hp-nya di bawah max_hp mereka.

Solusi.

for _, h in ipairs(party) do
    if h.hp < h.max_hp then
        print(h.name .. " is hurt.")
    end
end

Hanya pahlawan yang sudah menerima kerusakan yang dicetak. Pernyataan if membandingkan dua field dari objek yang sama.

Tantangan — Pahlawan terkuat

Soal. Temukan pahlawan dengan HP terbanyak.

Cara memikirkannya. Akumulasikan sebuah nilai maksimum: simpan sebuah variabel untuk pahlawan terbaik sejauh ini, lalu ganti setiap kali ada yang lebih kuat. Mulai dengan pahlawan pertama (atau nil yang diisi pada giliran pertama).

Solusi.

local strongest = party[1]
for _, h in ipairs(party) do
    if h.hp > strongest.hp then
        strongest = h
    end
end
print("Strongest: " .. strongest.name)   -- Strongest: Cara

Kesalahan umum.

  • Memulai strongest dengan nil, lalu menulis h.hp > strongest.hp pada giliran pertama akan mencoba membaca nil.hp dan menghasilkan error. Mulailah dengan pahlawan pertama, atau tangani giliran pertama secara khusus.

Selesai?

Kamu sekarang bisa mengelola seluruh koleksi objek menggunakan perulangan yang sudah kamu kuasai. Selanjutnya, Pewarisan lebih dalam memungkinkan satu class dibangun di atas class lain, sehingga perilaku yang sama cukup ditulis sekali saja.