Tách logic và dữ liệu trong trò chơi trình duyệt


8

Tôi đã suy nghĩ điều này trong nhiều ngày và tôi vẫn không biết phải làm gì. Tôi đang cố gắng cấu trúc lại một hệ thống chiến đấu trong PHP (... xin lỗi.) Đây là những gì tồn tại cho đến nay:

  • Có hai loại (cho đến nay) các thực thể có thể tham gia chiến đấu. Hãy gọi họ là người chơi và NPC. Dữ liệu của họ đã được viết khá tốt.
  • Khi tham gia chiến đấu, những thực thể này được bao bọc bởi một đối tượng khác trong DB được gọi là a Combatant, cung cấp cho họ thông tin về cuộc chiến cụ thể. Họ có thể tham gia vào nhiều chiến đấu cùng một lúc.
  • Tôi đang cố gắng viết công cụ logic để chiến đấu bằng cách cho các chiến binh vào đó.
  • Tôi muốn có thể chế giễu mọi thứ để thử nghiệm.

Để phân tách logic và dữ liệu, tôi muốn có hai lớp giao diện / lớp cơ sở, một lớp ICombatantDatavà lớp kia ICombatantLogic. Hai người triển khai dữ liệu sẽ là một cho các đối tượng thực được lưu trữ trong cơ sở dữ liệu và một cho các đối tượng giả của tôi.

Bây giờ tôi đang gặp phải những điều không chắc chắn với việc thiết kế khía cạnh logic của mọi thứ. Tôi có thể có một người triển khai cho mỗi người chơi và NPC, nhưng sau đó tôi gặp sự cố. Một chiến binh cần có khả năng trả lại thực thể mà nó bọc lại. Phương pháp getter này nên là một phần của logic hoặc dữ liệu? Tôi cảm thấy mạnh mẽ rằng nó nên có trong dữ liệu, bởi vì phần logic được sử dụng để thực hiện chiến đấu, và sẽ không có sẵn nếu ai đó chỉ tìm kiếm thông tin về một cuộc chiến sắp tới. Nhưng các lớp dữ liệu chỉ tách biệt giả khỏi DB, không phải trình phát từ NPC. Nếu tôi thử có hai lớp con của trình triển khai dữ liệu DB, một lớp cho mỗi loại thực thể, thì làm cách nào để kiến ​​trúc sư đó trong khi giữ các mô phỏng của tôi trong vòng lặp? Tôi có cần một số giao diện thứ ba như thế IEntityProvidermà tôi tiêm vào các lớp dữ liệu không?

Ngoài ra với một số ý tưởng tôi đã xem xét, tôi cảm thấy mình sẽ phải kiểm tra để đảm bảo rằng bạn không khớp mọi thứ, như tạo logic cho NPC vô tình bọc dữ liệu cho người chơi. Điều đó có ý nghĩa gì? Đó có phải là một tình huống thậm chí có thể xảy ra nếu kiến ​​trúc là chính xác, hoặc thiết kế phù hợp sẽ cấm hoàn toàn điều đó vì vậy tôi không cần phải kiểm tra nó?

Nếu ai đó có thể giúp tôi chỉ cần bố trí một sơ đồ lớp hoặc một cái gì đó cho việc này, nó sẽ giúp tôi rất nhiều. Cảm ơn.

biên tập

Cũng hữu ích cần lưu ý, lớp dữ liệu giả không thực sự cần Entity, vì tôi sẽ chỉ định trực tiếp tất cả các tham số như chỉ số chiến đấu. Vì vậy, có thể điều đó sẽ ảnh hưởng đến thiết kế chính xác.


Tôi đoán là Combatant.entitykhông được sử dụng trong chiến đấu và do đó không nên tồn tại. Có lẽ bạn cần một lớp khác giống như EntityVsEntityCombatkết thúc logic chiến đấu, chứa Entity <--> Combatantánh xạ và cập nhật Entitytrạng thái sau khi chiến đấu kết thúc? Có lẽ một số thông tin thêm về kiến ​​trúc hiện tại của bạn có thể giúp đỡ.
Torious

Câu trả lời:


1

Một phần của cách tôi đã tiếp cận điều này trong quá khứ là, thay vì có các đại diện hoàn toàn riêng biệt cho người chơi và NPC trong khi yêu cầu cả hai thực hiện một giao diện chung, hướng tới sự hội tụ của đại diện giữa họ đến mức lớn nhất mà tôi có thể, như bằng cách phân lớp chúng từ một Charactermô hình chung mà tôi đưa ra càng nhiều về chúng càng có ý nghĩa để khái quát hóa. Điều này giúp tránh các vấn đề với việc chạy các hoạt động NPC trên người chơi và bằng cách làm cho các hoạt động được áp dụng rộng rãi hơn, vì các xu hướng đại diện ít tự nhiên hơn so với việc chúng được triển khai hoàn toàn độc lập. Đòn bẩy cơ bản của đa hình giúp xử lý các trường hợp phải phân kỳ (ví dụ, nếu bạn thực hiệnCombatantLogicchịu trách nhiệm xử lý những gì xảy ra khi ai đó chết, bạn sẽ phải đánh máy để đảm bảo bạn đã sử dụng đúng logic; vì vậy, đừng để người chơi và NPC thực hiện các die()phương pháp phù hợp, riêng biệt ).

Tôi đồng ý rằng bạn Entitylà một phần của dữ liệu. Tuy nhiên, dựa trên những gì tôi đang nói, tôi thực sự sẽ có xu hướng loại bỏ hoặc hạn chế vai trò của bạn CombatantDatađể có các giá trị logic chiến đấu trực tiếp từ Entity, có lẽ CombatantDatachỉ lưu trữ các giá trị tính toán cụ thể, chiến đấu đơn lẻ đắt tiền. Các mockup thử nghiệm của bạn sau đó sẽ được định hướng nhiều hơn về việc cung cấp Entitycác mô hình giả hơn là hướng tới dân cư CombatantData. ( Thậm chí phải cung cấp quyền truy cập vào .)CombatantData sao chép rất nhiều thông tin từ những điều Entitylàm phiền tôi theo cách tương tự như cơ sở dữ liệu không chuẩn hóa. Tuy nhiên, nếu bạn tin vào Luật của Demeter, điều mà tôi không say mê, bạn sẽ không muốn làm mọi thứ theo cách của tôi Tất nhiên, nếu bạn tin vào Luật của Demeter, tôi không chắc bạnCombatantDataEntity


CombatantData không thực sự trùng lặp dữ liệu thực thể, nó bao gồm trạng thái của thực thể trong chiến đấu, như sức khỏe hiện tại và bất kỳ hiệu ứng trạng thái nào trên đó.
Tesserex

@Tesserex: À, được rồi. Nếu trạng thái đó không tồn tại giữa các chiến lược, thì điều đó hợp lý. Bỏ qua phần đó, sau đó. :) Phần còn lại của những gì tôi đang nói có ý nghĩa không?
hỗn loạ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.