The Grand Finale ๐
Kalian sudah menguasai teori OOP dan Logika. Tapi, ilmu itu gak akan terasa "nyata" kalau cuma dipake buat nge-print teks diam ke layar. Hari ini, kita akan membuat Game sungguhan!
๐งฉ Ilmu yang Akan Digabungkan:
- >> Looping (While): Membuat *Game Loop* yang gak mati sampai user keluar.
- >> Control Flow: Menavigasi menu (1. Berburu, 2. Toko) pake If-Else/Switch.
- >> OOP Classes: Merakit Blueprint untuk Player dan Monster.
โจ๏ธ Membaca Ketikan User (dart:io)
Gimana cara bikin terminal nungguin dan nerima input dari keyboard?
Library dart:io
Selama ini kita cuma nyuruh komputer ngomong pake print(). Sekarang kita suruh komputer **mendengarkan**.
Kita wajib mengimport alat bernama dart:io (Input/Output) di baris paling atas kodingan.
stdout.write("Teks");= Sama kayak print, tapi gak ganti baris (gak dienter). Cocok buat naruh kursor di sebelah tulisan.stdin.readLineSync();= Menyuruh komputer freeze nungguin user ngetik lalu pencet Enter. Hasilnya dikembalikan dalam wujudString?.
import 'dart:io';
void main() {
// Nanya nama
stdout.write("Masukkan nama lu: ");
// Nangkep ketikan (Pake tanda ? karena bisa aja user ngirim data kosong/null)
String? nama = stdin.readLineSync();
print("Welcome, $nama!");
}
๐ Blueprint Arsitektur Game
Sebelum ngoding, kita sebagai Arsitek harus merancang struktur kerangkanya dulu.
๐งโโ๏ธ Class: Player
nama(String)hp(int) -> Default: 100gold(int) -> Default: 0potion(int) -> Default: 1
cekStatus()-> Nge-print data diri.heal()-> Ngecek potion. Kalau ada, tambah HP.
๐ Class: Monster
nama(String)hp(int)damage(int)rewardGold(int)
- Gak butuh method khusus, sistem serangannya diurus oleh Main Game Loop.
๐ Main Game Loop (Sistem Pusat)
Game akan berjalan di dalam kurungan while(isRunning). Di dalamnya ada Menu Navigasi:
๐ป Full Source Code
Buat file `rpg_game.dart`. Pahami alurnya, jangan cuma *copy-paste* buta!
import 'dart:io';
// === 1. CLASS MONSTER ===
class Monster {
String nama;
int hp;
int damage;
int rewardGold;
Monster(this.nama, this.hp, this.damage, this.rewardGold);
}
// === 2. CLASS PLAYER ===
class Player {
String nama;
int hp = 100;
int gold = 0;
int potion = 1;
Player(this.nama);
void cekStatus() {
print("\n=== STATUS \${nama.toUpperCase()} ===");
print("โค๏ธ HP : $hp");
print("๐ฐ Gold : $gold");
print("๐งช Potion : $potion");
print("========================\n");
}
void heal() {
if (potion > 0) {
potion--;
hp += 30;
print("โจ Glekgleglek... Potion diminum. HP nambah 30! (Sisa: $potion)");
} else {
print("โ Potion habis bos! Beli dulu di toko.");
}
}
}
// === 3. RUANG EKSEKUSI ===
void main() {
print("====================================");
print("โ๏ธ WELCOME TO TERMINAL RPG โ๏ธ");
print("====================================");
// Minta input nama
stdout.write("Masukkan nama hero kamu: ");
String? namaInput = stdin.readLineSync();
if(namaInput == null || namaInput.isEmpty) namaInput = "Noob";
Player player = Player(namaInput);
print("\nSelamat datang, \${player.nama}! Petualangan dimulai...");
// GAME LOOP
bool isRunning = true;
while (isRunning) {
print("\n--- MAIN MENU ---");
print("1. Berburu Monster ๐");
print("2. Toko Potion ๐งช (50 Gold)");
print("3. Cek Status ๐");
print("4. Keluar Game ๐ช");
stdout.write("Pilih aksi (1/2/3/4): ");
String? menu = stdin.readLineSync();
switch (menu) {
case '1':
Monster goblin = Monster("Goblin Pencuri", 40, 15, 30);
print("\nโ ๏ธ Awas! \${goblin.nama} muncul!");
// BATTLE LOOP
while (goblin.hp > 0 && player.hp > 0) {
print("\nHP Kamu: \${player.hp} | HP Musuh: \${goblin.hp}");
stdout.write("Aksi (1: Serang, 2: Heal): ");
String? aksi = stdin.readLineSync();
if (aksi == '1') {
print("๐ก๏ธ Kamu menyerang Goblin! (DMG: 20)");
goblin.hp -= 20;
if (goblin.hp > 0) {
print("๐ฅ Goblin membalas! (DMG: \${goblin.damage})");
player.hp -= goblin.damage;
}
} else if (aksi == '2') {
player.heal();
print("๐ฅ Goblin nyerang pas lu lengah! (DMG: \${goblin.damage})");
player.hp -= goblin.damage;
} else {
print("โ Miss click! Hilang giliran.");
}
if (player.hp <= 0) {
print("\n๐ WASTED! Kamu mati dibunuh \${goblin.nama}...");
isRunning = false; // Keluar game loop
break; // Keluar battle loop
}
}
// Menang battle
if (player.hp > 0) {
print("\n๐ YAY! \${goblin.nama} mati!");
print("๐ฐ Dapat \${goblin.rewardGold} Gold!");
player.gold += goblin.rewardGold;
}
break;
case '2':
print("\n๐ช Selamat datang di Toko! (1 Potion = 50 Gold)");
if (player.gold >= 50) {
player.gold -= 50;
player.potion++;
print("โ
Beli Potion sukses! Sisa Gold: \${player.gold}");
} else {
print("โ Uang gak cukup bos! Gold kamu: \${player.gold}");
}
break;
case '3':
player.cekStatus();
break;
case '4':
print("\n๐ Menutup game... Sampai jumpa!");
isRunning = false;
break;
default:
print("โ Pilihan tidak dikenali!");
}
}
print("=== GAME OVER ===");
}
๐ฎ Terminal Web Simulator
Mainkan kode Dart di atas secara nyata langsung dari Browser lu!