2013-06-15 23 views
12

Tôi hiện đang viết trò chơi 2D bằng Javascript bằng phần tử HTML5 <canvas>. Nó đến cùng rất độc đáo, nhưng tôi đã gặp rắc rối.Thuật toán tìm đường dẫn dựa trên lưới 2D tốt là gì?

Thiết kế cấp cho trò chơi của tôi là lưới (vì vậy chi phí đường dẫn di chuyển từ một ô đến ô phía bắc/nam/đông/tây là 1) với nhiều chướng ngại vật chiếm nhiều vị trí khác nhau trong lưới – giống như một mê cung, nhưng với rất nhiều phòng lung linh hơn. Mỗi cấp độ cá nhân là theo thứ tự 400 × 200 ô.

Tôi đang cố gắng thực hiện kẻ thù sẽ tìm kiếm người chơi bất kể họ ở đâu, nhưng tôi đang gặp sự cố khi dịch một trong các thuật toán tìm đường khác nhau để phù hợp với tình huống của tôi. Hầu hết những cái tôi đã gặp (như A * và Dijkstra) có vẻ phù hợp nhất với các tình huống 2D phức tạp hoặc 3D phức tạp hơn. Tôi đã tự hỏi nếu nó có thể đơn giản hóa đáng kể các thuật toán này để phù hợp hơn với mục đích của tôi, hoặc nếu một cái gì đó giống như tìm kiếm chiều sâu đầu tiên sẽ là một thay thế hiệu quả hơn cho kích thước cấp.

+0

Bạn sẽ không làm tốt hơn A * mà không cung cấp cho nó một số loại kiến ​​thức trước về các đường dẫn có thể (như chia bản đồ thành các phân đoạn có kết nối đã biết). Độ sâu đầu tiên sẽ nhiều (nhiều hơn nhiều) chậm hơn bề rộng đầu tiên. – Dave

+0

Điều này không thực sự là những gì Stackoverflow/Stack Exchange là về; đặt câu hỏi với câu trả lời nhất định, không phải là câu hỏi mua sắm. Bằng mọi cách, hãy sử dụng những gì mọi người đề xuất, nhưng hãy quay trở lại khi bạn gặp phải vấn đề về lập trình. – Amelia

+0

@Dave: Vâng, bạn có thể dễ dàng [tìm thấy tốt hơn so với plain-ol 'A \ *] (http://programmers.stackexchange.com/questions/197894) khi bị ràng buộc vào lưới; nhưng, JPS + A \ * phức tạp hơn chỉ là A \ * và thường không cần thiết. –

Trả lời

14

A * là thuật toán phân loại 2D rất phổ biến. Nó có thể mất một ít thời gian để quấn đầu của bạn xung quanh những gì đang xảy ra nếu pathfinding là không quen thuộc, nhưng nó không terribly phức tạp. Bạn có thể chỉ nhìn vào mã ví dụ của người khác đã được phát triển cho một ứng dụng phức tạp hơn bạn dự định. Có a good tutorial for understanding the algorithm here.

+0

Cảm ơn bạn, tôi sẽ xem xét nó. – creXALBO

+5

Liên kết dường như đã chết. –

+0

Nếu liên kết có vẻ như đã chết, hãy thử gửi email: patrick (at) policyalmanac (dot) org – Skrivener

2

EasyStar.js là một thư viện trông đẹp mắt dường như làm những gì bạn muốn. Tôi đã không sử dụng nó bản thân mình, nhưng các tài liệu trên trang github của dự án trông khá tốt, và nó có thể là những gì tôi sẽ chọn ở vị trí của bạn.