2010-11-22 31 views
9

Tôi đang cố gắng tạo "cây hành vi" bằng C#.Tạo cây Hành vi AI trong C# - Làm thế nào?

Đối với những người không biết, một cây hành vi về cơ bản là một khuôn khổ mà bạn có thể xây dựng một AI xung quanh. Có Sequencers, Selectors, Decorators, hành động hỗn hợp, và những thứ khác.

Tôi đã tìm thấy một thư viện duy nhất đã đặt "cây hành vi" trong C#, nằm ở đây (http://code.google.com/p/treesharp/) nhưng tôi không thể hiểu cách sử dụng nó vì không có mã ví dụ nào tôi có thể vẽ. Bất cứ ai ở đây có lẽ làm cho một số mã ví dụ đơn giản cho thấy làm thế nào để thực sự sử dụng khung này .. hoặc có lẽ bạn biết một cách khác để impliment một cây hành vi trong C#?

Cảm ơn bạn rất nhiều!

+1

Thư viện bạn đã đề cập trên code.google.com đã được thêm gần một năm trước và được cập nhật lần cuối hai tuần sau đó. Nếu bạn có kế hoạch sử dụng nó, bạn có thể sẽ không tìm thấy bất kỳ ví dụ nào, có thể tốt hơn nếu bạn tìm kiếm một thư viện khác hoặc phát triển thư viện của riêng bạn. – tbridge

Trả lời

14

Tôi chỉ xem xét triển khai đó và tôi thấy mình tự hỏi tại sao rất nhiều mã là cần thiết cho một cái gì đó tương đối đơn giản.

Từ những gì bạn nói, bạn muốn có một cách đơn giản để sáng tác hành vi. Một hành vi ở đây, tôi đoán, là một ánh xạ từ trạng thái đến 0 hoặc nhiều hành động hơn bởi một tác nhân. Bạn có thể mô hình hóa điều này rất dễ dàng bằng cách sử dụng C# lambdas. Ví dụ:

Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) { 
    return() => { if cond() then ifTrue() else ifFalse() }; 
} 

Action Sequencer(Action a, Action b) { 
    return() => { a(); b(); } 
} 

Lá của cây là những hành động đơn giản làm điều gì đó phù hợp với tiểu bang. Bạn "chạy" một cái cây đơn giản bằng cách thực hiện nó.

Nếu bạn muốn trở nên lạ mắt, bạn có thể tham số hóa lược đồ này để làm cho trạng thái rõ ràng.

Hy vọng điều này sẽ hữu ích.

---- Phụ Lục ----

Jason hỏi cho một ví dụ về làm thế nào bạn có thể sử dụng phương pháp này, vì vậy đây là một cách đơn giản "AI" tuần tra bảo vệ dụ (tôi giả sử WorldState tương ứng với một mô tả về môi trường tại thời điểm cây hành vi được đánh giá):

Func<bool> ifPlayerIsInSight =() => ...true iff WorldState shows guard can see player...; 

Action shootAtPlayer =() => { ...aim guard's weapon at player and fire... }; 

Func<bool> ifUnderFire =() => ...true iff WorldState shows guard hears player gunfire...; 

Action takeCover =() => { ...guard runs for nearest shelter... }; 

Action walkBackAndForthGuardingDoorway =() => { ...default guard patrol behaviour... }; 

Action patrollingGuardBehaviour = 
    Selector(ifPlayerIsInSight, shootAtPlayer, 
    Selector(ifUnderFire, takeCover, 
     walkBackAndForthGuardingDoorway)); 

Để bảo vệ làm điều gì đó, chỉ cần gọi patrollingGuardBehaviour(). Lưu ý rằng các phân số và thử nghiệm khác nhau có thể được thực hiện như các phương thức với các chữ ký bên phải chứ không phải là inline như lambdas. Bạn có thể thêm các bộ kết hợp khác vào SelectorSequencer, ví dụ: để có hoạt động song song.

+1

Rafe ... hành vi cây là một chút tham gia thực sự ... hãy để tôi cố gắng chỉ đơn giản giải thích chúng: Cây bắt đầu với một gốc .. và sau đó nó chi nhánh thành các chi nhánh riêng biệt của logic từ đó. Mỗi nhánh có một "bộ lọc" để quyết định xem AI có cần lấy nhánh đó hay không. Ngoài ra còn có "trình tự" chạy một chuỗi các hành động, trở về sau thất bại của bất kỳ hành động nào, và "bộ chọn" chạy các hành động cho đến khi tìm thấy thành công (bỏ qua các lỗi). Có những thứ khác, nhưng đó là cốt lõi của nó. Chúng ta có thể nói về chuyện này một chút qua trò chuyện bằng cách nào đó không? – Jason

+0

Tôi chỉ thực sự bối rối về cách tôi có thể thực sự impliment một cái gì đó như thế trong C# .. ví dụ của bạn là thực sự tốt nhưng .. một lần nữa tôi không thể thực sự hiểu nó. Có lẽ cho sự cố ý của bạn, bạn có thể viết một ví dụ nhỏ mà sẽ hiển thị thực sự bằng cách sử dụng cấu trúc? – Jason

+0

Đầu tiên bạn xây dựng cây: bạn xác định hành động và khi nào (điều kiện) và cách (song song, tuần tự, vv) chúng được thực hiện. Để đơn giản, bắt đầu với một cây luôn luôn bắt đầu thực hiện từ nút gốc và chọn (các) con của nó tùy thuộc vào điều kiện hiện tại (đầu vào cảm giác). Có nhiều chi tiết và cải tiến triển khai, nhưng đó là quy trình làm việc đơn giản nhất. Bạn có chắc bạn hiểu BT là một khái niệm? Nếu không, hãy thử http://aigamedev.com/insider/presentations/behavior-trees/ (yêu cầu đăng ký miễn phí) và diễn đàn của họ. – ftt

4

Dường như một trong những nhà phát triển đằng sau TreeSharp, apocdev, có một số code that uses TreeSharp for some kind of spell-casting World of Warcraft player.

Dưới đây là một snippit:

public Composite CreateSpellCheckAndCast(string name) 
{ 
    return new Decorator(
     ret => Spells.CanCast(name), 
     new Action(ret => Spells.Cast(name))); 
} 

Tôi không chắc chắn, nhưng việc sử dụng ở đây có vẻ khá đơn giản: lớp Decorator vẻ như nó sẽ kiểm tra một vị ngữ (Spells.CanCast) trước khi cố gắng thực hiện một số hành động (Spells.Cast) .

Vì vậy, Composite có lẽ là Action có thể thực hiện một số việc, ví dụ: kiểm tra một vị ngữ trước hoặc thực hiện một số hành động theo thứ tự.

apocdev's blog đề cập this overview of behavior trees, mà liên kết đến giới thiệu tổng quát hơn của sequences, selectors, và decorators.

+0

dường như hầu hết các liên kết trên câu trả lời này đều bị hỏng: ( – roundcrisis

+0

@Miau: Vâng, có vẻ như blog của apocdev đã ngừng hoạt động. Tôi sẽ để lại các liên kết ngay bây giờ, trong trường hợp nó trở lại trong tương lai gần. –

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