Tôi sẽ cố gắng trả lời điều này tốt nhất có thể, nhưng có một số "thực tiễn tốt nhất" mà tôi không chắc chắn, nhưng tôi sẽ cố gắng phá vỡ nó một cách sạch sẽ nhất có thể.
FSM
Đầu tiên, hướng dẫn khai thác là từ Lập trình trò chơi AI theo ví dụ của Mat Buckland (mà tôi khuyên bạn nên giới thiệu về AI). Anh ta sử dụng một enum cho mỗi trạng thái, KHÔNG phải là một cấu trúc. Với cấu trúc trong ví dụ của bạn, bạn có booleans là các trạng thái, vì vậy bạn có thể có bất kỳ số nào trong số này trên cùng một lúc. Điều này có thể dẫn đến hành vi bạn muốn, nhưng thường xuyên hơn không phải với các FSM (Máy trạng thái hữu hạn) dẫn đến hành vi không mong muốn.
Ví dụ:
enum
{
WANDER_AROUND,
ATTACK,
RUN_AWAY,
};
Thứ hai, đó không phải là cách duy nhất ông mô tả các trạng thái. Cách cá nhân tôi thích (tùy theo tình huống) là tạo một lớp trừu tượng gọi là Trạng thái có các hàm Enter (), Thoát () và Cập nhật (). Sau đó tạo các trạng thái của tôi dưới dạng các lớp con của lớp Nhà nước.
Giống như hình ảnh này (thực sự được tìm thấy trên trang 2 của liên kết đó):
Mô hình nhà nước
Theo ý kiến cá nhân của tôi, mẫu trạng thái chỉ là một phần của thiết kế phần mềm trong đó phần mềm có một số trạng thái. Việc thực hiện là xuống cho nhà phát triển. Tôi không cảm thấy có sự khác biệt chính xác giữa việc sử dụng câu lệnh chuyển đổi lớn hoặc tạo một máy trạng thái hoàn chỉnh để chạy tất cả các trạng thái của bạn như tôi đã nêu ở trên. Về cơ bản họ đang làm điều tương tự. Vì vậy, trong khía cạnh đó, câu trả lời cho một trong những câu hỏi của bạn là có, tôi tin rằng trang đó mô tả mẫu trạng thái.
Ưu / nhược điểm
Có những ưu và nhược điểm đối với bất kỳ phương pháp nào bạn sử dụng để thực hiện thiết kế theo trạng thái.
Sử dụng câu lệnh If / Else hoặc Switch
Ưu điểm:
- Rất dễ dàng để thêm và kiểm tra điều kiện của các tiểu bang
- Có thể được tạo mẫu rất nhanh
Nhược điểm:
- Khi bạn có vô số trạng thái, nó có thể trở nên rất xấu, rất nhanh.
- Theo dõi quá trình chuyển đổi, hiệu ứng khi trạng thái được nhập / thoát hoặc bất cứ điều gì cụ thể đối với trạng thái là khó khăn
Sử dụng máy trạng thái hướng đối tượng
Ưu điểm:
- Khả năng mở rộng cao - điều duy nhất bạn cần làm là tạo một trạng thái mới kế thừa lớp Trạng thái trừu tượng
- Dễ dàng bảo trì - Bạn không phải lo lắng về mã tìm kiếm spaghetti vì mỗi tiểu bang nằm trong lớp riêng của mình. Bạn có thể dễ dàng nhìn thấy các điều kiện liên quan đến trạng thái đó mà không phải lo lắng về các trạng thái khác.
- Trực quan - Nếu bạn đang làm việc trong một dự án nhóm với loại máy trạng thái này, sẽ dễ dàng hơn nhiều cho người đọc mã của bạn. Họ sẽ không phải đọc qua các dòng mã chỉ để đến một trạng thái nhất định ("Luôn lập trình như thể lập trình viên duy trì mã của bạn là một kẻ tâm thần biết bạn sống ở đâu!" :))
Nhược điểm:
- Đường cong học tập nhẹ - Thiết kế này có thể mất một lúc để hoàn toàn tròn trịa khi thực hiện nó
- Thành thật tôi không thể nghĩ thêm nữa, vì tôi thích cách này hơn, nhưng nếu có ai muốn thêm vào nó, chỉ cần bình luận và tôi sẽ thêm chúng.
Tôi hy vọng rằng câu trả lời tất cả các câu hỏi của bạn. Trên thực tế, tôi vừa mở bản sao Trò chơi lập trình AI của mình bằng ví dụ và Mat có đề cập rằng máy trạng thái được gọi là "mẫu thiết kế trạng thái". Cá nhân, tôi không đồng ý, nhưng với riêng mình.
Hy vọng nó giúp :)