Mini-proyek Bagian 6: Pertempuran Monster

Proyek kedua Bagian 6 adalah pertarungan bergiliran yang kecil: dua nilai dari tipe yang sama, masing-masing dengan kesehatannya sendiri, bergantian menyerang sampai salah satunya jatuh. Proyek ini memakai struct, metode pointer, sebuah slice, sebuah map, pemeriksaan error, fmt.Stringer, perulangan, dan sedikit keacakan.

Apa yang harus dibuat

Program yang, ketika dijalankan:

  1. Mendefinisikan struct monster dengan nama, hit point, hit point maksimum, dan kekuatan serangan.
  2. Membuat dua monster, Hero dan Goblin, masing-masing dengan angkanya sendiri.
  3. Mengulang: selama keduanya hidup, yang pertama menyerang yang kedua, lalu (kalau masih berdiri) yang kedua membalas. Setiap serangan memberikan kerusakan acak sampai sebesar kekuatan penyerangnya.
  4. Berhenti ketika HP salah satu monster mencapai 0, dan mencetak pemenangnya.
  5. Mencetak keadaan akhir setiap monster dan total kerusakan yang diberikannya.

Awal sebuah game, dari satu kali jalan yang sebenarnya. Punyamu akan berbeda, karena kerusakannya acak:

-- Round 1 --
Hero hits Goblin for 3. Goblin has 22 HP left.
Goblin hits Hero for 1. Hero has 29 HP left.
-- Round 2 --
Hero hits Goblin for 8. Goblin has 14 HP left.
Goblin hits Hero for 1. Hero has 28 HP left.

Akhir sebuah game yang dimenangkan Hero:

-- Round 7 --
Hero hits Goblin for 3. Goblin has 0 HP left.
Hero wins!
Hero: 13/30 HP, dealt 25 damage
Goblin: 0/25 HP, dealt 17 damage

Dan akhir sebuah game yang dimenangkan Goblin:

-- Round 7 --
Hero hits Goblin for 4. Goblin has 4 HP left.
Goblin hits Hero for 6. Hero has 0 HP left.
Goblin wins!
Hero: 0/30 HP, dealt 21 damage
Goblin: 4/25 HP, dealt 34 damage

Bahan untuk membuatnya

Tipe monster membutuhkan:

  • newMonster(name, hp, attack) mengembalikan *monster dan error. Terjadi error kalau hp atau attack di bawah 1.
  • isAlive() mengembalikan true selama hp di atas 0.
  • hit(other) memberikan kerusakan rand.Intn(m.attack) + 1 kepada monster lain, tidak pernah di bawah 0, mencetak hasilnya, dan mengembalikan kerusakannya.
  • String() mengembalikan teks seperti Hero: 19/30 HP, yang membuat *monster memenuhi fmt.Stringer.

Pertempurannya adalah perulangan dengan syarat hero.isAlive() && goblin.isAlive(), dan pemeriksaan kemenangannya satu if. Total kerusakan disimpan dalam map[string]int dengan nama monster sebagai kuncinya. Di akhir, taruh kedua monster dalam []*monster, ulangi slice itu, dan cetak masing-masing dengan %v dan kerusakan yang diberikannya.

File

Kedua versi ada di projects/monster-battle/:

  • starter.go: komentar TODO untuk tipe, kedua monster, perulangan, dan hasilnya. File ini bisa langsung dijalankan, dan mencetak satu baris pengganti.
  • finished.go: versi yang berjalan, untuk dibandingkan sesudahnya.

Jalankan dengan:

go run projects/monster-battle/starter.go

Petunjuk

  • Tambahkan "math/rand" ke import. rand.Intn adalah fungsi yang sama seperti di Bab 13.
  • rand.Intn membuat program crash kalau argumennya di bawah 1, dan itu salah satu alasan newMonster memeriksa attack.
  • Kerusakan acak berarti setiap kali jalan berlangsung berbeda, tetapi selalu berakhir, karena setiap serangan menurunkan HP minimal 1, dan HP tidak pernah naik lagi.
  • Kedua monster dibagi dengan hit lewat pointer, jadi metodenya butuh receiver pointer. hit mengubah monster lain, bukan receiver-nya sendiri.
  • Buat monster kedua membalas hanya if goblin.isAlive(), supaya yang baru saja pingsan tidak mendapat serangan gratis.
  • Batasi HP dengan if other.hp < 0 supaya HP yang tercetak tidak pernah negatif.
  • dealt[hero.name] += hero.hit(goblin) menambah entri map yang dimulai dari nol, seperti di Bab 23.
  • String punya receiver pointer, jadi metode itu milik *monster. Slice-nya menyimpan pointer, jadi %v menemukannya.

Tantangan lebih besar (opsional)

  • Regu. Taruh tiga monster dalam slice dan buat masing-masing menyerang yang berikutnya, memakai pola dari Bab 28.
  • Serangan kritis. Satu dari lima kali (rand.Intn(5) == 0), gandakan kerusakannya dan cetak Critical!.
  • Interface petarung. Buat tipe kedua, boss yang meng-embed monster dan menyerang dua kali. Deklarasikan interface untuk apa yang dibutuhkan perulangan, seperti di Bab 29, supaya perulangannya berjalan dengan keduanya.

Tidak ada yang wajib supaya proyek ini selesai.

Selesai?

Ketika dua monster bertarung sampai selesai dan pemenang yang benar diumumkan, Bagian 6 selesai. Lanjut ke Bab 31 — Dari Go ke web, awal dari Bagian 7.