Làm thế nào để tìm đường vượt qua một chướng ngại vật?


10

Làm thế nào để thể hiện tốt nhất tình huống sau đây - tác nhân ( @) cần đến mục tiêu ( $). Đường dẫn bị chặn bởi một con hào ( ~~~). Một cái cào (hoặc một số thiết bị khác, như giày đi bộ dưới nước) có sẵn sẽ giúp nó có thể vượt qua chướng ngại vật.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

Làm thế nào để đúng pathfind từ @để $cung cấp không có ngay lập tức con đường có sẵn? Con đường của tôi không chỉ có chi phí mà còn cả điều kiện tiên quyết?

CẬP NHẬT : Vấn đề là mục tiêu không thể truy cập và cào chỉ là một trong nhiều đối tượng có thể có trên bản đồ. Câu hỏi sau đó là "làm thế nào để làm cho các đại lý hiểu rằng nó cần cào?"


Tôi nghĩ bạn nên làm rõ trường hợp sử dụng của mình vì điều đó sẽ ảnh hưởng đến phương pháp tiếp cận để giải quyết vấn đề này. Ví dụ: nếu trường hợp sử dụng là để tính toán đường đi cho kẻ thù thì trước tiên bạn có thể xem liệu mục tiêu có thể đạt được hay không, nếu không có kẻ thù có được cào (tức là cào là mục tiêu) và sau đó tìm đường đến mục tiêu đầu tiên mục tiêu một lần nữa.
jhocking

Câu trả lời:


6

Tôi đang nghĩ về một chồng các mục tiêu, việc tìm đường sẽ phải được chú thích :

  • Bắt đầu với một mục tiêu get $
  • Hãy thử tìm đường đến $- đường dẫn tồn tại với khả năng đi bộ cần thiết.
  • Đẩy mục tiêu get waterwalking.
  • Mục tiêu hiện đang là get waterwalking, get $
  • Bằng cách nào đó thấy rằng cào cho đi đường thủy, hãy đổi tên nó thành thuyền.
  • Đường cào. Mục tiêu hàng đầu đạt được, bật nó từ ngăn xếp, mục tiêu là get $.
  • Đường dẫn đến $- bây giờ chúng tôi có khả năng và có thể đạt được mục tiêu.

1
+1 Tôi đã làm một cái gì đó tương tự với trò chơi của mình và đã viết một bài đăng nhỏ về nó một thời gian dưới mục Nhiệm vụtìm đường .
MichaelHouse

@ byte66 không xử lý trường hợp đặc biệt khi có đường dẫn mà không sử dụng cào nhưng, sử dụng kết quả cào trong đường dẫn ngắn hơn
Ali1S232

@Gajet bạn nói đúng. Đoán sẽ cần một cách tiếp cận khác cho điều đó.
zzandy

1
Đó chỉ là vấn đề thêm chi phí. Khi bạn gặp nước, hãy thêm chi phí để có được vật phẩm đi bộ dưới nước vào lối đi. A * sẽ bỏ qua việc đi bộ dưới nước cho đến khi nó trở thành con đường rẻ nhất.
MichaelHouse

3

Toàn bộ công cụ tìm đường dẫn chỉ là tìm kiếm đường dẫn ngắn nhất trên biểu đồ. để giải quyết vấn đề của bạn, thay đổi duy nhất bạn cần áp dụng là thêm một số cạnh bổ sung (đại diện cho con đường dẫn thuyền có thể thực hiện) và thực hiện thuật toán tìm đường dẫn đơn giản. không quan trọng bạn sử dụng BFS, Dijkstra hay A *, chỉ cần thực hiện thuật toán tìm đường thông thường với một số cạnh bổ sung. để biết thêm thông tin về tìm đường trong trang wiki kiểm tra biểu đồ


+1 Làm cho cào của bạn thành một liên kết một chiều với nước, với các liên kết một chiều với mặt đất.
Laurent Couvidou

Tôi không hiểu rõ làm thế nào để liên kết tìm kiếm hình học và tìm kiếm tính năng. Làm thế nào để đi từ no path from @ to $đến goto rake, bring it to water, place it, goto $.
zzandy

@zzandy trong khi tìm đường dẫn, cho mỗi ô bạn đi đến ô gần nhất nếu có thể. bạn chỉ cần thêm một điều kiện là nếu nút hiện tại là một cái cào, bạn có thể trực tiếp thêm một nút từ phía bên kia của dòng sông để mở danh sách.
Ali1S 232

Nhưng nếu bạn có thể mang theo thiết bị thì sao? Tôi nghĩ đó là những gì anh ấy muốn nói (và đó là câu trả lời của tôi.)
kaoD

Vâng, ý tôi là thiết bị có thể (và phải) được chăm sóc. @kaoD, câu trả lời của bạn không bao gồm bước khi một đại lý có ý tưởng cần cào.
zzandy

2

Tôi sẽ làm điều này với một số loại giải pháp cây hành vi - bạn dẫn đến mục tiêu và lưu ý tất cả các chướng ngại vật đã chặn A * của bạn. Nếu bạn thất bại, bạn kiểm tra xem có những đối tượng có thể giúp vượt qua những trở ngại đó hay không, trong trường hợp đó, đường dẫn đến đối tượng đó. Nói lại. Điều này có nghĩa là tác nhân cần cố gắng đi đến mục tiêu và thất bại trước khi có ý tưởng sử dụng các công cụ, điều này có thể mất thời gian, đặc biệt là nếu có một thế giới lớn của gạch mà tất cả cần phải được kiểm tra. Có thể không nhìn quá lạc hậu mà các đại lý phải mất một thời gian để suy nghĩ về cách giải quyết vấn đề mặc dù.

Tôi có thể tưởng tượng một giải pháp thực sự, khó khăn. Thêm một chiều khác cho bạn đường tìm lưới. Vì vậy, trong trường hợp bản đồ 2D, bạn tạo lưới 3D tìm đường. Trong ví dụ đơn giản này, chiều mới này sẽ chỉ có độ sâu là hai, nhưng trong một trò chơi thực sự, nó sẽ trở nên lớn nhanh chóng.

Tại z = 0, bạn lập bản đồ địa hình trong các trường hợp thông thường, có nghĩa là gạch nước được coi là không thể vượt qua.

Với z = 1, bạn lập bản đồ địa hình trong khi có cào, có nghĩa là gạch nước được coi là có thể đi bộ (nhưng nếu bạn có ví dụ như gạch ốp tường, thì gạch đó có thể vẫn vững chắc).

Tìm kiếm đường dẫn là một A * bình thường trong các kích thước x và y, có nghĩa là mọi ô lưới được coi là có quyền truy cập vào các lân cận của nó. Tuy nhiên, ở kích thước z, A * KHÔNG được phép trải rộng.

Ngoại trừ nơi cào là. Đối tượng cào đóng vai trò mở giữa z = 0 và z = 1 trong lưới tìm đường.

Điều này có nghĩa là A * sẽ tràn vào bên ngoài trong z = 0, chạm vào nước và hết các tùy chọn - sau đó nó sẽ lan sang z = 1 qua gạch cào và tại z = 1 (nơi có thể đi được nước) tìm đường đến mục tiêu Hiệu quả là sự do dự của NPC do dự di chuyển đến cào, và sau đó di chuyển con đường ngắn nhất đến mục tiêu.


Tôi đã đối xử với cái cào giống như "giày đi bộ dưới nước" trong ví dụ của tôi, nghĩa là một vật mà nếu bạn có nó sẽ khiến bạn có thể di chuyển trên gạch nước. Nếu cái cào cần thực sự được "xây dựng" như một mảnh địa hình và bao phủ một số lượng hạn chế của gạch có thể hoặc không đủ để vượt qua mặt nước, thì vấn đề khó khăn hơn. Giải pháp của tôi không cho phép các mục sử dụng một lần, nếu bạn thực hiện chuyển động trong z = 1 sẽ tự động giảm xuống z = 0 một lần nữa.
Joar Jakobsson
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.