Sistem Karakter Game
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 107 dari 107.
Tantangan
MudahMari bangun Sistem Karakter Game yang menggabungkan embedding struct, interface, dan pola Strategi untuk membuat mekanika pertarungan yang fleksibel! Kamu akan merancang berbagai tipe karakter yang dapat menyerang dan bertahan dengan cara unik, serta kemampuan yang dapat diganti saat program berjalan.
Kamu akan mengatur kodemu dalam lima file:
character.go: Definisikan struct dasarCharacterdengan field umum:Name(string),Health(int), danMaxHealth(int). Sertakan constructorNewCharacterdan method:IsAlive() bool: mengembalikan true jika health lebih besar dari 0Status() string: mengembalikan format:[Name]: [Health]/[MaxHealth] HP
interfaces.go: Definisikan interface pertarungan yang memungkinkan polimorfisme:- Interface
AttackerdenganAttack() int: mengembalikan damage yang diberikan - Interface
DefenderdenganTakeDamage(damage int) int: menerapkan pengurangan damage dan mengembalikan damage aktual yang diterima - Interface
AbilitydenganUse() string: mengembalikan deskripsi efek kemampuan
- Interface
characters.go: Buat tiga tipe karakter yang melakukan embeddingCharacterdan mengimplementasikanAttackersertaDefender:Warrior: memiliki fieldStrength(int) danArmor(int). Attack mengembalikan Strength sebagai damage. TakeDamage mengurangi damage yang masuk sebesar Armor (damage yang diterima minimal 1).Mage: memiliki fieldIntelligence(int) danMagicResist(int). Attack mengembalikan Intelligence * 2 sebagai damage. TakeDamage mengurangi damage yang masuk sebesar MagicResist / 2 (damage yang diterima minimal 1).Archer: memiliki fieldAgility(int) danEvasion(int). Attack mengembalikan Agility + 5 sebagai damage. TakeDamage: jika Evasion > 10, kurangi damage sebesar 25% (pembagian bilangan bulat), jika tidak, terima damage penuh (damage yang diterima minimal 1).Sertakan constructor untuk masing-masing:
NewWarrior,NewMage,NewArcheryang menerima name, health, dan nilai stat khusus masing-masing.abilities.go: Implementasikan pola Strategi dengan kemampuan yang dapat diganti:Struct
FireSpelldenganPower(int).Use()-nya mengembalikan:Casts fireball for [Power] damageStruct
IceSpelldenganPower(int).Use()-nya mengembalikan:Casts ice shard for [Power] damageStruct
PowerStrikedenganMultiplier(int).Use()-nya mengembalikan:Performs power strike at [Multiplier]x damageTambahkan field
ability(bertipeAbility) ke struct Mage, dengan methodSetAbility(a Ability)danUseAbility() string. UseAbility mengembalikanNo ability setjika ability bernilai nil.main.go: Buat karakter dan demonstrasikan mekanika pertarungan.Baca tipe karakter (
warrior,mage, atauarcher), lalu baca name, health, dan stat khusus tipe karakter tersebut. Buat karakter yang sesuai.Lalu baca jumlah aksi. Setiap aksi berupa salah satu dari:
status: cetak status karakterattack: cetak[Name] attacks for [damage] damagedefend [amount]: terapkan damage dan cetak[Name] takes [actual] damagesetability [type] [power]: hanya untuk mage, atur ability (type berupafire,ice, ataustrike)useability: hanya untuk mage, cetak hasil Use() dari ability
Input berikut akan diberikan:
- Tipe karakter, name, health, dan stat khusus tipe karakter
- Jumlah aksi, lalu setiap aksi pada baris terpisah
Contohnya, jika diberikan:
warrior
Thorin
100
15
8
5
status
attack
defend 20
status
defend 100Outputmu seharusnya:
Thorin: 100/100 HP
Thorin attacks for 15 damage
Thorin takes 12 damage
Thorin: 88/100 HP
Thorin takes 92 damageDan jika diberikan:
mage
Gandalf
80
25
10
6
attack
useability
setability fire 30
useability
setability ice 25
useability
defend 40Outputmu seharusnya:
Gandalf attacks for 50 damage
No ability set
Casts fireball for 30 damage
Casts ice shard for 25 damage
Gandalf takes 35 damageDan jika diberikan:
archer
Legolas
90
18
15
4
status
attack
defend 24
statusOutputmu seharusnya:
Legolas: 90/90 HP
Legolas attacks for 23 damage
Legolas takes 18 damage
Legolas: 72/90 HPPerhatikan bagaimana embedding struct memungkinkan setiap tipe karakter berbagi field dan method dari Character dasar, sementara interface memungkinkan pertarungan polimorfik, di mana Attacker mana pun dapat memberikan damage dan Defender mana pun dapat menerimanya. Pola Strategi terlihat jelas pada kemampuan Mage yang dapat diganti: karakter yang sama dapat menggunakan spell berbeda tanpa mengubah implementasi intinya!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Baca tipe karakter
scanner.Scan()
charType := strings.TrimSpace(scanner.Text())
// Baca nama karakter
scanner.Scan()
name := strings.TrimSpace(scanner.Text())
// Baca nilai kesehatan
scanner.Scan()
health, _ := strconv.Atoi(strings.TrimSpace(scanner.Text()))
// Baca statistik pertama yang khusus untuk tipe karakter
scanner.Scan()
stat1, _ := strconv.Atoi(strings.TrimSpace(scanner.Text()))
// Baca statistik kedua yang khusus untuk tipe karakter
scanner.Scan()
stat2, _ := strconv.Atoi(strings.TrimSpace(scanner.Text()))
// TODO: Buat karakter yang sesuai berdasarkan charType
// Gunakan variabel: charType, name, health, stat1, stat2
// Untuk warrior: stat1 = Strength, stat2 = Armor
// Untuk mage: stat1 = Intelligence, stat2 = MagicResist
// Untuk archer: stat1 = Agility, stat2 = Evasion
// Baca jumlah aksi
scanner.Scan()
numActions, _ := strconv.Atoi(strings.TrimSpace(scanner.Text()))
// Proses setiap aksi
for i := 0; i < numActions; i++ {
scanner.Scan()
line := strings.TrimSpace(scanner.Text())
parts := strings.Fields(line)
action := parts[0]
// TODO: Tangani setiap jenis aksi:
// - "status": tampilkan Status() karakter
// - "attack": tampilkan "[Name] attacks for [damage] damage"
// - "defend [amount]": terapkan kerusakan dan tampilkan "[Name] takes [actual] damage"
// - "setability [type] [power]": untuk mage, atur kemampuan (fire, ice, atau strike)
// - "useability": untuk mage, tampilkan hasil UseAbility()
_ = action // Hapus baris ini saat kamu mengimplementasikannya
_ = fmt.Println // Hapus baris ini saat kamu mengimplementasikannya
}
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online