Tìm các động thái khả thi cho một thực thể trong trò chơi lát gạch 2ngày


10

Tôi đang gặp vấn đề với một thuật ngữ tìm kiếm cụ thể cho vấn đề này, nhưng làm thế nào để tìm kiếm những bước đi khả thi trong trò chơi chiến lược theo lượt 2D (ví dụ FF: Tactics, Fire Badge, Advance Wars).

nhập mô tả hình ảnh ở đây

Tôi không nghĩ nhiều về địa hình (hoặc thậm chí va chạm) vào thời điểm này. Tôi chỉ tự hỏi tôi có thể sử dụng thuật toán nào để tìm ra rằng thực thể X có thể di chuyển 5 ô và tấn công 2 ô xa hơn thế.

Tôi biết tôi có thể sử dụng một cái gì đó như Dijkstra để tìm khoảng cách giữa hai điểm. Một triển khai có thể là bắt đầu tại vị trí của người chơi và sau đó phân nhánh từ đó cho đến khi khoảng cách mà Dijkstra trả về lớn hơn số lần di chuyển.

Chỉ cần tự hỏi nếu ai đó có thể chỉ cho tôi đi đúng hướng (tức là tên của thuật toán, kỹ thuật, bài viết, v.v.).


Tôi nghĩ rằng nó được gọi là tìm đường, cho một cụm từ tìm kiếm? Nếu bạn sử dụng tìm đường thì bạn có thể có bộ đếm để xử lý những gì bạn cần
Exikle

Đây thực chất là một phần của việc tìm đường dẫn (tính toán dữ liệu meta cho chi phí di chuyển). Bạn chỉ xác định các vị trí nằm trong phạm vi, nhưng bạn không nhất thiết phải xác định tuyến đường bạn đi.
Mario

1
Đó không phải là thời gian thực (RTS) nếu đó là FFTactics theo lượt. : p
Alayric

Trong 2ngày, bạn có thể sử dụng phép tính Taxicab / Manhattan en.wikipedia.org/wiki/Taxicab_geometry
Gerben Jacobs

Câu trả lời:


5

Tôi nghĩ rằng một Dijkstra bị ràng buộc chính xác là những gì bạn muốn sử dụng. Cách mà Dijkstra tìm thấy khoảng cách giữa hai điểm là nó vạch ra khoảng cách đến mọi nút từ một nút gốc và sau đó 'chọn' đường đi ngắn nhất từ ​​bản đồ khoảng cách này. Bạn muốn làm hầu như cùng một việc, ngoại trừ bạn muốn biểu đồ nút khoảng cách mà nó tạo ra như đầu ra, thay vì đường dẫn đến bất kỳ điểm cụ thể nào.

Một sửa đổi bạn sẽ muốn thực hiện là bỏ qua việc tính toán khoảng cách từ các nút đã vượt quá phạm vi di chuyển tối đa của bạn. Sau đó, bạn sẽ có một biểu đồ nút của tất cả các nút mà đơn vị có thể di chuyển tới, cộng với một đường viền, vì vậy chỉ cần cắt bỏ các nút có khoảng cách lớn hơn mức cho phép di chuyển.

Viola.

Nói cách khác, khá nhiều những gì bạn mô tả trong câu hỏi của bạn là những gì bạn cần làm. Nó cũng có lợi ích là có thể sử dụng đầu ra để thực hiện tìm đường, mà không cần phải thực hiện bất kỳ tính toán nào nữa.


Tôi nghĩ rằng Dijkstra là quá mức cần thiết trong trường hợp này. OP không cần đường dẫn đến tất cả các điểm đến di chuyển có thể, chỉ cần câu trả lời có / không về việc liệu một đại lý có thể đến đó hay không. Anh ta có thể tính toán một đường dẫn sau khi người dùng đã chọn một đường dẫn.
Michael Kristofik

Chi phí sử dụng thuật toán của Dijkstra để tính toán đường dẫn sau khi điểm đến đã được quyết định gần như chính xác giống như sử dụng thuật toán trả trước (trừ khi bạn sử dụng cách tiếp cận heuristic như A * cho đường dẫn). Không làm điều đó lên phía trước chỉ đơn giản là tạo ra công việc dư thừa, vì Dijkstra sẽ trả lời cả hai câu hỏi 'tôi có thể đi đâu' và 'làm thế nào để tôi đến đó?'. Nó cũng cho phép bổ sung các biến chứng vào môi trường làm thay đổi chi phí di chuyển, mặc dù điều đó có thể không cần thiết cho ứng dụng. Hơn nữa, cách tiếp cận được ghi chép tốt, rất hữu ích cho người thực hiện.
TASagent

1
Khi xem qua câu trả lời của Mario, anh ta thực sự mô tả thuật toán của Dijkstra, ngoại trừ anh ta đảo ngược khoảng cách, và không đề cập đến đó là Dijkstra.
TASagent

1
Sẽ không nói đó là Dijkstra, bởi vì bạn không thực sự tìm kiếm một tuyến đường ngắn nhất cũng như bạn đang cố gắng đạt được một số điểm cụ thể. Nó thực chất là phần đầu tiên của Thuật toán Dijkstra, điều đó đúng. Vấn đề với từ ngữ của bạn, sử dụng Dijkstra, có thể gây hiểu nhầm và tôi nghĩ đây cũng là điều khiến Michael bối rối. Anh ta có thể nghĩ rằng bạn đề nghị sử dụng Dijkstra một lần cho mỗi trường / ô.
Mario

1
Kết thúc bằng cách sử dụng phương pháp này vì nó hoạt động tốt và rất dễ mở rộng để xử lý các chướng ngại vật.
NRaf

12

Cách tiếp cận đơn giản nhất (và có lẽ là ngây thơ nhất) mà tôi có thể nghĩ ra ngay bây giờ:

  • Bắt đầu tại nhân vật của bạn và đánh dấu tất cả các lĩnh vực xung quanh là steps - 1.
  • Lặp lại trên tất cả các trường được đánh dấu mới và một lần nữa đánh dấu các trường xung quanh của chúng là steps - 1nơi stepssẽ là số bước của trường hiện tại, trừ khi trường mới có số đã cao hơn.
  • Lặp lại bước cuối cùng cho đến khi bạn hết bước.

1
Thuật toán này có tên: Flood Fill .
Michael Kristofik

6
@MichaelKristofik: Tôi sẽ gọi nó là tìm kiếm đầu tiên . Lấp đầy không theo dõi khoảng cách.
BlueRaja - Daniel Pflughoeft

2

Tôi nghĩ những gì bạn đang tìm kiếm có thể là Manhattan Khoảng cách . Giả sử không có trở ngại, bạn có thể nói rằng một hình vuông có thể truy cập đơn giản nếu:

| toX-fromX | + | toY-fromY | <maxMoveDistance

Thuật toán này có thể không phải là hướng đi đúng đắn nếu bạn gặp trở ngại sau này; một cách khả thi để điều chỉnh nó có thể liên quan đến việc có chướng ngại vật 'đổ bóng' và đánh giá lại từ điểm gần nhất.

EDIT (Vì hiện tại tôi có thêm một chút thời gian rảnh rỗi):

Theo 'bóng' tôi có nghĩa là một cái gì đó như thế này, nếu 0 là một hình vuông có thể tiếp cận, C là ký tự và X là một trở ngại:

 012345678
0    0
1   00
2  000X
3 000C000
4  00000
5   000
6    0
 012345678

Vì (5, 2) là một trở ngại, bạn bắt đầu bằng cách giả sử rằng bạn không thể nhận được bất cứ điều gì với x> = 5 VÀ y <= 2. Sau đó, bạn có thể tính toán lại từ một hình vuông khác; nếu bạn muốn đi đến (5, 1), bạn có thể tính khoảng cách manhattan từ (4, 1) và xem nếu đó + khoảng cách từ nhân vật đến (4, 1) nhỏ hơn khoảng cách di chuyển của người chơi.

Đây là một ví dụ khá nhỏ, nhưng nếu bạn có nhiều chướng ngại vật và / hoặc phạm vi di chuyển dài hơn một chút, nó sẽ có thể xử lý sự phức tạp.

Cho dù nó thực sự tốt hơn là chỉ lấp đầy lũ, về độ phức tạp trong lập trình hay hiệu quả thực thi, tôi không có manh mối. Có vẻ như là một cách thú vị hơn để giải quyết vấn đề.


Bạn có ý nghĩa gì khi đúc bóng?
NRaf

1
Chỉnh sửa để làm rõ.
Tin Man
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.