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.
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. –