Tìm đường với nhiều đường dẫn ngẫu nhiên trong trò chơi Tower Defense


8

Tôi nghĩ về việc tìm đường ngẫu nhiên cho trò chơi Tower Defense của tôi. A * sẽ không hoạt động cho các con của tôi, bởi vì tôi đặc biệt cần tìm đường ngẫu nhiên .

Hãy tưởng tượng một bản đồ với các tuyến đường, điểm bắt đầu và điểm đến. Tôi có nhiều tuyến đường, tất cả đều dẫn từ điểm bắt đầu đến đích, bằng cách này hay cách khác. Nó có thể trông như thế này:


Hai đường nhánh có hình vuông

Mô tả màu: đỏ - điểm bắt đầu; đen - đích đến; màu xám - tuyến đường; trắng - không gian trống
(Các số được sử dụng trong văn bản làm tham chiếu đến một số ô)


Đầu tiên tôi nghĩ về việc chỉ tính toán điểm tiếp theo một cách ngẫu nhiên, khi một thực thể vượt qua một ô. Nhưng điều đó sẽ không làm việc. Khi một thực thể vượt qua ô 1, nó có thể tăng hoặc giảm. Khi lên 2, nó có thể đi xuống / lên (liên quan đến vị trí của nó) hoặc bên phải.
Nếu nó đi xuống / lên, nó sẽ chuyển sang ô 1, điều đó có nghĩa là nó đi lùi. Xấu...

Tôi thực sự muốn làm cho nó năng động , nhưng tôi có thể hiểu được những gì tôi có thể làm bây giờ. Bất cứ ai có ý tưởng hoặc kinh nghiệm trong việc này?


Hầu hết các trò chơi phòng thủ tháp tôi nhận thấy là làm cho mọi thứ thu thập được con đường ngắn nhất đến lối ra và chặn bất kỳ di chuyển nào sẽ vô hiệu hóa khi thoát ra ... Phần khó ở đây sẽ là đảm bảo tính toán lại các đường dẫn khi người chơi thay đổi bố cục tháp
James

@James: Bạn có nghĩa là đi theo con đường ngắn nhất, đó là A *, hoặc bạn có nghĩa là bò qua các điểm tham chiếu để có được hướng dẫn hợp lệ cho mỗi ô. Tôi cũng không cần tính toán lại đường dẫn vì cách của tôi đã được sửa và người chơi không thể đặt tháp ở đó. Nhưng nói chung bạn đúng.
Marco

Câu trả lời:


4

Thay vì có tất cả các ô vuông liền kề có thể theo các điểm tiếp theo có thể, chỉ bao gồm các ô vuông không dẫn trở lại từ đầu và chọn ngẫu nhiên từ các ô đó. Nếu bạn đã làm điều này, nó sẽ không thể quay trở lại bởi vì quay trở lại không phải là một lựa chọn.

Đây là một vấn đề đồ thị có hướng với mỗi điểm tham chiếu là một đỉnh và mỗi đường dẫn một cạnh. Bạn chỉ cần giới hạn số lượng chu kỳ, có thể loại bỏ chúng hoàn toàn.


Đó là suy nghĩ thứ hai của tôi. Tôi phải suy nghĩ về việc thực hiện "cách dẫn trở lại bây giờ". Giới hạn số lượng gạch để vượt qua sẽ không năng động và linh hoạt.
Marco

Bạn có thể giải quyết điều này bằng cách xây dựng một biểu đồ có hướng và theo dõi các ô được truy cập / không mong muốn. Sau đó, chỉ cần chắc chắn rằng bạn tìm kiếm gạch không mong muốn mà thôi. Điều đó sẽ xây dựng cho bạn một biểu đồ đại diện cho các đường dẫn của bạn. Bây giờ nếu bạn nhấn vào một ô trong đó một ghi chú có một số cạnh đi (trong biểu đồ đã được tạo trước đó), chỉ cần chọn ngẫu nhiên một ô.
bummzack

Tôi có nghĩa là để viết "nút" không "ghi chú" trong bình luận trước đây của tôi. Lấy làm tiếc.
bummzack

@bummzack: Không, nó sẽ không hoạt động. Hãy tưởng tượng một bản đồ với 3 đường dẫn. Nếu tôi tìm kiếm các nút không mong muốn, tôi cũng có thể chỉ cần bắt đầu. Tôi nghĩ về việc thực hiện một thuật toán thu thập thông qua bản đồ và chọn ngẫu nhiên giữa các hướng. Khi nó nhận ra rằng nó trở lại từ đầu, phần này không thể sử dụng được. Tôi có thể làm điều này với một quầy. Khi khoảng cách đến điểm bắt đầu nhỏ hơn, nó sẽ quay trở lại. Điều này sẽ được phân tích cú pháp một lần khi tạo bản đồ trong quá trình phát triển, do đó không có vấn đề về hiệu suất.
Marco

@Marco Tại sao nó không hoạt động? Nếu bạn triển khai tìm kiếm đầu tiên theo chiều rộng từ nút bắt đầu, bạn sẽ không truy cập lại các nút trước đó. Bạn sẽ không bao giờ trở lại từ đầu, bởi vì nó giống như một trận lũ.
bummzack

7

Bạn nói ngẫu nhiên, nhưng bạn muốn bao nhiêu ngẫu nhiên? Có ổn không nếu kẻ thù chọn một con đường dài gấp 10 lần con đường ngắn nhất? Có ổn không nếu kẻ thù bước vào ngõ cụt và phải quay lại? Đó là, ngẫu nhiên trên tập hợp các đường dẫn và phân phối xác suất nào?

Giả sử bạn muốn kẻ thù thích những con đường ngắn, bạn có thể sử dụng A *, nhưng thay đổi ngẫu nhiên các trọng số cạnh được cung cấp cho nó. Sau đó, kẻ thù sẽ luôn chọn một đường dẫn ngẫu nhiên truy cập vào mỗi nút nhiều nhất một lần, với xu hướng về các đường dẫn ngắn hơn. Cụ thể, nếu không có ngẫu nhiên sẽ có một số đường dẫn có cùng độ dài, mỗi đường dẫn này sẽ được chọn với xác suất bằng nhau.

Ngoài ra, trong A *, bạn có thể lặp lại hàng xóm theo thứ tự ngẫu nhiên. Trong eaxmple của bạn, khi tìm đường dẫn đến nút 1, nó sẽ ngẫu nhiên chinh phục đỉnh của hàng xóm dưới cùng trước tiên, làm cho đường dẫn trên cùng hoặc dưới cùng được xem xét đầu tiên. Giải pháp này sẽ khiến kẻ thù chọn trong số tất cả các con đường ngắn nhất một cách ngẫu nhiên. Trong ví dụ đơn giản của bạn, cả hai đường dẫn ngắn nhất đều có thể xảy ra như nhau, nhưng trong tình huống như:

start -+--------+
       |        |
       +--------+
       |        |
       +--------+- end

đường dẫn trên cùng sẽ được chọn ở xác suất 1/2, trong khi đường dẫn dưới cùng sẽ được chọn ở xác suất 1/4 mỗi đường.


Tôi không chắc chắn chính xác OP có nghĩa là gì khi "tìm đường ngẫu nhiên" nhưng giải pháp của bạn để chọn ngẫu nhiên trong số tất cả các đường ngắn nhất là điều tôi cho là anh ta muốn nói, và "cách khác của bạn" là một giải pháp tuyệt vời cho vấn đề đó.
jhocking

0

Chỉ là một bằng chứng về khái niệm:

  1. Chọn một hướng ngẫu nhiên.
  2. Nếu điều này sẽ khiến chúng ta phải đi đâu đó, chúng ta đã chọn một hướng khác.
  3. Nếu chúng ta đã hết chỉ đường, hãy quay lại quảng trường cuối cùng với hướng chưa được khám phá.
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.