Tôi đang xây dựng một snake game phát trên bề mặt hình lập phương. Hiện tại nó sử dụng thuật toán của Dijkstra cho pathfinding. Mặc dù tối ưu hóa với cấu trúc dữ liệu xếp hàng ưu tiên và thiết lập, nó vẫn còn hơi chậm. Bạn nhận thấy sự chậm trễ khi con rắn ăn một món ăn và bắt đầu tìm kiếm một món ăn mới.Thuật toán hướng dẫn đường dẫn sao cho bề mặt khối lập phương
Tôi đang cố gắng sử dụng A * thay vào đó nhưng tôi không thể tìm thấy một phương pháp phỏng đoán tốt. Trên một mạng lưới phẳng với 4 hướng di chuyển, tôi sẽ sử dụng khoảng cách Manhattan. Tôi đã thử sử dụng 3D Manhattan khoảng cách abs(dx) + abs(dy) + abs(dz)
mà không làm việc vì lý do tốt: cho con rắn, thế giới trò chơi thực sự là 6 grids (corresponding to the faces of the cube) với bất thường xung quanh tài sản.
Trong mã, mỗi ô được lưu trữ trong mảng grid[15][15]
2D. Có 6 mảng như vậy để lưu trữ từng khuôn mặt. Vì vậy, mỗi ô vuông có một số (arrayX, arrayY, d)
để mô tả độ lệch trong mảng 2D và chỉ định mảng nào. Ngoài ra, mỗi ô vuông có một vị trí không gian mô tả (x, y, z)
ba.
Đây là khu vực của mã trò chơi, nơi pathfinding xảy ra:
https://github.com/mhluska/Snakeception/blob/master/src/js/game.coffee#L105
Dưới đây là mã thư viện cho A *:
https://github.com/mhluska/Stimpack/blob/master/src/js/graph.coffee#L60
một phù hợp, heuristic ngắn gọn là gì cho điều này thế giới game?
Bạn có thể nghĩ biểu đồ của mình dưới dạng lưới hình 2D + bao quanh, do đó, bạn có thể sử dụng tối thiểu một vài giá trị * (cố gắng tưởng tượng bạn sẽ làm như thế nào trên 1D lưới bao quanh đầu tiên) *. Tuy nhiên, chỉ với 1000 nút, điều này thực sự không cần thiết, ngay cả trong Javascript. Một số phần mã của bạn (hoặc có lẽ là cấu trúc dữ liệu bạn sử dụng) đang thực hiện ** cách ** quá dài để chạy. Bạn cần phải làm một số hồ sơ, để xác định những dòng đang gây ra sự chậm lại - bạn sẽ dễ dàng có thể tìm kiếm trên 1000 nút mà không có một sự chậm trễ đáng chú ý. –