2009-03-03 43 views
8

Tôi khá mới phát triển trò chơi nên tôi quyết định tạo dự án sở thích từ đầu cho cả trải nghiệm và giải trí. Các trò chơi cụ thể là tương tự như poker được gọi là Three Card Brag. Trò chơi được phát trong bộ phim Khóa, Kho và Hai Thùng thuốc.Chiến lược thiết kế và kiến ​​trúc trò chơi cho trò chơi nhiều người chơi

Tôi đã đọc một số chủ đề về SO liên quan đến phát triển trò chơi, mặc dù chủ yếu là this question. Điều này đã giúp cải tiến cách ban đầu tôi đã tạo ra các đối tượng.

Một vấn đề cụ thể mà tôi đang gặp là xác định trạng thái trò chơi. Cách tiếp cận ban đầu của tôi là tách tất cả mọi thứ (ví dụ: giữ ngăn xếp chip bên trong lớp Player) nhưng sau khi đọc câu trả lời cho question Tôi đã đề cập trước đây, có vẻ như tất cả các trạng thái có thể của trò chơi phải được duy trì trong một đối tượng GameState. Những gì tôi đã đưa ra về cơ bản là thế này:

abstract class CardGameState 
{ 
    protected List<Player> _Players; 
    protected Player _CurrentPlayer; 
    protected Dictionary<Player, int> _Chips; 
    protected Dictionary<Player, Hand> _CurrentHand; 
    protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc. 
    /* etc. */ 

nơi mỗi CardGameState được sửa đổi bởi một số hành động:

public interface IAction 
{ 
    string Name { get; } 

    CardGameState Apply(CardGameState state); 
    bool IsLegal(CardGameState state); 
} 

Bây giờ tôi cảm thấy rất mạnh mẽ rằng đây là đánh bại mục đích của chương trình hướng đối tượng vì dữ liệu liên quan cụ thể đến trình phát (trong trường hợp này, ngăn xếp chip, bàn tay và trạng thái hiện tại của nó) không được đóng gói bởi đối tượng Player.

Mặt khác, nếu người chơi tăng cược, tôi sẽ tạo RaiseAction thực hiện IAction, nhưng giao diện IAction chỉ chấp nhận trạng thái trò chơi hiện tại mà tôi không tin là lý tưởng nếu ngăn xếp chip được lưu trữ trong lớp Player. Về cơ bản, câu hỏi của tôi là: tôi có thể có cả hai thế giới tốt nhất để có thể biểu diễn chính xác trạng thái trò chơi trong khi đồng thời giữ tất cả dữ liệu liên quan cụ thể đến một đối tượng trong trạng thái trò chơi bên trong đối tượng nhất định không? Không.

+1

Hey John, tôi vừa xem lại câu hỏi này và nhận ra rằng bạn cũng có thể đạt được kết quả tốt nhất của cả hai thế giới bằng cách thay thế IAction.Apply bằng IState.Apply bằng mẫu khách truy cập. Có lẽ đã quá muộn rồi, nhưng dù sao nó có thể là máy chủ để tham khảo trong tương lai. –

Trả lời

6

Trong trò chơi trực tuyến bằng cách sử dụng command-pattern (IAction) là tiêu chuẩn và được chứng minh là cách để thực hiện. Nó không phải là hướng đối tượng theo ý nghĩa của người chơi, nhưng các hành động là hướng đối tượng, vì vậy từ một quan điểm thuần túy về mặt lý thuyết, nó là một mẫu thiết kế chắc chắn, tôi đoán vậy. Và trong thực tế, đó là cách mọi trò chơi trực tuyến thành công mà tôi đã thực hiện, nhưng lưu ý rằng trò chơi hành động thường sử dụng các hành động/gói kín đáo rất nhỏ, cho đến khi nó thực sự trở thành một luồng các loại.

Edit:

Một thời gian lâu sau khi tôi trả lời này, tôi trở lại đây và nhận ra một giải pháp cho vấn đề này là thực hiện Players GameState của, Decks, vv ...có nguồn gốc từ một lớp học IState với Áp dụng (Hành động IAction) thành viên. Bằng cách này, các đối tượng áp dụng các hành động trên chính mình, thay vì ứng dụng áp dụng các hành động trên các đối tượng, điều này sẽ ánh xạ các hành động và trạng thái đến một visitor-pattern thay vì một mẫu lệnh. Hoặc là giải pháp sẽ làm việc, nơi mà khách truy cập có chi phí lớn hơn và đóng gói nhiều hơn, trong khi lệnh là giải pháp dễ dàng hơn với ít đóng gói hơn.

+0

Vì vậy, tôi đoán câu hỏi có thể bị giảm bớt, ví dụ: tên của người chơi sẽ nằm trong lớp Người chơi vì nó sẽ không bị ảnh hưởng bởi bất kỳ hành động nào của trò chơi. Điều này có nghĩa là mọi thứ có thể được thay đổi bởi bất kỳ hành động nào có thể trong trò chơi sẽ được lưu trữ trực tiếp trong trạng thái trò chơi. –

+0

Có theo cách nào đó (tên cũng có thể thay đổi). Nhưng Player State là một phần phụ của Game State. –

1

Có vẻ như bạn có thể là đối tượng orientizing nó vì lợi ích của đối tượng định hướng của ...

Có vẻ như bowling game vấn đề cổ điển Bob Martin.

EDIT: -Summary-
Đọc lâu, nhưng về cơ bản, thông qua TDD và tái cấu trúc, ứng dụng ghi điểm bowling được chuyển từ một cụm lớn với nhiều Lớp và đa hình thành 20 hoặc 30 dòng mã trang nhã. Tại sao? Bởi vì họ thực sự không cần phải có mặt ở nơi đầu tiên

+0

Tốt đọc - mặc dù tôi đã cố gắng viết ứng dụng này mà không có hành động OO, và điều duy nhất tôi có thể cứu hộ là các lớp được sử dụng để so sánh tay. Phần còn lại là một nỗ lực thủ tục trong việc kiểm soát trạng thái trò chơi, và dễ dàng mất dấu theo dõi mỗi hành động của người chơi đã sửa đổi nó như thế nào –

Các vấn đề liên quan