Mini-proyek Bagian 5: Petualangan Teks
Proyek terbesar sejauh ini. Proyek ini memakai semua ide Bagian 5
(fungsi, slice, map, package) untuk membuat petualangan teks kecil:
pemain berjalan melewati ruangan sambil mengetik perintah seperti
go north dan take torch.
Apa yang harus dibuat
Sebuah program yang, saat dijalankan:
- Menempatkan pemain di ruangan awal.
- Berulang kali:
- Mencetak deskripsi ruangan saat ini dan barang di dalamnya, saat pemain tiba atau melihat sekeliling.
- Meminta perintah.
- Menjalankan perintah itu:
lookmendeskripsikan ruangan saat ini sekali lagi.go <direction>bergerak melalui pintu keluar (north, south, east, west, up, down).take <item>mengambil barang dari lantai.invmenunjukkan apa yang dibawa pemain.quitmenghentikan game.
- Menang ketika pemain mengambil
gold coin: mencetak pesan kemenangan dan keluar.
Contoh sesi:
-- Forest Path --
You are on a moss covered forest path. Birdsong drifts on the air.
Exits: north
> go north
-- Clearing --
A small clearing of wildflowers.
Items here: torch
Exits: east, south
> take torch
You pick up the torch.
> go east
-- Cave Entrance --
A cool, damp cave mouth opens below you.
Items here: rope
Exits: down, west
> quit
Goodbye.
Kemenangan, dari Cave Entrance:
> go down
-- Treasure Chamber --
Crystals glitter on the walls. In the centre stands a stone pedestal.
Items here: gold coin
Exits: up
> take gold coin
You pick up the gold coin.
You found the treasure! You win!
Susunan file
Proyek ini adalah modul dengan dua package. world
menyimpan ruangan, dan main menyimpan game-nya. Kedua versi
ada di projects/04-text-adventure/:
starter/
go.mod
main.go
world/
world.go
finished/
go.mod
main.go
world/
world.go
Untuk memainkan versi jadi, masuk ke foldernya dan pakai
go run .:
cd projects/04-text-adventure/finished
go run .
Untuk mengerjakan starter:
cd projects/04-text-adventure/starter
go run .
Starter bisa langsung dijalankan. Program ini mencetak baris
pengganti, dan quit menghentikannya.
world/world.go di dalamnya sudah jadi, dan semua TODO ada
di main.go. Jalankan go vet ./... di folder
yang sama untuk memeriksa kedua package.
Petunjuk
- Sebuah ruangan punya nama, deskripsi, pintu keluar, dan barang, yang
tipenya berbeda-beda, sedangkan satu map menampung satu tipe nilai. Jadi
world.gopunya empat map, masing-masing memakai id ruangan (sebuah int) sebagai kunci:world.Names,world.Descriptions,world.Exits, danworld.Items. Namanya dimulai dengan huruf kapital, karena kalau tidak,maintidak bisa memakainya. world.Exitsadalahmap[int]map[string]int: untuk setiap ruangan, map dari arah ke id ruangan tujuannya.world.Itemsadalahmap[int][]string.- Pemain punya dua data keadaan:
currentRoom(sebuah int) daninventory(slice berisi string). Keduanya dideklarasikan denganvardi luarmain, seperti di Bab 21, karena beberapa fungsi membutuhkannya. parsesudah ditulis untukmu.strings.Fieldsmemecah baris menjadi kata, kata pertama adalah kata kerja, danstrings.Joinmenyatukan sisanya, karenagold cointerdiri dari dua kata.goadalah kata kunci Go, jadi fungsi untuk perintah itu tidak bisa bernamago. Starter menamainyagoTo.- Untuk
goTo, pakai bentukv, okdari Bab 23 padaworld.Exits[currentRoom][direction]. Id ruangan dimulai dari 1, tetapi jangan mengandalkan0sebagai tanda "tidak ada pintu keluar":okadalah cara yang jelas untuk mengatakannya. - Pintu keluar disimpan di map, dan map tidak punya urutan. Kumpulkan namanya ke dalam slice dan urutkan sebelum mencetak, seperti di Bab 23, atau urutannya akan berubah setiap kali pemain melihat sekeliling.
- Untuk
take,slices.Indexmencari barangnya, danappend(items[:i], items[i+1:]...)menghapusnya, seperti di Bab 24. Tugaskan hasilnya kembali keworld.Items[currentRoom], danappendbarang itu keinventory. - Pakai rangkaian
ifuntuk kata kerja. Di dalamswitch,breaktidak akan keluar dari perulangan, seperti peringatan Bab 18. - Pemeriksaan kemenangan setelah
takeberhasil cukup satuif: apakah itugold coin? Kalau ya, cetak pesan kemenangan dan kembalikantrue, supaya perulangan utama bisabreak. readLinedari Bab 21 sudah ditulis untukmu, jadi game berhenti dengan benar kalau input habis.
Apa yang belum boleh kamu gunakan
- Struct dan metode (Bab 26). Empat map dengan kunci id ruangan sudah cukup, dan fungsi bekerja pada data bersama. Di Bab 26 kamu akan melihat bagaimana struct menyatukan nama, deskripsi, pintu keluar, dan barang satu ruangan dalam satu nilai.
- Pointer (Bab 27).
Tantangan lebih besar (opsional)
- Tambahkan perintah
readuntuk papan tanda atau surat. - Kunci satu pintu keluar sampai barang tertentu dibawa (misalnya,
Treasure Chamber hanya bisa dimasuki kalau membawa
torch). - Tambahkan musuh yang menghalangi pintu keluar sampai pemain punya
sword.
Tidak ada yang wajib supaya proyek ini selesai.
Selesai?
Ketika kamu bisa berjalan melewati setiap ruangan, mengambil barang-barang, dan memicu kemenangan pada gold coin, proyek ini selesai. Bagian 5 selesai. Lanjut ke Bab 26 — Struct dan metode, awal dari Bagian 6.