key-value (seperti status pemain atau monster), dan List untuk koleksi dinamis (seperti inventori dan daftar misi). Data ini adalah sumber tunggal kebenaran (Source of Truth) yang akan diakses dan dimodifikasi oleh semua fungsi game.
player = { 'nama': 'Ziren', 'hp': 150, 'atk': 20, 'lvl': 1, 'exp': 0, 'gold': 150, 'inv': [] } monster_data = { 'Goblin Iblis': {'hp': 80, 'atk':10, 'exp':15}, 'Iblis Reland': {'hp':250, 'atk':40, 'exp':100} } item_shop = {'Pedang Cahaya':{'kat':'Senjata','harga':80}, ...} misi = [{'nama':'Mengalahkan Goblin', 'status':'Belum','progress':0, 'target':1}]
key (misalnya player['hp']) dan **List** diakses dengan index.garis() berfungsi sebagai pembatas visual, sementara status() melakukan operasi **Read** terhadap dictionary player untuk menampilkan informasi penting. Memisahkan fungsi tampilan dari logika game adalah praktik yang baik (**prinsip MVC** sederhana).
def garis(): print('='*40) def status(): garis() print('Nama:', player['nama']) print('HP:', player['hp']) garis()
beli() mengimplementasikan operasi CRUD (Create, Read, Update) sederhana.
item_shop.player['gold'].player['inv'] (List).def beli(): for i,(n,d) in enumerate(item_shop.items()): print(i+1, n, '-', d['harga']) pilih = input('Pilih item:') player['gold'] -= harga # Asumsi 'harga' terdefinisi dari item yang dipilih player['inv'].append(nama) # Asumsi 'nama' terdefinisi dari item yang dipilih
bertarung() menggunakan perulangan while untuk menjalankan pertarungan sampai salah satu HP (**Pemain** atau **Musuh**) mencapai nol.
.copy() memastikan kita hanya mengubah HP monster yang sedang bertarung, bukan data templat di monster_data.random untuk membuat pertarungan tidak monoton.def bertarung(): mon = random.choice(list(monster_data.keys())) musuh = monster_data[mon].copy() while musuh['hp']>0 and player['hp']>0: aksi = input('1 serang / 2 ramuan') if aksi=='1': dmg = rand(player['atk']-5, player['atk']+5) musuh['hp'] -= dmg if musuh['hp']>0: player['hp'] -= rand(musuh['atk']-5, musuh['atk']+5)
.copy() penting untuk menghindari modifikasi data templat, memastikan monster lain yang muncul nanti memiliki HP penuh lagi.player['lvl'] * 40 (skala linear sederhana).EXP -= threshold), dan atribut dasar seperti HP dan ATK ditingkatkan.if player['exp'] >= player['lvl']*40: player['exp'] -= player['lvl']*40 player['lvl'] += 1 player['hp'] += 30 player['atk'] += 5
progress misi ditingkatkan.progress mencapai target, status diubah menjadi 'Selesai' dan pemain menerima reward gold.def update_misi(nama_monster): for m in misi: if m['status']!='Selesai' and nama_monster.lower() in m['nama'].lower(): m['progress'] += 1 if m['progress']>=m['target']: m['status']='Selesai' player['gold'] += m['reward'] # Asumsi 'reward' ada di dict misi
main() adalah **Controller** yang mengendalikan alur permainan. Ini adalah Game Loop utama, yang berjalan selamanya (while True) hingga pemain memilih opsi keluar (break).
def main(): while True: status(); print(menu) # Tampilkan status dan menu pilih = input() if pilih=='1': bertarung() elif pilih=='2': beli() elif pilih=='3': break