Về mặt khái niệm, làm thế nào để tạo ra một công cụ quy tắc / ràng buộc (không phải đồ họa / vật lý) cho một trò chơi


16

Tôi muốn làm một trò chơi đơn giản tương tự như những cuốn sách phiêu lưu của chính bạn. Người chơi được trình bày một văn bản tường thuật và được chọn hành động của mình từ một danh sách các khả năng. Điều này, đến lượt nó, dẫn đến một văn bản tường thuật mới, ad infinitum. Điều hấp dẫn duy nhất là tùy thuộc vào một số quyết định trước đó, danh sách các khả năng có thể khác nhau.

Thoạt nhìn, âm thanh này giống như một tải các câu lệnh if-other, do đó ngụ ý một công cụ quy tắc sẽ được đưa ra. Nhưng, nó cũng giống như một cỗ máy trạng thái hữu hạn đối với tôi.

Tôi sắp viết cái này bằng Java hoặc có thể là Groovy. Hiện tại tôi quan tâm nhiều hơn đến các vấn đề khái niệm, tức là nên làm thế nào ở mức độ rộng (mọi người thực hiện cờ vua hay chơi bài như thế nào?), Nhưng một số lời khuyên về một thư viện cụ thể cũng được hoan nghênh.

Rõ ràng, "công cụ trò chơi" từ tựa game không đề cập đến phát hiện va chạm hoặc cơ học vật lý / đồ họa khác, nhưng logic quyết định những tùy chọn nào mà người chơi đưa ra trong tình huống và trạng thái hiện tại của anh ta.


1
Là câu hỏi này phù hợp hơn cho gamedev ?
Uwe Plonus

2
@Uwe Plonus Đã xem xét điều đó, nhưng tôi không tin như vậy. Câu hỏi của tôi hoàn toàn là khái niệm và không liên quan gì đến các thư viện đồ họa, 3D và các chủ đề khác thống trị gamedev. Hãy nghĩ về nó, câu hỏi này ít liên quan đến các trò chơi ... nhưng không chắc làm thế nào để đặt tiêu đề tốt hơn.
kaqqao

Cờ vua và các trò chơi bài rất khác với những cuộc phiêu lưu.
Thợ săn hươu

1
Câu hỏi của bạn dường như bao gồm phát triển hệ thống chuyên gia là tốt. Trường hợp phạm vi câu hỏi tiếp theo và chẩn đoán có thể bị giới hạn với mỗi câu trả lời được chọn. Có lẽ đó là những gì cần tìm để tìm thêm một số "đầu vào"?
Marjan Venema

Câu trả lời:


7

Dựa trên những gì bạn đã nói trong các bình luận, đây là cách tôi sẽ xử lý nó:

Thực hiện câu chuyện như một máy trạng thái hữu hạn, với một twist. Mỗi Bang là một trang của câu chuyện và mỗi Chuyển tiếp là một liên kết từ trang này sang trang khác. Nhưng mỗi lần chuyển đổi cũng có Điều kiện . Các Điều kiện có thể là null, trong trường hợp Transition luôn hiển thị dưới dạng tùy chọn khả dụng, nhưng nếu không, thì chúng phải được đánh giá khi trang hiển thị và nếu đánh giá trả về False, Transition không hiển thị.

Có hai cách cơ bản để bạn thực hiện Điều kiện. Đầu tiên là thiết lập một công cụ kịch bản đầy đủ bên trong trò chơi, và sau đó Điều kiện trông như thế return player.inventory.contains(GUN). Điều này ban đầu phức tạp hơn để thiết lập, nhưng cho phép kịch bản nâng cao hơn.

Thứ hai là mã hóa các điều kiện có thể thành một số loại đối tượng. Nó có thể có một RequiredItemtrường và nếu trường đó có giá trị, bạn kiểm tra xem điều kiện có được đáp ứng không. Hệ thống này đơn giản hơn để thiết lập. Nó giới hạn những gì bạn có thể làm nhiều hơn so với kịch bản, nhưng nếu bạn không cần sự linh hoạt mà một công cụ kịch bản sẽ cung cấp, có lẽ nó dễ sử dụng hơn rất nhiều.


1
Chúng tôi thực sự sử dụng một cái gì đó như thế này trong ứng dụng web hoàn toàn không liên quan đến trò chơi của chúng tôi. Người dùng có một số Bang và bất kỳ số lượng Sự kiện nào cũng có thể được kích hoạt trong mã, nhiều trong số đó được đặt trước để chuyển người dùng từ Bang này sang Bang khác. Tôi nghĩ đối với các trường hợp được mô tả của câu hỏi, có một số loại ngôn ngữ kịch bản thô sơ (hoặc một ngôn ngữ đầy đủ như Python / Lua) để xác định các điều kiện / trình kích hoạt cũng sẽ hữu ích.
Katana314

Tôi thích cách tiếp cận này một chút. Cảm ơn! Sẽ điều tra thêm. Bất kỳ cơ hội bạn biết một thư viện hữu ích?
kaqqao

@veggen: Không, xin lỗi. Không phải là nhà phát triển Java.
Mason Wheeler

@MasonWheeler: Bạn nghĩ gì về Lazarus ?
Robert Harvey

1
Vì câu hỏi này đã lọt vào danh sách các câu hỏi phổ biến hiện nay, tôi sẽ báo cáo rằng tôi đã thực hiện chính xác như tôi đã nói trong phần bình luận trước. Tôi đã tạo ra một DSL đẹp và tự triển khai logic FSM vì nó thực sự rất đơn giản. Không thể hài lòng hơn với giải pháp. @MasonWheeler Cảm ơn một lần nữa cho một lời khuyên tuyệt vời!
kaqqao

5

Tôi nghĩ rằng câu trả lời là trong tiêu đề: bạn cần một công cụ quy tắc. Nếu bạn đang dự định viết ứng dụng của mình bằng Java, tất nhiên bạn có thể tự viết như Gilbert Le Blanc đề xuất, HOẶC bạn có thể muốn xem qua Drools , một công cụ quy tắc.

Người chơi đã đưa ra những lựa chọn nào cho tình huống và trạng thái hiện tại của mình

Trong thực tế, với Dropols hoặc bất kỳ công cụ quy tắc nào khác, bạn có thể xác định tình huống được tham số hóa để đưa ra danh sách các hành động có thể. Bạn có thể mã hóa các quy tắc đơn giản suc có:

  • người chơi đang ở trangX:

    • lựa chọn 1: tiêu đề: "đi bên trái", hành động: "trang45"
    • lựa chọn 2: tiêu đề: "đi đúng", hành động: "trang56"
    • Người chơi NẾU có Nhân viên của Quả cầu lửa THEN lựa chọn 3: tiêu đề "khởi động quả cầu lửa", hành động: "trang32"
    • Người chơi NẾU có Kỹ năng Nhận thức 10 THEN lựa chọn 4: tiêu đề "kiểm tra các bài viết trên tường", hành động: "trang67"

Điều thú vị với Drools là bạn có thể mã hóa tất cả các quy tắc của mình trong một tệp Excel, và sau đó khi bắt đầu trò chơi, hãy làm cho Dropols đọc tệp đó. Sau đó, mọi thứ đều nằm trong bộ nhớ, bạn chỉ cần bận tâm về Giao diện người dùng.

Dưới đây là một số nguồn để giúp bạn bắt đầu với Drools:


Nói chung - hãy tìm thuật toán Rete được triển khai trong bất kỳ công cụ quy tắc nào theo ý thích của bạn.
Thợ săn hươu

Yup, Drools là một trong những điều tôi bắt đầu. Tôi phải điều tra thêm một chút để xem liệu tôi có thể đánh giá chỉ một gói quy tắc tại một thời điểm hay không, vì điều đó khá quan trọng trong trường hợp của tôi. Cảm ơn!
kaqqao

@veggen rất vui được giúp đỡ!
Jalayn


2

Về mặt khái niệm, trò chơi của bạn rất đơn giản. Trong psudeocode, nó sẽ trông giống như thế này:

while not at end of adventure story
    display text
    get response

Bây giờ, xâu chuỗi tất cả các văn bản lại với nhau để nó chuyển từ hành động này sang hành động tiếp theo là phần khó. Bạn có thể sử dụng một cơ sở dữ liệu quan hệ. Bạn có thể sử dụng một cái cây.

Thật khó để cụ thể hơn mà không biết bạn muốn sử dụng ngôn ngữ máy tính nào. Vì bạn đã đề cập đến Java, tôi sẽ nghiêng nhiều hơn về cấu trúc cây.

Tạo một lớp phản hồi chứa một phản hồi và một liên kết đến một lớp văn bản.

Tạo một lớp văn bản chứa văn bản phiêu lưu và Danh sách các phản hồi làm phiên bản của lớp phản hồi.

Chỉnh sửa để trả lời bình luận:

Bạn không tính toán bất cứ điều gì dựa trên mô hình này. Sử dụng ví dụ của bạn, cây sẽ trông giống như thế này, trong đó T là văn bản và A là lựa chọn hành động:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Vâng, có một số bản sao của văn bản, nhưng bằng cách tuân theo chuỗi, các hành động trong tương lai có thể tính đến các quyết định trong quá khứ. Đó là một cây quyết định lớn.


Vấn đề của tôi là tính toán các phản ứng có thể. Các quyết định trong quá khứ ảnh hưởng đến các lựa chọn hiện tại. Vì vậy, nếu một người chơi trình bày "bạn vấp ngã một sĩ quan cảnh sát đã chết" chọn "ăn cắp khẩu súng lục" thay vì "không chạm vào bất cứ thứ gì", sau đó anh ta có một tùy chọn để "bắn kẻ truy đuổi" ngoài việc "chạy trốn như điên ", đó sẽ là lựa chọn duy nhất nếu trước đó họ không có được một khẩu súng.
kaqqao

@veggen: Xem câu trả lời cập nhật.
Gilbert Le Blanc
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.