Pilih petualangan Anda sendiri - tumpukan pilihan

8

Saat ini saya sedang membangun game petualangan pilihan Anda sendiri. Sekarang cukup mudah untuk memiliki satu hasil untuk setiap pilihan dan membuat aliran linear, tetapi apakah ada algoritma yang baik untuk memiliki semua pilihan sebelumnya yang mempengaruhi hasil selanjutnya? Saya jelas dapat menyimpan setiap pilihan sebelumnya dan memiliki pernyataan 'JIKA' besar untuk memutuskan, tetapi saya bertanya-tanya apakah ada cara yang lebih baik?

Sebagian dari saya bertanya-tanya apakah setiap pilihan harus memiliki 'skor' dan kemudian saya menggunakan ini (mungkin dengan ambang batas) untuk menentukan apa tindakan selanjutnya dan setiap tindakan akan ditambahkan ke skor.

Saya terutama melakukan ini di swift / SpriteKit tapi saya pikir ini lebih tentang konsep daripada kode pada saat ini.

Menanggapi komentar Josh di bawah ini:

Saya kira saya masih dalam tahap konseptual saat ini, tetapi setiap 'halaman' akan menjadi objek kustom atau file json. Saya sedang memikirkan jawaban Anda (sekarang dihapus) dan mungkin sedikit setiap opsi ENUM. Maka setiap halaman bisa memiliki 'skor'. Kemudian menggunakan opsi sebelumnya yang dipilih bekerja bit apa yang ditetapkan dan yang menentukan halaman apa. Saya kira saya hanya ingin tahu apakah ada solusi yang ada untuk masalah ini sebelum saya mulai hampir membantu memutuskan bagaimana saya harus memformat 'cerita'

Tebakan kasar pada format:

  { "text":"You arrive in the dungeon and there are 2 doors",
   "options":[
    1: "Go left",
    2: "Go Right"
    ],
   "score" : 0 // first page
  }
  {"text" "You went left and meet a dragon",
  "options":[
    0: "Game over, you were eaten" // something to handle game over
    ],
   "score" : 1 
  }
  {"text" "You meet a mushroom who tells you the princess is in another castle",
  "options":[
    4: "Give up, game over", // something to handle game over
    8: "Jump down the pipe"
    ],
   "score" : 2 
  }

Terima kasih

TommyBs
sumber
Bagaimana Anda saat ini mewakili setiap "halaman" dari petualangan Anda? Apakah mereka semua hanya fungsi kode keras di Swift? Apakah Anda membaca teks / gambar dan pilihan yang tersedia untuk setiap halaman dari file data? Jika demikian, seperti apa file itu?
@JoshPetrie diperbarui dengan beberapa info lebih lanjut
TommyBs
Masalah yang mendasarinya adalah bahwa tidak ada cara yang elegan untuk merepresentasikan narasi non-linear dengan media linear seperti kode sumber. Metode ideal IMO adalah memiliki editor visual seperti UML di mana poin cerita direpresentasikan sebagai kotak dan narasi yang mungkin mengalir sebagai panah. Tetapi untuk sebagian besar proyek yang lebih kecil kemungkinan akan lebih banyak pekerjaan untuk mengimplementasikan editor seperti itu daripada hanya menulis tulisan kode spaghetti yang penuh dengan if', else', switch'dan caseberharap Anda akan selesai sebelum kehilangan kewarasan Anda.
Philipp
@ Philipp Bukankah diagram UML persis apa itu objek grafik? Anda mungkin bisa melihat ke dalam pendekatan serialisasi objek grafik untuk menemukan cara yang baik untuk mewakili grafik objek secara linier.
uliwitness
@uliwitness Ada berbagai jenis diagram UML. Yang paling dekat dengan pohon dialog adalah diagram aktivitas . Saya bereksperimen dengan berbagai alat untuk menghasilkan kode dari diagram UML sekali dan cukup kecewa. Anda biasanya mendapatkan beberapa kode yang cukup berantakan yang bahkan belum berfungsi dan membutuhkan manual untuk mengisi metode rintisan.
Philipp

Jawaban:

12

Banyak game Petualangan / RPG menangani ini dalam dua cara (mungkin ada lebih banyak yang tidak saya sadari).

Penggunaan bendera

Yang pertama adalah mengatur bendera jika sesuatu terjadi (biasanya beberapa bitmask). Ini bagus jika Anda tidak memiliki banyak hal untuk dilacak. Di ruangan / pertemuan mungkin ada tanda centang terhadap bendera yang mengubah sesuatu. Dalam contoh Anda dapat menambahkan aturan:

{"text" "You meet a mushroom who tells you the princess is in another castle",
"options":[
  4: "Give up, game over", // something to handle game over
  8: [64:"Jump down the pipe", "Exit stage left"]
  ],
 "score" : 2
 "setflag" : 32
}

Di mana opsi ke-2 hanya muncul jika flags & 64diatur. Anda juga bisa menerapkan setflagopsi jika adegan muncul, atau pilihan tertentu dibuat.

Gunakan item

Opsi kedua, adalah menambahkan item ke inventaris pemain. Ini adalah "item ini diperlukan untuk menyelesaikan pencarian" yang sering Anda lihat dalam game. Ini pada dasarnya berfungsi sebagai 'bendera' portabel. Ini dapat diterapkan dua cara (atau kombinasi):

  • Butirnya adalah 'bendera': Periksa adegan atau dialog jika pemain memiliki objek tertentu dalam inventarisnya. Ini sangat mirip dengan mekanik 'periksa bendera' seperti dijelaskan di atas. Sisi positifnya adalah bahwa mungkin lebih mudah bagi Anda untuk merancang pertemuan saat Anda memeriksa terhadap objek bernama akrab.

  • Item memiliki properti yang berfungsi sebagai bendera. Misalnya dalam The Witcher 3, pemain memperoleh objek yang dapat menghilangkan dinding ilusi. Benda itu sendiri bisa menjadi 'bendera' tetapi bisa juga benda itu memiliki properti can_dispel_illusions. Keuntungannya di sini adalah Anda bisa mengimplementasikan beberapa objek yang dapat digunakan dalam skenario yang sama. Dengan demikian adegan / dialog / pintu dapat memeriksa apakah pemain memiliki 'sesuatu' dalam inventaris mereka yang memiliki properti can_dispel_illusions.

Ini memberi Anda kemungkinan untuk memberi pemain ilusi pilihan; jika pemain tidak menemukan penyihir di adegan satu, maka kehilangan 'tongkat menghilangkan' pemain bisa mendapatkan 'cincin menghilangkan' nanti dari beberapa pedagang teduh - mencegah keadaan permainan yang tidak dapat dimenangkan.

Jika Anda tidak berencana untuk memberikan inventaris yang "nyata" kepada pemain, item-item pencarian bisa menuju ke daftar yang tersembunyi dari pemain.

contoh:

{"items":[
  "Wand of Dispel": { "properties": ["can_dispel_illusions","illumination"]}
]}

dan:

{"text" "The corridor ends in a dead end. The wall feels cold when you touch it.",
"options":[
  4: "Turn back", 
  8: {"can_dispel_illusions": "Check if the wall is real."} 
  ],
 "score" : 2 
}

{"text" "The witch hands you an object. She observes what you're going to do next.",
"options":[
  14: "Leave the witch's house", 
  22: "Look at the object."} 
  ],
 "giveitem" : "Wand of Dispel" 
}
Felsir
sumber
2

Salah satu solusi yang saya lihat yang menguraikan pendekatan Anda adalah memiliki berbagai atribut dengan skor terkait. Beberapa pilihan menghasilkan modifikasi satu atau lebih dari skor ini. Skor pada gilirannya dapat mengubah pilihan yang tersedia untuk pemain.

Misalnya, di awal cerita, mungkin ada beberapa opsi pertarungan opsi. Jika pemain terlibat dalam pertempuran, atribut keberanian akan meningkat, sedangkan melarikan diri akan menyebabkannya berkurang. Kemudian, cabang cerita tertentu mungkin hanya tersedia jika skor keberanian di atas atau di bawah ambang batas yang diberikan. Untuk menambah kedalaman, beberapa keputusan harus memengaruhi lebih dari satu skor. Misalnya, mengambil kantong dapat meningkatkan skor siluman dan menurunkan skor kejujuran.

Secara umum, saya telah melihat pendekatan ini digunakan dalam fiksi interaktif jenis simulasi. Anda dapat mendengar Dan Fabulich dari Choice Of Games mendiskusikan solusi ini pada episode Meja Bundar Desain Game ini.

Manfaat dari pendekatan ini adalah:

  • setiap keputusan tidak perlu memberikan akhiran yang unik, mengurangi jumlah akhiran yang dibutuhkan
  • mungkin ada lebih dari satu cara untuk mencapai akhir yang diberikan, memungkinkan lebih banyak variasi dalam gaya permainan yang bermanfaat

Beberapa kelemahannya adalah:

  • jika keputusan bergantung pada atribut tunggal, itu bisa menjadi dangkal & formula
  • sebaliknya, jika keputusan terlalu rumit, menyeimbangkan permainan / cerita menjadi lebih sulit
Pikalek
sumber
1

Ini adalah masalah besar yang dihadapi oleh game-driven: ledakan kombinatorial. Dengan demikian, jika Anda melihat misalnya permainan Bioware atau Telltale, Anda akan menemukan bahwa pendekatan yang paling umum tampaknya masih mencoba untuk membatasi cerita menjadi lebih linier, dan menjaga konsekuensi dari tindakan yang terbatas pada bab-bab mereka.

Pendekatan Bioware tampaknya menggunakan split setiap cerita menjadi utas atau sub-busur terpisah. Arcs cukup independen satu sama lain, tetapi terjadi secara bersamaan dan semua berkontribusi pada akhir. Dengan begitu, Anda tidak harus memodelkan setiap kombinasi busur, Anda hanya mengganti bab di antara busur, dan konsekuensinya terbatas pada sub-busur tertentu yang Anda hadapi sekarang, atau bagaimana cara mengakhiri busur. (atau cara mengakhiri busur karakter. Jika Anda tidak lagi membutuhkan NPC itu, Anda sering diberikan pilihan untuk membunuh mereka, menangkap mereka, atau membebaskan mereka, misalnya, memberi Anda pilihan, tetapi membatasi konsekuensinya pada yang lain) dari cerita)

Akhir dari keseluruhan cerita kemudian hanya perlu tahu bagaimana masing-masing busur berakhir, dan mengikat seluruh narasi dengan busur kecil yang rapi.

Bagaimana Anda memodelkan itu dalam suatu program?

Ini hanya mendorong masalah turun satu tingkat (karena setiap sub-busur perlu melacak perbedaan seperti cerita sederhana), tetapi pada dasarnya Anda akan memiliki array bendera (misalnya bidang bit, atau daftar item dengan bendera yang mewakili kemampuan untuk mempengaruhi hasil tertentu) untuk setiap sub-busur.

Juga, ketika Anda memberi tahu akhir cerita Anda, Anda biasanya mengambil pendekatan bolak-balik yang sama ketika Anda memberi tahu pemain tentang konsekuensinya: Setiap hasil sub-busur mendapatkan paragraf / simpul percakapan sendiri, sangat menyederhanakan kondisi Anda.

uliwitness
sumber
0

Mungkin butuh sedikit waktu, tetapi mengembangkan pohon Anda sendiri (seperti pohon perilaku atau pohon dialog, tetapi untuk halaman) mungkin bermanfaat. Dan Anda bisa menggunakan salah satunya sebagai model. Sesuatu seperti ini:

Bagaimana cara kerja pohon dialog?

Ini akan memungkinkan Anda menyesuaikannya untuk kebutuhan spesifik Anda, tetapi juga membiarkan kode menangani sebagian besar pekerjaan.

Jesse Williams
sumber
0

Bagaimana jika Anda menggunakan pendekatan tipe mesin aturan? Ketika seorang pemain berinteraksi dengan NPC, permainan akan menjalankan mesin aturan stripped down yang akan dimulai dengan bendera yang telah dibuat oleh pilihan / perilaku masa lalu dan mengeceknya terhadap seperangkat aturan yang ditentukan oleh Anda sebelumnya. Sesuatu seperti Drools mungkin terlalu besar dan ambisius, belum lagi lambat, tetapi mesin aturan lingkup terbatas secara teoritis dapat memberi Anda kinerja yang lebih baik dan banyak fleksibilitas.

JBiggs
sumber