Thuật toán để tính toán đường đạn đến mục tiêu tối đa. 2 rico


21

Xin lỗi vì tiêu đề kém nhưng tôi không có cách nào tốt hơn để diễn đạt nó ...

Vì vậy, có trò chơi tuyệt vời này của Nintendo (vâng!) Trên Wii có tên WiiPlay . Có 9 minigame trong đó, và cái yêu thích của tôi được gọi là Tanks! . Đó là về việc tiêu diệt xe tăng COM của kẻ thù mà không khiến bản thân bị phá hủy. Đây là một ảnh chụp màn hình của một cấp độ:

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

Một cách để tiêu diệt xe tăng là bắn đạn. Có xe tăng địch màu xanh lá chanh này bắn ra những viên đạn tốc độ cao bắn ra (chống lại các bức tường và khối) hai lần. Bạn có thể thấy xe tăng của người chơi có thể bị phá hủy ngay lập tức như thế nào nếu nó ở ngay bây giờ, vì bể vôi ở trung tâm có thể bắn một viên đạn đi theo con đường màu xanh lá cây tôi vẽ trên hình ảnh.

Là một lập trình viên nghiệp dư, tôi đã tự hỏi làm thế nào chiếc xe tăng vôi có thể xác định được hướng nào nên bắn vào để đánh bật chiếc xe tăng của người chơi.

Tôi đã nghĩ về nó nhưng không nghĩ ra bất kỳ thuật toán nào có thể. Tôi sẽ giải thích kết luận của tôi trong trường hợp họ truyền cảm hứng cho ai đó. Chỉ để đơn giản trong lời giải thích của tôi, tôi giả sử một bức tườngbất kỳ bề mặt nào mà viên đạn có thể bắn lại . Một hình chữ nhật cô lập của các khối do đó tạo thành bốn bức tường.

Tôi đã kết luận rằng 2 điểm tại đó các viên đạn luôn luôn nằm ở một bên của hình bình hành hoặc trở thành các đỉnh đối diện của hình bình hành. Xe tăng địch bắn và xe tăng người chơi mà nó nhắm không nhất thiết phải là 2 đỉnh còn lại, nhưng chắc chắn nằm trên các đường thẳng tới một trong bốn cạnh của hình bình hành. Dưới đây là một minh họa về 4 cách có thể hình thành một hình bình hành:

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

HOR-VER có nghĩa là viên đạn đầu tiên chạm vào một bức tường nằm ngang, sau đó nó bắn vào một bức tường thẳng đứng.

Và rồi tôi bị mắc kẹt. Tôi nghĩ về việc di chuyển xung quanh một đường nối giữa xe tăng địch và xe tăng người chơi quanh bản đồ để xem liệu nó có tạo thành hình bình hành với bất kỳ hai cú đánh nào với bất kỳ bức tường nào không, nhưng điều này không phải lúc nào cũng hoạt động vì xe tăng địch và xe tăng người chơi không nhất thiết phải trùng với các đỉnh của hình bình hành.

Ngoài ra, tôi không chắc chắn về dòng chảy chung của thuật toán. Thuật toán có bất kỳ cấu trúc nào trong 2 cấu trúc sau đây không, hoặc có thể tôi sai với cả hai cấu trúc này?

  • Tiếp tục tìm ra những con đường có thể và luôn đánh dấu một con đường là tốt nhất (có thể là ngắn nhất, khó hiểu nhất, khó hiểu nhất, hoặc đánh giá kết hợp và có trọng số dựa trên nhiều tiêu chí) và quên đi phần còn lại. Người còn lại sau khi tính toán là người giỏi nhất.
  • Trước tiên, xác định tất cả các bức tường có thể tiếp cận đầu tiên bằng viên đạn (viên đạn không cần phải bắn vào bất kỳ bức tường nào khác để tiếp cận từng bức tường này), sau đó xác định tất cả các phạm vi có thể tiếp cận trên mỗi bức tường này (đôi khi không thể đạt đến điểm xa một bức tường không có ricochet nếu một bức tường khác đứng gần bạn), sau đó một lần nữa xác định tất cả các bức tường có thể tiếp cận với một ricochet, và tất cả các phạm vi có thể tiếp cận trên các bức tường này. Cả 4 quá trình này có thể được thực hiện bằng một cách tương tự như dò tia. Trong mỗi quá trình, nếu xe tăng của người chơi bị trúng bất kỳ tia nào, hãy tìm ra đường đạn theo tia đó.

Theo tôi, thuật toán này rất khó để tìm ra vì:

  • một viên đạn có thể được bắn theo bất kỳ hướng nào; và
  • có vô số điểm trên bất kỳ bức tường nào, như trong toán học, nơi có vô số điểm trên một đường thẳng.

Nhưng mọi người Nintendo đã tạo ra nó, vì vậy ... bất cứ ai có ý tưởng?


Chỉ cần kiểm tra, bạn đang hỏi làm thế nào điều này có thể được thực hiện, chứ không phải làm thế nào Nintendo chọn thực sự làm điều đó, phải không?
Ixrec

@lxrec bạn nói đúng, chỉ quan tâm đến một cách có thể để làm điều đó, không phải cách họ đã làm .
xin chào tất cả

Trò chơi không cần tìm giải pháp. Khi bạn nhấn nút để bắn, trò chơi đã biết vị trí và hướng bạn đang đối mặt thì nó chỉ sử dụng thông tin đó. Nó sẽ lần theo quỹ đạo và nếu nó tìm thấy xe tăng địch trên đường bạn sẽ đánh nó nếu không.
Mandrill

2
Mặc dù có nhiều góc độ khác nhau, nhưng bạn có thể dễ dàng giảm chúng xuống một vài lớp tương đương. Tầm nhìn và Ánh sáng của Nicky Case là một bản demo tuyệt vời về kết xuất bóng giữa các đa giác - đó chính xác là vấn đề của bạn, ngoại trừ việc bạn đang sử dụng đường đạn thay vì tia sáng và tia của bạn có thể bị phản xạ hai lần. Lưu ý rằng sự phản chiếu không quan trọng đối với AI - sự phản chiếu chỉ mở rộng đường ngắm, mặc dù điều này có nghĩa là cùng một đối tượng có thể được nhìn thấy từ nhiều góc độ.
amon

@Mandrill Tôi sợ bạn không hiểu câu hỏi của tôi. Tôi đã hỏi làm thế nào xe tăng địch có thể nghĩ ra một đường đạn bắn vào xe tăng của người chơi.
xin chào tất cả

Câu trả lời:


9

Đưa ra một đường ngắm trực tiếp, vấn đề rõ ràng là tầm thường. Tuy nhiên, chúng tôi đang đối phó với sự phản ánh. Việc tìm ra chính xác phần nào của cảnh có thể được nhìn thấy là một thách thức khi thực hiện phản xạ như là một phần của thiết bị dò tia, vì điều này có thể bỏ lỡ một số lỗ mở. Một tìm kiếm nhị phân của người Hồi giáo giữa hai góc độ hứa hẹn cũng không khả thi: do các phản xạ, không gian thực sự nhìn thấy không liên tục, do đó, heuristic nếu nó ở bên phải của A và bên trái của B, phải có một mục tiêu giải pháp giữa A và Bv không được cho phép và sẽ bỏ lỡ các giải pháp sáng tạo của ED. Thay vào đó, tôi khuyên bạn nên thực hiện phản xạ bằng cách chạy lại bộ theo dõi từ vị trí ảo - vị trí mà xe tăng bắn của chúng ta dường như được nhìn thấy trong gương:

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

Ưu điểm là tia nhân đôi giờ là một đường thẳng bắt nguồn từ vị trí ảo. Tôi đã cố gắng minh họa kỹ thuật trong bản phác thảo sau:

chụp quanh các góc

X đánh dấu vị trí bắn, (X) mục tiêu. Các khu vực màu có thể nhìn thấy.

  1. Đường ngắm trực tiếp: mục tiêu không nhìn thấy được. Tuy nhiên, chúng ta có thể đánh các bề mặt (1) và (2).

  2. Một phản xạ. Có hai vị trí bắn ảo trong các chướng ngại vật. Vị trí thấp hơn có LOS trực tiếp đến mục tiêu, vì vậy chúng tôi có giải pháp bắn đầu tiên của chúng tôi: đường đạn là một phần của tia giữa mục tiêu và bề mặt gương thấp hơn, và giữa điểm va chạm gương tia ray và vị trí bắn thật.

  3. Hai phản xạ: Vị trí ảo phía trên từ phản xạ đầu tiên có thể thấy một phần của chướng ngại vật phía dưới thông qua bề mặt gương của nó. Vì hai phản xạ được cho phép, chúng ta có thể phản chiếu vị trí này vào chướng ngại vật phía dưới. Các vị trí được đánh dấu là (I) vị trí thực, (II) vị trí ảo từ phản xạ đầu tiên và (III) vị trí ảo từ phản xạ thứ hai.

    Từ (III), chúng tôi có LOS trực tiếp đến mục tiêu (X), vì vậy chúng tôi đã tìm thấy một giải pháp bắn khác. Đường đạn nằm dọc theo đường X, III cho đến điểm va chạm gương thứ hai, sau đó dọc theo đường III III II giữa các điểm va chạm gương, và cuối cùng dọc theo đường II II I từ điểm va chạm gương thứ nhất đến vị trí thực I.

    Trên thực tế, vị trí ảo thấp hơn từ phản xạ đầu tiên cũng có thể được phản ánh vào chướng ngại vật phía trên, nhưng điều này sẽ không dẫn đến bất kỳ giải pháp trực tiếp nào.

Khi bạn có thể tìm ra phần nào của chướng ngại vật có thể nhìn thấy (và do đó có thể được sử dụng để phản xạ viên đạn), việc thực hiện phản chiếu thông qua tìm kiếm theo chiều sâu có vẻ đơn giản. Để tìm bề mặt gương phù hợp, có thể sử dụng các kỹ thuật được nêu trong Tầm nhìn & Ánh sáng của Nicky Case : thay vì thử các vectơ 360 - có thể bỏ lỡ các lỗ hở và cũng rất lãng phí - chúng tôi chỉ phóng tia tới các cạnh của chướng ngại vật.


Tôi không hiểu cách "phóng tia tới các cạnh của chướng ngại vật" hoạt động. Bạn có nghĩa là bắt đầu phóng tia tới cuối bức tường, và dần dần vào bên trong cho đến khi chúng tôi tìm ra giải pháp? Nếu vậy, tôi hiểu rằng với quy tắc này, giải pháp có thể được tìm thấy nhanh hơn.
xin chào tất cả các bạn

Sau khi xem xét, tôi nghĩ rằng đây là câu trả lời tốt nhất bởi vì rõ ràng, với câu trả lời toán học mà tôi đã đánh dấu là tốt nhất trước đây, không thể trực tiếp xử lý các giải pháp một lần nảy và không bị trả lại.
xin chào tất cả các

Thật là tuyệt vời! Bạn có lời khuyên nào về cách tạo ra một đại diện nhân đôi cho trình độ của bạn mà không quá đòi hỏi về trò chơi của bạn không?
retrovius

7

Chỉ cần mở rộng ý tưởng Karl Bielefeldt cho 2 bức tường phản chiếu:nhập mô tả hình ảnh ở đây

A và B được đưa ra (các xe tăng). Trước tiên, bạn phải liệt kê tất cả các bức tường mà A có thể nhìn thấy và một danh sách tất cả các bức tường B có thể nhìn thấy. Sau đó, bạn tạo các cặp trong đó bức tường đầu tiên nằm trong danh sách nắm tay và bức tường thứ hai khác với bức tường thứ nhất và nằm trong danh sách thứ hai. Bạn cần thực hiện bài kiểm tra này cho tất cả các cặp tường có thể (trừ khi bạn tìm cách loại bỏ các ứng cử viên). Khi bạn tìm thấy R và S cho một cặp tường nhất định, bạn kiểm tra

1) nếu A có tầm nhìn trực tiếp về R

2) nếu R thuộc về wall1 (tường chỉ là một đoạn, không có toàn bộ dòng)

3) nếu R có quyền truy cập trực tiếp vào S

4) nếu S thuộc wall2 (tường chỉ là một đoạn, không có toàn bộ dòng)

5) nếu S có quyền truy cập trực tiếp vào B.

Để tìm R và S : Vì bạn biết wall1, bạn có thể xác định phương trình đường tiếp tuyến với wall1, vì R thuộc đường tiếp tuyến của tường 1, bạn có mối quan hệ giữa 2 tọa độ của R (kết thúc với một bậc tự do cho R) Tương tự như S (bạn có mối quan hệ giữa các tọa độ S vì điểm này thuộc về tanget dòng với wall2). Vì vậy, bây giờ bạn có 2 bậc tự do và bạn phải có thêm 2 phương trình độc lập để xác định một giải pháp. Một phương trình là:

(AA')/(RA')=(SS')/(RS')

phương trình khác là:

(BB')/(SB')=(RR')/(SR')

lưu ý rằng trong các phương trình trên A, A ', B, B' đều biết hoặc có thể được tính trực tiếp. R 'và S' là hàm của tọa độ của R và S và các phương trình tường. Tôi đã không hoàn thành bài toán nên tôi không biết các phương trình sẽ như thế nào.


Đây là một cách tiếp cận toán học tuyệt vời. Nhưng thuật toán đòi hỏi rất nhiều thời gian tính toán để giải các phương trình đồng thời, tôi đoán vậy? Có rất nhiều căn bậc hai và lũy thừa liên quan đến khoảng cách.
xin chào tất cả các bạn

3

Bạn có thể tận dụng thực tế là góc rời khỏi ricochet phải giống với góc đi vào nó. Đối với một bức tường ngang nhất định có tọa độ y cvà hai bể cố định có tọa độ (a,b)(d,e), chỉ có một góc thỏa mãn phương trình dưới đây.

sơ đồ phương trình

Chỉ cần giải quyết xđể có được khoảng cách dọc theo bức tường mà bạn phải nhắm tới. Hai bức tường hoạt động như nhau. Bạn chỉ có hai phương trình và hai ẩn số.


1

Bạn có sơ đồ gọn gàng chỉ ra cách chiếu tia trực tiếp, vì vậy tôi sẽ để lại chi tiết về cách xác định một cặp bề mặt phản chiếu.

Hãy gọi bề mặt phải được nhấn bề mặt đầu tiên Một , và thứ hai, B .

Cố gắng để đạt các cạnh (visible) của B bằng cách bắn vào một . Nói cách khác, xác định các điểm mà người ta sẽ thấy sự phản chiếu của các đầu B nếu nhìn vào gương A đã hoàn thành . Điều này phải dễ thực hiện, bạn chỉ có một điểm phản ánh để xử lý.

Bây giờ bạn biết hai tia đó nhấn các cạnh (visible) của B . Hãy gọi chúng là các tia cạnh Tính toán phản xạ của chúng ra B; họ phải đi đâu đó qua mục tiêu của bạn. Bạn có thể xác định liệu mục tiêu nằm giữa chúng, nghĩa là ở bên trái của một tia nhưng ở bên phải của tia kia hay ngược lại. Điều này là không quan trọng để làm bằng cách sử dụng phương trình tổng quát của đường thẳng .

Nếu mục tiêu không nằm giữa các tia cạnh, rõ ràng bạn không thể đánh nó với bất kỳ tia trung gian nào; chọn một cặp bề mặt khác

Nếu mục tiêu nằm giữa các tia, hãy tìm kiếm tia đánh trung gian bằng cách sử dụng tìm kiếm nhị phân. Bạn có hai góc bắn tương ứng với các tia sáng, góc đánh của bạn nằm giữa chúng. Với điều kiện là đường kính góc của mục tiêu của bạn, nhìn từ điểm bắn, không quá nhỏ, bạn sẽ cần vài lần lặp cho đến khi bạn tìm thấy hướng của tia bắn.

Đây là một hình ảnh:

tia

Ở đây hai tia cạnh được thể hiện bằng màu đỏ và màu xanh. Rõ ràng bạn có thể tìm thấy một tia phát ra ở một góc nhỏ hơn góc đỏ nhưng lớn hơn tia đỏ để tia đó sẽ bắn trúng mục tiêu màu xanh lá cây.


Không, không nhất thiết! Hãy suy nghĩ về sơ đồ của bạn nếu có một chướng ngại vật thêm nằm ở bất cứ đâu ngay giữa các đường đạn màu đỏ và màu xanh. Nếu bạn bắn một viên đạn vào một góc ngay giữa các góc đỏ và xanh lam, bạn có thể bị trúng đạn gần hơn với xe tăng người chơi, nhưng bạn cũng có thể bỏ lỡ hoàn toàn vì một số viên đạn có thể bắn ra một chướng ngại vật ngẫu nhiên nằm ở giữa. Vui lòng xem câu trả lời của @ amon nơi anh ấy thảo luận về khả năng này.
xin chào tất cả các bạn

Trả lời @ câu trả lời của amon; Tôi thích ý tưởng phản chiếu đường thẳng. Ngoài ra tôi cho rằng thuật toán nên kiểm tra xem đường dẫn thực sự có thể vượt qua được không sau khi tìm thấy nó theo cách đơn giản hóa này. Điều thú vị hơn nữa là khả năng mục tiêu chỉ bị che khuất một phần (thậm chí có thể tách thành hai vùng có thể nhìn thấy). Phương pháp của Amon dễ sửa đổi hơn.
9000

-3

Trước hết, hãy nhớ trong lớp vật lý khi bạn nói về khúc xạ ánh sáng? Vâng, vấn đề của bạn có thể được giải quyết bằng cách sử dụng các nguyên tắc đó. Góc tới bằng góc phản xạ. vì vậy xe tăng địch cần chạy qua mọi góc độ có thể cho lần nảy đầu tiên để lần nảy thứ hai có thể đánh vào người chơi. Tiếp tục đi với ý tưởng truy tìm tia quá. Bây giờ, điều này trở nên phức tạp khi người chơi di chuyển nhưng nó sẽ là một ý tưởng đủ tốt để bạn bắt đầu với một thuật toán


1
Tôi hiểu các nguyên tắc của sự phản ánh. Bạn có thể thấy câu trả lời của tôi cho bình luận của @ amon. Bạn có quyền rằng chuyển động của người chơi phải được xem xét, nhưng tôi nghĩ rằng nó có thể được coi là một tiêu chí để chọn một tối ưu trong số nhiều đường có thể dựa trên đánh giá. Tuy nhiên, điều này có thể bị bỏ qua vì điều này tương quan với khoảng cách của đường đạn, tức là đường đi càng dài, người chơi càng có thể di chuyển trước khi viên đạn đến đích.
xin chào tất cả
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.