Chọn cuộc phiêu lưu của riêng bạn - ngăn xếp lựa chọn


8

Tôi hiện đang xây dựng một trò chơi phiêu lưu của riêng bạn. Bây giờ đủ dễ dàng để có một kết quả cho mọi lựa chọn và tạo ra một luồng tuyến tính, nhưng liệu có một thuật toán tốt để có tất cả các lựa chọn trước đó ảnh hưởng đến kết quả tiếp theo không? Rõ ràng tôi có thể lưu trữ mọi lựa chọn trước đó và có các tuyên bố 'IF' lớn để quyết định nhưng tôi tự hỏi liệu có cách nào tốt hơn không?

Một phần trong tôi tự hỏi liệu mỗi lựa chọn nên có 'điểm số' và sau đó tôi sử dụng điều này (có thể có ngưỡng) để xác định hành động tiếp theo sẽ là gì và mỗi hành động sẽ được thêm vào điểm số.

Tôi chủ yếu làm điều này trong swift / SpriteKit nhưng tôi nghĩ rằng đó là về khái niệm sau đó là mã tại thời điểm này.

Đáp lại bình luận của Josh bên dưới:

Tôi cho rằng hiện tại tôi vẫn đang ở giai đoạn khái niệm, nhưng mỗi 'trang' sẽ là một đối tượng tùy chỉnh hoặc tệp json. Tôi đã suy nghĩ về câu trả lời của bạn (hiện đã bị xóa) và có thể có mỗi tùy chọn ENUM một chút. Sau đó, mỗi trang có thể có một 'điểm'. Sau đó, sử dụng các tùy chọn trước đó được chọn sẽ tìm ra bit nào được đặt và xác định trang nào. Tôi đoán tôi chỉ tự hỏi liệu đã có một giải pháp cho vấn đề này trước khi tôi bắt đầu gần như giúp quyết định tôi nên định dạng 'câu chuyện' như thế nào

Đoán thô ở định dạng:

  { "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 
  }

Cảm ơn


Làm thế nào để bạn hiện đại diện cho mỗi "trang" của cuộc phiêu lưu của bạn? Có phải tất cả chúng chỉ là các chức năng được mã hóa cứng trong Swift? Bạn đang đọc văn bản / hình ảnh và các lựa chọn có sẵn cho mỗi trang từ một tệp dữ liệu? Nếu vậy, các tập tin trông như thế nào?

@JoshPetrie cập nhật thêm một số thông tin
TommyBs

Vấn đề cơ bản là đơn giản là không có cách nào thanh lịch để thể hiện câu chuyện phi tuyến tính với một phương tiện tuyến tính như sourcecode. Phương pháp lý tưởng sẽ IMO là có một trình soạn thảo trực quan giống như UML trong đó các điểm câu chuyện được biểu diễn dưới dạng các hộp và các câu chuyện kể có thể chảy dưới dạng mũi tên. Nhưng đối với hầu hết các dự án nhỏ hơn nó có thể sẽ có nhiều việc để thực hiện như một biên tập viên hơn là chỉ tay viết một mớ hỗn độn của spaghetti mã đầy đủ của if's, else' s, switch's và case' s hy vọng bạn sẽ được hoàn thành trước khi mất sự tỉnh táo của bạn.
Philipp

@Philipp Không phải là sơ đồ UML chính xác là đồ thị đối tượng là gì? Bạn có thể có thể xem xét các cách tiếp cận tuần tự hóa đồ thị đối tượng để tìm ra những cách hay để biểu diễn đồ thị của các đối tượng theo kiểu tuyến tính hóa.
uliwitness

@uliwitness Có nhiều loại sơ đồ UML khác nhau. Gần nhất với cây hộp thoại là một sơ đồ hoạt động . Tôi đã thử nghiệm nhiều công cụ khác nhau để tạo mã từ các sơ đồ UML một lần và khá thất vọng. Bạn thường nhận được một số mã khá lộn xộn, thậm chí chưa hoạt động và cần một số thủ công điền vào các phương thức còn sơ khai.
Philipp

Câu trả lời:


12

Rất nhiều game Adventure / RPG xử lý việc này theo hai cách (có thể có nhiều điều tôi không biết).

Sử dụng cờ

Việc đầu tiên là đặt cờ nếu có điều gì đó xảy ra (thường là một số bitmask). Điều này tốt nếu bạn không có nhiều thứ để theo dõi. Trong phòng / cuộc chạm trán có thể có một tấm séc chống lại một lá cờ làm thay đổi một cái gì đó. Trong ví dụ của bạn có thể thêm một quy tắc:

{"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
}

Trong đó tùy chọn thứ 2 chỉ xuất hiện nếu flags & 64được đặt. Bạn cũng có thể thực hiện setflagtùy chọn nếu cảnh xuất hiện hoặc một lựa chọn cụ thể đã được thực hiện.

Sử dụng vật phẩm

Tùy chọn thứ hai, là thêm các vật phẩm vào kho của người chơi. Đây là "mục này là cần thiết để hoàn thành một nhiệm vụ" mà bạn thường thấy trong các trò chơi. Về cơ bản, chúng hoạt động như 'cờ' di động. Điều này có thể được thực hiện theo hai cách (hoặc kết hợp):

  • Mục này là 'cờ': Kiểm tra cảnh hoặc hộp thoại nếu người chơi có một đối tượng cụ thể trong kho của họ. Điều này giống như cơ chế 'kiểm tra cờ' như được mô tả ở trên. Ưu điểm là bạn có thể dễ dàng hơn nhiều trong việc thiết kế các cuộc gặp gỡ khi bạn đang kiểm tra các đối tượng được đặt tên quen thuộc.

  • Các mục có thuộc tính hoạt động như một cờ. Ví dụ, trong The Witcher 3, người chơi có được một vật thể có thể xua tan những bức tường ảo giác. Vật phẩm đó có thể là một 'cờ' nhưng cũng có thể là đối tượng có một tài sản can_dispel_illusions. Ưu điểm ở đây là bạn có thể thực hiện nhiều đối tượng có thể được sử dụng trong cùng một kịch bản. Do đó, một cảnh / hộp thoại / cửa có thể kiểm tra xem người chơi có 'thứ gì đó' trong kho của họ có tài sản hay không can_dispel_illusions.

Điều này cung cấp cho bạn khả năng cung cấp cho người chơi ảo tưởng về sự lựa chọn; nếu người chơi không gặp phù thủy trong cảnh một, do đó thiếu 'đũa phép xua tan', người chơi có thể nhận được 'vòng xua tan' sau đó từ một thương gia mờ ám - ngăn chặn tình trạng không thể tưởng tượng được của trò chơi.

Nếu bạn không có kế hoạch cung cấp cho người chơi một kho đồ "thực", các mục nhiệm vụ có thể đi đến một danh sách được liệt kê từ người chơi.

thí dụ:

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

và:

{"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" 
}

2

Một giải pháp tôi đã thấy rằng giải thích chi tiết về cách tiếp cận của bạn là có nhiều thuộc tính khác nhau với điểm số liên quan. Một số lựa chọn dẫn đến việc sửa đổi một hoặc nhiều điểm số này. Điểm số lần lượt có thể sửa đổi các lựa chọn có sẵn cho người chơi.

Ví dụ, vào đầu câu chuyện, có thể có một số cuộc chạm trán tùy chọn. Nếu người chơi tham gia chiến đấu, thuộc tính dũng cảm sẽ tăng lên, trong khi chạy trốn sẽ khiến nó giảm đi. Sau đó, một nhánh câu chuyện cụ thể có thể chỉ khả dụng nếu điểm dũng cảm ở trên hoặc dưới một ngưỡng nhất định. Để thêm chiều sâu, một số quyết định sẽ ảnh hưởng đến nhiều hơn một điểm. Ví dụ, chọn túi có thể tăng điểm tàng hình và giảm điểm trung thực.

Nói chung, tôi đã thấy cách tiếp cận này được sử dụng trong tiểu thuyết tương tác loại mô phỏng. Bạn có thể nghe Dan Fabulich từ Choice Of Games thảo luận về giải pháp này trong tập này của Bàn tròn thiết kế trò chơi.

Lợi ích của phương pháp này là:

  • mỗi quyết định không cần cung cấp một kết thúc duy nhất, giảm tổng số kết thúc cần thiết
  • có thể có nhiều hơn một cách để đạt được một kết thúc nhất định, cho phép đa dạng hơn trong các kiểu chơi bổ ích

Một số nhược điểm là:

  • nếu các quyết định xoay quanh các thuộc tính đơn lẻ, nó có thể nông và công thức
  • ngược lại, nếu các quyết định quá phức tạp, việc cân bằng trò chơi / câu chuyện trở nên khó khăn hơn

1

Đây là vấn đề lớn mà các trò chơi hướng câu chuyện phải đối mặt: Sự bùng nổ kết hợp. Như vậy, nếu bạn xem các trò chơi Bioware hoặc Telltale, bạn sẽ thấy rằng cách tiếp cận phổ biến nhất dường như vẫn là cố gắng hạn chế câu chuyện trở nên tuyến tính hơn và giữ hậu quả từ các hành động giới hạn trong các chương của chúng.

Cách tiếp cận Bioware dường như đang sử dụng chia tách từng câu chuyện thành các luồng hoặc tiểu cung riêng biệt. Các cung là độc lập khá nhiều với nhau, nhưng xảy ra đồng thời và tất cả có thể đóng góp vào kết thúc. Bằng cách đó, bạn không phải lập mô hình cho từng tổ hợp cung, bạn chỉ xen kẽ các chương giữa các cung và hậu quả được giới hạn ở cung phụ cụ thể mà bạn đang xử lý ngay bây giờ hoặc cách kết thúc một cung. (hoặc cách kết thúc vòng cung của một nhân vật. Nếu bạn không còn cần NPC đó nữa, bạn thường được lựa chọn giết chúng, bắt giữ chúng hoặc để chúng tự do, ví dụ, cho bạn lựa chọn, nhưng hạn chế hậu quả cho phần còn lại của câu chuyện)

Kết thúc của toàn bộ câu chuyện sau đó chỉ cần biết mỗi vòng cung kết thúc như thế nào, và buộc toàn bộ câu chuyện trong một cái nơ nhỏ gọn gàng.

Làm thế nào bạn sẽ mô hình hóa điều đó trong một chương trình?

Điều này chỉ đơn giản là đẩy vấn đề xuống một cấp (vì mỗi cung phụ cần theo dõi sự khác biệt như một câu chuyện đơn giản), nhưng về cơ bản, bạn có một mảng cờ (ví dụ: trường bit hoặc danh sách các mục có cờ đại diện cho khả năng ảnh hưởng đến kết quả nhất định) cho mỗi cung phụ.

Ngoài ra, khi bạn nói về kết thúc của mình, bạn thường áp dụng cách tiếp cận xen kẽ khi bạn nói với người chơi về hậu quả: Mỗi kết quả của cung phụ sẽ có nút đoạn / đoạn hội thoại riêng, đơn giản hóa rất nhiều điều kiện của bạn.


0

Có thể mất một chút thời gian, nhưng phát triển cây của riêng bạn (như cây hành vi hoặc cây hộp thoại, nhưng đối với các trang) có thể có lợi. Và bạn có thể sử dụng một trong số đó làm mô hình. Một cái gì đó như thế này:

Làm thế nào để cây hộp thoại làm việc?

Điều này sẽ cho phép bạn điều chỉnh nó theo nhu cầu cụ thể của bạn, nhưng cũng để mã xử lý hầu hết công việc.


0

Điều gì nếu bạn sử dụng một cách tiếp cận loại công cụ quy tắc? Khi người chơi tương tác với NPC, trò chơi sẽ chạy một công cụ quy tắc bị loại bỏ bắt đầu bằng các cờ được tạo bởi các lựa chọn / hành vi trong quá khứ và kiểm tra nó trước một bộ quy tắc do bạn xác định trước. Một cái gì đó như Drools có lẽ quá lớn và tham vọng, chưa kể đến chậm, nhưng một công cụ quy tắc phạm vi giới hạn về mặt lý thuyết có thể cung cấp cho bạn hiệu suất tốt hơn và rất linh hoạt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.