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:

  1. Menempatkan pemain di ruangan awal.
  2. Berulang kali:
    • Mencetak deskripsi ruangan saat ini dan barang di dalamnya, saat pemain tiba atau melihat sekeliling.
    • Meminta perintah.
    • Menjalankan perintah itu:
      • look mendeskripsikan ruangan saat ini sekali lagi.
      • go <direction> bergerak melalui pintu keluar (north, south, east, west, up, down).
      • take <item> mengambil barang dari lantai.
      • inv menunjukkan apa yang dibawa pemain.
      • quit menghentikan game.
  3. 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.go punya empat map, masing-masing memakai id ruangan (sebuah int) sebagai kunci: world.Names, world.Descriptions, world.Exits, dan world.Items. Namanya dimulai dengan huruf kapital, karena kalau tidak, main tidak bisa memakainya.
  • world.Exits adalah map[int]map[string]int: untuk setiap ruangan, map dari arah ke id ruangan tujuannya. world.Items adalah map[int][]string.
  • Pemain punya dua data keadaan: currentRoom (sebuah int) dan inventory (slice berisi string). Keduanya dideklarasikan dengan var di luar main, seperti di Bab 21, karena beberapa fungsi membutuhkannya.
  • parse sudah ditulis untukmu. strings.Fields memecah baris menjadi kata, kata pertama adalah kata kerja, dan strings.Join menyatukan sisanya, karena gold coin terdiri dari dua kata.
  • go adalah kata kunci Go, jadi fungsi untuk perintah itu tidak bisa bernama go. Starter menamainya goTo.
  • Untuk goTo, pakai bentuk v, ok dari Bab 23 pada world.Exits[currentRoom][direction]. Id ruangan dimulai dari 1, tetapi jangan mengandalkan 0 sebagai tanda "tidak ada pintu keluar": ok adalah 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.Index mencari barangnya, dan append(items[:i], items[i+1:]...) menghapusnya, seperti di Bab 24. Tugaskan hasilnya kembali ke world.Items[currentRoom], dan append barang itu ke inventory.
  • Pakai rangkaian if untuk kata kerja. Di dalam switch, break tidak akan keluar dari perulangan, seperti peringatan Bab 18.
  • Pemeriksaan kemenangan setelah take berhasil cukup satu if: apakah itu gold coin? Kalau ya, cetak pesan kemenangan dan kembalikan true, supaya perulangan utama bisa break.
  • readLine dari 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 read untuk 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.