Làm thế nào để tìm đường trong các trò chơi RTS hoạt động?


42

[crossposted từ stackoverflow]

Trong một trò chơi như Warcraft 3 hay Age of Empires, những cách mà đối thủ AI có thể di chuyển trên bản đồ dường như là vô hạn. Các bản đồ là rất lớn và vị trí của những người chơi khác liên tục thay đổi.

Làm thế nào để tìm đường AI trong các trò chơi như thế này hoạt động? Các phương pháp tìm kiếm đồ thị tiêu chuẩn (như DFS, BFS hoặc A *) dường như là không thể trong thiết lập như vậy.


2
Tại sao A * không hoạt động trong biểu đồ này?
dùng712092


1
@tenfour, liên kết bị hỏng ngay bây giờ.
Montreal

Câu trả lời:


29

Trong hầu hết các trường hợp, sử dụng A * trên lưới điều hướng (thường được gọi là "navmesh") là giải pháp RTS thương mại sử dụng giải pháp tìm đường. Có một lời giải thích chi tiết về cách thức hoạt động của các tàu hải quân, tại sao chúng là một giải pháp tốt hơn các hệ thống điểm và liên kết đến các tài nguyên triển khai ở đây .

Nếu bạn đang có kế hoạch phát triển các chế độ trò chơi đặc biệt (chụp điểm / nút) hoặc các đơn vị tuần tra, bảo vệ, v.v., có lẽ bạn sẽ muốn thực hiện một lớp điểm trên đỉnh điều hướng của mình, để điều khiển hành vi AI ( không phải tìm đường ).


17

Kiểm tra thuật toán Flowfield được sử dụng trong Chỉ huy tối cao 2. Nó thực hiện công việc tốt hơn nhiều so với hầu hết các hệ thống tìm đường RTS thực hiện (bỏ qua trước 0 giờ 50 để biết một vài ví dụ.)


4
đó là một bản demo thực sự tuyệt vời nhưng không cho tôi biết gì về bản thân việc triển khai
MetaGuru

4
Họ đã đề cập trong một câu - nó dựa trên nghiên cứu dòng chảy đám đông của UW, mà bạn có thể tìm thấy tại grail.cs.washington.edu/projects/crowd-flows .

Thuật toán dòng chảy có vẻ khá thú vị và dường như thực hiện công việc tìm đường tốt hơn nhiều so với hầu hết các thuật toán, nhưng tôi ước có tài liệu công khai về cách thức hoạt động của hệ thống, không chỉ là cách hệ thống hoạt động. Đương nhiên, có rất nhiều câu hỏi mà các nhà phát triển nên hỏi trước khi triển khai một hệ thống cốt lõi như thế này, nhưng, trong trường hợp này, dường như cách duy nhất để trả lời những câu hỏi đó là triển khai hệ thống trước. :(
Ari Patrick

2
@Kragen: Bạn thực sự chỉ cần hai đơn vị trước khi A * (đặc biệt là điểm tham chiếu) khiến chúng va vào nhau nhiều lần và bạn cần một loại hệ thống để hoạt động xung quanh nó.

5
Dựa trên video, tính năng tìm đường của Starcraft 2 trông như thế này. SC2 có sử dụng lưu lượng không?
Chris Bùi

7

Nhiều trò chơi cũ hơn sử dụng A *. Starcraft ban đầu đã sử dụng A *; dẫn đến một số vấn đề trong việc xử lý va chạm. Xử lý va chạm của Starcraft 2 rất tốt, sử dụng hành vi đổi / đổ để duy trì kiểm soát chất lỏng của các nhóm lớn. Bài báo gamedev này thảo luận về cách thức này có thể đạt được.


2

Tôi đồng ý với các câu trả lời khác của cô ấy, nhưng cũng vậy, hãy thử nghĩ về WoW / Warcraft3 như thế giới 2D thực tế. Họ không có gì khác biệt so với cá rô, đó chỉ là những viên gạch.

Bạn cũng có thể nghĩ làm thế nào để GPS tìm thấy con đường tốt nhất? có vô số thuật toán để tìm đường đi qua các bản đồ được liên kết.

Tôi nghĩ rằng một số tập lệnh "Quake bot" đầu tiên cũng có thể giúp bạn, vì chúng được phát triển để hoạt động ở "khu vực không xác định" bởi vì chúng tôi có thể thiết kế cấp độ của riêng mình từ đầu.

Nói chung, cách cá nhân của tôi để đối phó với một bản đồ như vậy, sẽ là nghĩ về nó như là đường dẫn A *. Nhưng trước tiên tôi sẽ định trước mọi "điểm gạch" và lập chỉ mục tất cả những điểm này với "hàng xóm gần nhất", v.v. Sau đó, khi một đối tượng cần đi từ A đến B, sau đó chỉ cần tra cứu trong B, xem những gì nó được kết nối và tiếp tục lặp lại cho đến khi bạn đạt được mục tiêu

Tùy thuộc vào loại trò chơi và bối cảnh / kịch bản, các chiến thuật quét trước khác nhau cũng có thể hữu ích. Một số trò chơi có rất ít chướng ngại vật và đây có thể là chuyển động "streight line" + một số "cách tôi di chuyển" cho các đối tượng.

Hy vọng điều này có ý nghĩa một chút và có lẽ đã cho bạn một số suy nghĩ để làm việc với.


1

Hầu hết các trò chơi đều sử dụng một số loại Thuật toán tìm kiếm hoặc A * để tìm đường dẫn trên bản đồ. AI được điều chỉnh ở một số khía cạnh rõ ràng vì lý do hiệu suất.

Bạn sẽ nhận thấy điều này trong Starcraft 2, nơi Zerglings rõ ràng không đi đường tốt chút nào, đó sẽ là một cơn ác mộng CPU đối với Zerglings. Họ chỉ làm tốt nhất để đi từ A đến B và thậm chí không cố gắng tìm ra con đường tốt nhất. Họ sẽ đến gần nhất có thể sau đó chai cổ tại cuộn cảm hoặc đường dốc.


1

Bản đồ là một lưới. Lưới là một đồ thị. A * hoạt động trên biểu đồ, nó là một thuật toán tìm kiếm biểu đồ. A * nên tìm kiếm vài nút của đồ thị.

Như đã đề cập họ có thể sử dụng lưới điều hướng. Nhưng dù sao thì A * (hoặc một cái gì đó tương tự) sẽ nằm trên lưới đó, bởi vì đa giác của lưới này chỉ là các nút của biểu đồ; A * sau đó sẽ tìm kiếm đường dẫn từ một đa giác đến một đa giác khác.

Không chắc chắn về Warcraft hay game thương mại, nhưng cũng có một kỹ thuật gọi là Collaborative Diffusion và nó rất đơn giản; nó thường được thực hiện trên lưới. Ngoài ra còn có kỹ thuật gọi là Trường tiềm năng , rất giống với trường trước nếu không giống nhau.

Bạn cũng có thể thử:

  • liệu một số trò chơi này có sẵn mã nguồn không
  • liệu một số bản sao của các trò chơi này có sẵn nguồn không
  • liệu SDK hay biên tập viên không gợi ý điều gì
  • hỏi nhà tuyển dụng của các công ty làm những trò chơi này, một số trong số họ có thể sẵn sàng chia sẻ

0

Tôi hoàn toàn không có kinh nghiệm, nhưng tôi nghĩ rằng một giải pháp tốt dựa trên phương pháp phỏng đoán, chứ không phải kiểm tra toàn bộ bản đồ đã biết. Heuristic tôi có thể nghĩ là dựa trên địa phương và dựa trên kinh nghiệm. Kiểm soát cục bộ có thể dựa trên kiểm tra địa hình và chướng ngại vật địa phương, tiếp tục di chuyển theo hướng yêu cầu. Tôi nghĩ rằng hầu hết các bản đồ không yêu cầu các chuyển động giống như mê cung phức tạp, nhưng được kết nối khá tốt. Một heuristic khác là sử dụng các đường dẫn đã biết trước đó (được khám phá bởi các đơn vị khác hoặc rõ ràng bởi người dùng) để di chuyển các đơn vị đến các vị trí đã biết hoặc gần biết. Nhưng tôi đang nói về việc di chuyển trên các bản đồ lớn, không thực sự trong không gian kín như ZorbaTHut nói. Trong các trường hợp đông đúc, thuật toán có thể phức tạp hơn, đòi hỏi các loại "dự đoán", phối hợp giữa các đơn vị trong cùng một nhóm hoặc chỉ là các chiến lược chờ đợi giống như semaphore. Cũng thế,

Tôi nghĩ thuật toán heuristic là tốt bởi vì chúng thường cung cấp một giải pháp tốt trên các không gian lớn với thời gian tính toán hợp lý (điều này không quan trọng, khi bạn di chuyển nhiều đơn vị).

Xin lỗi nếu đây là một câu trả lời chung chung: Tôi đã làm việc với đám đông, nhưng không gian khá đặc biệt và tôi không thể giải thích chính xác cách thuật toán hoạt động (dù sao cũng dựa trên tác nhân, không được xác định toàn cầu). Tôi hy vọng bạn có thể nhận được một số ý tưởng hữu ích từ câu trả lời của tôi.


Mmmh tôi tự hỏi có gì sai trong những gì tôi nói ... Có quá khó để đưa ra một nhận xét?
AkiRoss

BTW, tôi muốn nhấn mạnh rằng A * sử dụng phương pháp heuristic. Cảm ơn vì -2.
AkiRoss

Câu trả lời của bạn là, "Mương A * và ilk của nó và tự lăn". Đó có thể là khởi đầu cho một câu trả lời hợp lý nhưng bạn cung cấp rất ít thông tin khác ngoài gợi ý. Nó nghĩ rằng lý do để bỏ phiếu là bạn không nói rõ giải pháp của bạn sẽ khó thực hiện như thế nào. Tôi không nghi ngờ rằng một siêu thiên tài được cung cấp thời gian không giới hạn có thể trao mã / điều chỉnh thuật toán đường dẫn cho một RTS nhất định sẽ vượt trội hơn A * trên một hải quân. Nhưng "thiên tài" và "không giới hạn" rất khó để có được.
deft_code

Ô đúng rồi. Tôi nghĩ rằng anh chàng muốn có một câu trả lời chung chung, vì anh ta không hỏi làm thế nào để tạo ra một câu trả lời, nhưng làm thế nào để họ làm việc nói chung. Dù sao tôi không phải là một chuyên gia như tôi đã nói: Tôi chỉ đưa ra một số thông tin về các giải pháp tôi biết về việc khám phá các không gian rộng lớn trong một ứng dụng IA nói chung. Cám ơn bạn đã góp ý.
AkiRoss
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.