Menu
CoddyTech

Sistem Karakter Game

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 107 dari 107.

challenge icon

Tantangan

Mudah

Mari 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 dasar Character dengan field umum: Name (string), Health (int), dan MaxHealth (int). Sertakan constructor NewCharacter dan method:
    • IsAlive() bool: mengembalikan true jika health lebih besar dari 0
    • Status() string: mengembalikan format: [Name]: [Health]/[MaxHealth] HP
  • interfaces.go: Definisikan interface pertarungan yang memungkinkan polimorfisme:
    • Interface Attacker dengan Attack() int: mengembalikan damage yang diberikan
    • Interface Defender dengan TakeDamage(damage int) int: menerapkan pengurangan damage dan mengembalikan damage aktual yang diterima
    • Interface Ability dengan Use() string: mengembalikan deskripsi efek kemampuan
  • characters.go: Buat tiga tipe karakter yang melakukan embedding Character dan mengimplementasikan Attacker serta Defender:

    Warrior: memiliki field Strength (int) dan Armor (int). Attack mengembalikan Strength sebagai damage. TakeDamage mengurangi damage yang masuk sebesar Armor (damage yang diterima minimal 1).

    Mage: memiliki field Intelligence (int) dan MagicResist (int). Attack mengembalikan Intelligence * 2 sebagai damage. TakeDamage mengurangi damage yang masuk sebesar MagicResist / 2 (damage yang diterima minimal 1).

    Archer: memiliki field Agility (int) dan Evasion (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, NewArcher yang menerima name, health, dan nilai stat khusus masing-masing.

  • abilities.go: Implementasikan pola Strategi dengan kemampuan yang dapat diganti:

    Struct FireSpell dengan Power (int). Use()-nya mengembalikan: Casts fireball for [Power] damage

    Struct IceSpell dengan Power (int). Use()-nya mengembalikan: Casts ice shard for [Power] damage

    Struct PowerStrike dengan Multiplier (int). Use()-nya mengembalikan: Performs power strike at [Multiplier]x damage

    Tambahkan field ability (bertipe Ability) ke struct Mage, dengan method SetAbility(a Ability) dan UseAbility() string. UseAbility mengembalikan No ability set jika ability bernilai nil.

  • main.go: Buat karakter dan demonstrasikan mekanika pertarungan.

    Baca tipe karakter (warrior, mage, atau archer), 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 karakter
    • attack: cetak [Name] attacks for [damage] damage
    • defend [amount]: terapkan damage dan cetak [Name] takes [actual] damage
    • setability [type] [power]: hanya untuk mage, atur ability (type berupa fire, ice, atau strike)
    • 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 100

Outputmu seharusnya:

Thorin: 100/100 HP
Thorin attacks for 15 damage
Thorin takes 12 damage
Thorin: 88/100 HP
Thorin takes 92 damage

Dan jika diberikan:

mage
Gandalf
80
25
10
6
attack
useability
setability fire 30
useability
setability ice 25
useability
defend 40

Outputmu seharusnya:

Gandalf attacks for 50 damage
No ability set
Casts fireball for 30 damage
Casts ice shard for 25 damage
Gandalf takes 35 damage

Dan jika diberikan:

archer
Legolas
90
18
15
4
status
attack
defend 24
status

Outputmu seharusnya:

Legolas: 90/90 HP
Legolas attacks for 23 damage
Legolas takes 18 damage
Legolas: 72/90 HP

Perhatikan 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

Latihan sendiri: Compiler Go online