Mini-proyek Bagian 6: Monster Battle

Proyek kedua di Bagian 6 ini adalah pertarungan berbasis giliran yang sederhana: dua instance dari class yang sama, masing-masing punya HP sendiri, saling serang bergantian sampai salah satu jatuh. Proyek ini menggabungkan class, method, perulangan while, dan sedikit keacakan.

Yang harus dibuat

Sebuah program yang, saat dijalankan:

  1. Mendefinisikan class Monster dengan nama, hit points, dan kekuatan serangan.
  2. Membuat dua monster — misalnya Hero dan Goblin — masing-masing dengan angka-angkanya sendiri.
  3. Melakukan perulangan: selama keduanya masih hidup, monster pertama menyerang monster kedua, lalu (jika masih berdiri) monster kedua membalas. Setiap serangan melakukan kerusakan acak hingga sebesar kekuatan si penyerang.
  4. Berhenti ketika HP salah satu monster mencapai 0, dan mencetak pemenangnya.

Contoh satu ronde:

-- Round 3 --
Hero hits Goblin for 5. Goblin has 4 HP left.
Goblin hits Hero for 2. Hero has 19 HP left.

Bahan pembuatnya

Class Monster membutuhkan:

  • Monster.new(name, hp, attack) — konstruktor.
  • :isAlive() — mengembalikan true selama hp > 0.
  • :hit(other) — memberikan kerusakan sebesar math.random(1, self.attack) kepada monster lain, tidak pernah di bawah 0, dan mencetak hasilnya.

Pertarungan adalah perulangan while kedua masih hidup; pengecekan pemenang cukup satu if.

File-file

Kedua versi ada di projects/monster-battle/:

  • starter.lua — komentar TODO untuk class, dua monster, perulangan, dan hasilnya.
  • finished.lua — versi yang sudah jadi untuk dibandingkan setelahnya.

Jalankan dengan:

lua projects/monster-battle/starter.lua

Petunjuk

  • Kerusakan acak berarti setiap jalannya program akan berbeda — tapi selalu berakhir, karena setiap serangan menurunkan HP dan HP tidak pernah naik kembali.
  • Biarkan monster kedua membalas hanya if other:isAlive(), supaya yang baru saja pingsan tidak dapat serangan gratis.
  • Klem HP dengan if other.hp < 0 then other.hp = 0 end agar HP yang tercetak tidak pernah negatif.

Tantangan lebih besar (opsional)

  • Sebuah regu. Masukkan tiga monster ke dalam sebuah list dan buat masing-masing menyerang yang berikutnya, menggunakan pola "banyak objek" dari Bab 28.
  • Critical hit. Satu dari lima kali (math.random(1, 5) == 1), gandakan kerusakan dan cetak Critical!.

Keduanya tidak wajib untuk menyelesaikan proyek ini.

Sudah selesai?

Ketika dua monster bertarung sampai tuntas dan pemenang yang tepat diumumkan, Bagian 6 sudah selesai. Lanjut ke Bab 31 — From Lua to Luau, jembatan menuju Roblox.