Máy trạng thái: Đối tượng trạng thái so với kiểm tra tuần tự: các pro / cons là gì?


8

Tôi không biết nhiều về máy trạng thái hữu hạn trong AI hoặc các hành vi trò chơi khác trong trò chơi, ngoại trừ hướng dẫn nhanh này với Công cụ khai thác: http://www.ai-junkie.com/arch architecture / state_driven / tut_state1.html hướng đối tượng.

Tôi thực sự không biết liệu hướng dẫn này có mô tả mẫu trạng thái hay không, bạn nghĩ gì?

Tôi không nói về những thứ khác theo định hướng số học hơn như lái xe hoặc vật lý hoặc tìm đường hoặc va chạm, mà là về logic trò chơi, AI do nhà nước điều khiển và những thứ liên quan đến nhiều trạng thái ifvà / hoặc switches đồng thời

Các ưu điểm của việc sử dụng Mẫu trạng thái hoặc kiểm tra tuần tự cấu trúc trạng thái đơn giản như thế này là gì:

struct States
{
bool is_walking, is_running, holds_a_weapon, is_crouch;
int weapon_id, int id_team;
};

void HandleStates (States state)
{
//etc
}

2
Tôi nghĩ rằng bạn có thể cần phải hình thành câu hỏi của mình tốt hơn một chút, nhưng một câu trả lời nhanh ở trên để bạn có thể làm điều đó nói chung là trạng thái loại bỏ các kiểm tra If. chuyển (trạng thái) {case blah} để tạo bảng nhảy hoặc cách làm việc yêu thích cá nhân của tôi, con trỏ hàm hoặc đại biểu trên ngăn xếp hoặc xếp hàng nếu AI sẽ quay lại những gì chúng đang làm trước đó hoặc chuyển sang điều tiếp theo. ..
James

Câu trả lời:


10

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 đó): văn bản thay thế

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 :)


1
+1 này mô tả về cơ bản cách tôi tạo Máy trạng thái của mình. Nó đang làm việc tốt.
Kyle C

Bạn có thể tranh luận rằng có một tác động hiệu suất với mẫu "máy trạng thái hướng đối tượng" - tuy nhiên nó có thể nhẹ không?
Noob Saibot

@NoobSaibot Có, nhưng bạn có thể tranh luận rằng về bất cứ điều gì. Nếu khác có thể bị dự đoán chi nhánh kém, mẫu trạng thái như được mô tả ở trên có thể phải chịu chi phí tra cứu vtable. Cả hai đều không thể xảy ra trừ khi bạn có rất nhiều trạng thái. Vì vậy, câu trả lời thực sự cho câu hỏi của bạn là "nó phụ thuộc".
Ray Dey
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.