Làm thế nào để triển khai thẻ trò chơi hiệu ứng đặc biệt của trò chơi thẻ card


16

Tôi đang cố gắng viết một loại trò chơi đánh bài ở đây, theo một cách nào đó, nó tương tự như Magic The Gathering , hay Yu-Gi-Oh! chơi bài.

Đối với những người bạn không quen thuộc với nó, về cơ bản, trong trò chơi, có một loại thẻ đặc biệt (Thẻ chính tả / Thẻ bẫy / v.v.), có hiệu ứng đặc biệt có thể bẻ cong quy tắc của trò chơi. Những gì tôi hoàn toàn không có ý tưởng là, làm thế nào để thực hiện logic của các thẻ này. Tôi có một số ý tưởng về việc lưu trữ dữ liệu của thẻ với một số cờ có thể báo hiệu khả năng của nó là gì, nhưng điều đó sẽ rất hạn chế trong những gì nó có thể làm được (chỉ có thể sửa đổi một số chỉ số đơn giản).

Để cho bạn biết về loại hiệu ứng mà những thẻ này có thể có, đây là một số ví dụ về các hiệu ứng thẻ chính tả có trong Yu-Gi-Oh! chơi bài:

  • Hồi sinh một sinh vật đã bị tiêu diệt
  • Kiểm soát sinh vật của đối thủ
  • Sửa đổi chỉ số của sinh vật dựa trên một số điều kiện (ví dụ: Số lượng sinh vật có tên nhất định đã bị hủy)
  • Đặc biệt triệu tập một sinh vật nhất định nếu một số điều kiện được đáp ứng.
  • Hợp nhất hai hoặc nhiều sinh vật thành một sinh vật mạnh mẽ hơn.
  • Miễn nhiễm với một số hiệu ứng của thẻ đặc biệt.

Konami đã thực hiện một số trò chơi video của trò chơi, hoàn chỉnh với AI và hàng ngàn loại thẻ. Tôi không nghĩ rằng thực sự có thể mã hóa toàn bộ cơ sở dữ liệu, phải không?

Bây giờ, tất nhiên những gì tôi đang cố gắng làm là không phức tạp như những trò chơi đó, nhưng tôi tò mò, làm thế nào để họ thực hiện những điều này?

Câu trả lời:


17

Có một số dự án nguồn mở có tính chất này, với các cách tiếp cận khác nhau để thực hiện các quy tắc. Đây là một mục blog từ người tạo ra một trong những triển khai MtG nổi tiếng hơn, CardForge. Nó có thể không phải là một danh sách đầy đủ, nhưng nó chứa một số dự án nguồn mở, nơi bạn có thể chỉ cần duyệt mã hoặc truy cập diễn đàn để biết các câu hỏi cụ thể.

Như một câu trả lời thực tế: Đặt cược tốt nhất của bạn cho một khung mạnh mẽ là sử dụng nghiêm túc Lập trình hướng đối tượng. Mọi hành động, mọi kích hoạt, mọi khả năng là một đối tượng. Các khu như Hand, Library cũng là những đối tượng, không cần phải nói. Trong công cụ Rules, không bao giờ chuyển xung quanh các đối tượng câm như chuỗi hoặc số nguyên để mô tả các đối tượng trò chơi, nhưng chỉ các đối tượng của bạn.

Mỗi hành động đặt một số kích hoạt lên một ngăn xếp, trong đó mọi khả năng khác có thể kiểm tra xem chúng có quan tâm đến kích hoạt cụ thể đó hay không và nếu có, chúng sẽ kích hoạt các hành động của chính chúng, có khả năng tạo ra các kích hoạt mới, v.v.

Sau đó, bạn làm việc với các ngăn xếp đó theo quy tắc của trò chơi, cho đến khi ngăn xếp trống, tại thời điểm đó, các hành động mới có thể được thực hiện, v.v.

Lý tưởng nhất là nếu bạn thực hiện hoàn hảo các quy tắc của trò chơi, mã quy tắc của bạn không chứa một thẻ mã hóa cứng. Thẻ mã hóa cứng có thể tạo ra các phím tắt tiện lợi, nhưng về lâu dài, điều này sẽ làm phồng mã của bạn và tạo ra những cạm bẫy tiềm ẩn, chẳng hạn như khi thẻ mới được phát hành tương tác với các thẻ đó theo một cách mới lạ. Trong một trò chơi như MtG với hơn 12.000 thẻ bài độc đáo và không có hồi kết, có NHIỀU tương tác như vậy.


1
Câu trả lời tốt. Đến với nó từ thế giới lập trình chức năng, tôi sẽ có mỗi thẻ là một đóng cửa trong môi trường trò chơi, thậm chí còn chung chung kỳ cục hơn. Ví dụ: thẻ có thể chấp nhận tạo "Khu vực" mới bằng cách thêm danh sách thẻ vào danh sách các khu vực. Cụ thể: Zombie Monster Mayhem: Tất cả các sinh vật bị đánh bại được hồi sinh trong "Nghĩa trang xã" mới mà không có khả năng đặc biệt của chúng, và tấn công ngẫu nhiên một người chơi dựa trên việc tung xúc xắc.
brice

Liên kết bổ sung: github.com/Fluorohydride/ygopro-core để triển khai YGO mã nguồn mở nổi tiếng, vì YGO cũng được đề cập trong câu hỏi.
SK19

2

Việc thử kết hợp tất cả những thứ đó với các công tắc và biến số là một việc khá vô ích. Bạn sẽ phải có chức năng mã cứng hoặc, nhiều khả năng, có một tập lệnh mà bạn diễn giải trong thời gian chạy. Bạn sẽ đưa ra các chức năng cần thiết để kiểm tra trạng thái của bảng và sàn và nghĩa địa cho tập lệnh và các chức năng để thực hiện các hành động, v.v. Tập lệnh sau đó chỉ là một chuỗi đơn giản để lưu trữ cùng với các biến khác được liên kết với thẻ.


Hoặc như hackworth đề xuất, có một số loại khối phổ biến được kết hợp để có được hành vi cần thiết. Nó sẽ đòi hỏi một số khối logic ngoài những gì anh ấy đề xuất, tôi nghĩ vậy. Việc chia sẻ các khối hành vi có thể giúp dễ dàng lọc các thẻ có một số loại phẩm chất được chia sẻ.
Toni

1

Tôi cũng đang lên kế hoạch cho trò chơi bài bằng ngôn ngữ web với mysql db. Tôi hiện đang có một thiết lập rất chung chung vì vậy nó rất linh hoạt với các thẻ độc đáo mới. Ví dụ thay vì:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

nó có thể dễ dàng là:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

áp dụng khái niệm này cho tất cả các hành động sẽ đơn giản hóa các lớp, cho phép tạo ra các thẻ mới bằng cách chỉ cần thêm một hàng vào bảng thẻ của bạn.

Tất cả các tùy chọn và khả năng sẽ được xác định trong db trong hàng đơn đó.

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.