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
sumber
if
',else
',switch
'dancase
berharap Anda akan selesai sebelum kehilangan kewarasan Anda.Jawaban:
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:
Di mana opsi ke-2 hanya muncul jika
flags & 64
diatur. Anda juga bisa menerapkansetflag
opsi 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 propertican_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:
dan:
sumber
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:
Beberapa kelemahannya adalah:
sumber
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.
sumber
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.
sumber
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.
sumber