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:
- Mendefinisikan struct
monsterdengan nama, hit point, hit point maksimum, dan kekuatan serangan. - Membuat dua monster, Hero dan Goblin, masing-masing dengan angkanya sendiri.
- 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.
- Berhenti ketika HP salah satu monster mencapai
0, dan mencetak pemenangnya. - 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*monsterdan error. Terjadi error kalauhpatauattackdi bawah 1.isAlive()mengembalikantrueselamahpdi atas 0.hit(other)memberikan kerusakanrand.Intn(m.attack) + 1kepada monster lain, tidak pernah di bawah0, mencetak hasilnya, dan mengembalikan kerusakannya.String()mengembalikan teks sepertiHero: 19/30 HP, yang membuat*monstermemenuhifmt.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.Intnadalah fungsi yang sama seperti di Bab 13. rand.Intnmembuat program crash kalau argumennya di bawah 1, dan itu salah satu alasannewMonstermemeriksaattack.- 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
hitlewat pointer, jadi metodenya butuh receiver pointer.hitmengubah 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 < 0supaya HP yang tercetak tidak pernah negatif. dealt[hero.name] += hero.hit(goblin)menambah entri map yang dimulai dari nol, seperti di Bab 23.Stringpunya receiver pointer, jadi metode itu milik*monster. Slice-nya menyimpan pointer, jadi%vmenemukannya.
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 cetakCritical!. - Interface petarung. Buat tipe kedua,
bossyang meng-embedmonsterdan 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.