Làm cách nào tôi có thể điều chỉnh thuật toán tìm đường tìm kiếm A * này để xử lý các giá trị di chuyển địa hình khác nhau?


8

Tôi đang tạo một trò chơi hành động dựa trên bản đồ 2D với thiết kế tương tác tương tự như Diablo II. Nói cách khác, người chơi nhấp xung quanh bản đồ để di chuyển người chơi của họ. Tôi vừa hoàn thành chuyển động của người chơi và đang chuyển sang tìm đường.

Trong trò chơi, kẻ thù nên tính phí nhân vật của người chơi. Ngoài ra còn có năm loại địa hình khác nhau cho các phần thưởng di chuyển khác nhau. Tôi muốn AI tận dụng những phần thưởng địa hình này khi chúng cố gắng tiếp cận người chơi.

Tôi được yêu cầu kiểm tra thuật toán tìm kiếm A * (http://en.wikipedia.org/wiki/A*_search_alacticm). Tôi đang chơi trò chơi này trong HTML5 và JavaScript và đã tìm thấy một phiên bản bằng JavaScript: http://www.briangrinstead.com/blog/astar-search-alerskym-in-javascript Tôi đang cố gắng tìm ra cách điều chỉnh nó Tuy nhiên.

Dưới đây là những ý tưởng của tôi về những gì tôi cần thay đổi. Những gì tôi cần phải lo lắng về?

  • Khi tôi tạo một biểu đồ, tôi sẽ cần khởi tạo mảng 2D mà tôi đã truyền qua với một đường ngang của bản đồ tương ứng với các loại địa hình khác nhau.
  • trong graph.js: Định nghĩa "GraphNodeType" cần được sửa đổi để xử lý 5 loại địa hình. Sẽ không có bức tường.
  • trong astar.js: Điểm gh sẽ cần được sửa đổi. Làm thế nào tôi nên làm điều này?
  • trong astar.js: isWall () có lẽ nên bị xóa. Trò chơi của tôi không có tường.
  • trong astar.js: Tôi không chắc đây là gì. Tôi nghĩ rằng nó chỉ ra một nút không hợp lệ để được xử lý. Khi nào thì điều này sẽ xảy ra?
  • Ở mức cao, làm cách nào để thay đổi thuật toán này từ "oh, có một bức tường ở đó không?" đến "địa hình này sẽ đưa tôi đến với người chơi nhanh hơn địa hình xung quanh tôi chứ?"

Vì thời gian, tôi cũng đang tranh luận về việc sử dụng lại thuật toán Bresenham của mình cho kẻ thù. Thật không may, các phần thưởng chuyển động địa hình khác nhau sẽ không được AI sử dụng, điều này sẽ khiến trò chơi bị hút. : / Tôi thực sự muốn có cái này cho nguyên mẫu, nhưng tôi không phải là nhà phát triển bằng thương mại cũng không phải là nhà khoa học máy tính. : D

Nếu bạn biết bất kỳ mã nào thực hiện những gì tôi đang tìm kiếm, hãy chia sẻ!

Mẹo kiểm tra vệ sinh cho việc này cũng được đánh giá cao.


Này, tác giả của thư viện ở đây. Bạn đang sử dụng phiên bản mới nhất từ ​​github? github.com/bgrins/javascript-astar/blob/master/astar.js . Nó nhanh hơn nhiều so với việc thực hiện dựa trên danh sách cũ.
Brian Grinstead

Câu trả lời:


7

Bạn cần chú ý đến một dòng rất cụ thể trong thuật toán:

// g score is the shortest distance from start to current node, we need to check if
//   the path we have arrived at this neighbor is the shortest one we have seen yet
var gScore = currentNode.g + 1; // 1 is the distance from a node to it's neighbor

Đây là chi phí của nút cụ thể đó. Bạn sẽ muốn sửa đổi nó thành một cái gì đó như

var gScore = currentNode.g + currentNode.cost

Điều này sẽ khiến đường dẫn tránh địa hình đắt tiền và thích địa hình rẻ tiền; bạn có trách nhiệm làm cho 'currentNode.cost' trả lại một cái gì đó phù hợp với địa hình của bạn. Có một thực tế là không phải tất cả các địa hình đều có chi phí là 1 mà bạn đang chú ý đến ... một số địa hình rẻ hơn so với các địa hình khác. Có những cân nhắc khác, nhưng điểm cụ thể này trong mã nên là trọng tâm chú ý của bạn.


Cám ơn vì cái này. Tôi đã sửa đổi mã của mình để mỗi nút tìm kiếm pixel theo tọa độ của nó và lưu trữ dưới dạng chi phí. Thật không may, tôi đã thực hiện một thử nghiệm tìm đường giữa hai điểm trên lưới 800x500 của tôi và trình duyệt của tôi gặp sự cố. : / Có một số yếu tố trong việc này: mã astar có thể cần tối ưu hóa; kích thước vải của tôi là rất lớn; có thể khởi tạo đồ thị của tôi là sai; và có lẽ màu sắc trên hình đại diện của nhân vật đang làm mọi thứ rối tung lên. Tôi nên làm gì? :(
user422318

Khi bạn nói 'lưu trữ pixel', bạn có nghĩa là nó lưu trữ chi phí địa hình của pixel, đúng không? Bởi vì một số giá trị RGB không thể phù hợp với chi phí thực tế của phần địa hình đó. Bạn có thể nên lưu trữ thứ gì đó trong khoảng từ 1 đến 10 (1 là đường, 10 là đầm lầy), mặc dù giá trị chính xác tất nhiên phụ thuộc vào trò chơi chính xác của bạn.
Myrddin Emrys

1
Này, tác giả của thư viện ở đây. Bạn đang sử dụng phiên bản mới nhất từ ​​github? github.com/bgrins/javascript-astar/blob/master/astar.js . Nó nhanh hơn nhiều so với việc thực hiện dựa trên danh sách cũ.
Brian Grinstead

2
@Brian Bạn nên đặt bình luận này cho câu hỏi, thay vì câu trả lời của tôi, để người thực sự sử dụng thư viện sẽ nhận được thông báo trong email của họ chứ không phải tôi.
Myrddin Emrys

2

Đây chính xác là thứ mà A * dành cho. Tất cả bạn cần làm là chỉ định các đỉnh giữa các chi phí nút dựa trên các loại địa hình. (Có vẻ như các ví dụ của bạn sử dụng biểu đồ trong đó tất cả các đỉnh có chi phí là 1.)


0

Việc thực hiện này là một chút cụ thể để bật / tắt ngay bây giờ. Như Myrddin Emrys nói, bạn sẽ cần sửa đổi điểm g dựa trên chi phí (thay vì chỉ bằng 1). Có một cuộc thảo luận về vấn đề này ở đây: https://github.com/bgrins/javascript-astar/issues/3 .

Tôi rất muốn có được giải pháp này được chuyển trở lại thư viện chính nếu bạn làm cho nó hoạt động!

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.