Làm thế nào để thực hiện một kẻ thù thông minh trong một vụ nổ súng?


13

Hãy tưởng tượng một trò bắn súng rất đơn giản, một điều mà tất cả chúng ta đều biết:

bắn 1

Bạn là người chơi (màu xanh lá cây). Chuyển động của bạn bị giới hạn trong Xtrục. Kẻ thù của chúng ta (hoặc kẻ thù) ở trên cùng của màn hình, chuyển động của anh ta cũng bị hạn chế theo Xtrục. Người chơi bắn đạn (màu vàng) vào kẻ thù.

Tôi muốn triển khai AI cho kẻ thù thực sự giỏi trong việc tránh đạn của người chơi. Ý tưởng đầu tiên của tôi là chia màn hình thành các phần riêng biệt và gán trọng lượng cho chúng:

bắn trọng lượng

Có hai trọng lượng: "Trọng lượng viên đạn" (màu xám) là mối nguy hiểm do viên đạn gây ra. Đạn càng gần kẻ thù, "trọng lượng đạn" càng cao ( 0..1trong đó 1 là nguy hiểm cao nhất). Làn đường không có viên đạn có trọng lượng 0. Trọng lượng thứ hai là "trọng lượng khoảng cách" (màu xanh lá cây vôi). Đối với mỗi làn đường tôi thêm 0.2chi phí di chuyển (giá trị này hiện tại tùy ý và có thể được điều chỉnh).

Sau đó, tôi chỉ cần thêm trọng lượng (màu trắng) và đi đến làn đường có trọng lượng thấp nhất (màu đỏ). Nhưng cách tiếp cận này có một lỗ hổng rõ ràng, bởi vì nó có thể dễ dàng bỏ lỡ cực tiểu cục bộ vì vị trí tối ưu để đi sẽ chỉ đơn giản là giữa hai viên đạn đến (như được biểu thị bằng mũi tên trắng).

Vì vậy, đây là những gì tôi đang tìm kiếm:

hủy diệt hoàn toàn

  • Nên tìm cách vượt qua cơn bão đạn, ngay cả khi không có nơi nào không áp đặt mối đe dọa của viên đạn.
  • Kẻ thù có thể tránh đạn một cách đáng tin cậy bằng cách chọn một giải pháp tối ưu (hoặc gần như tối ưu).
  • Thuật toán sẽ có thể tính đến tốc độ di chuyển của viên đạn (vì chúng có thể di chuyển với các vận tốc khác nhau).
  • Các cách điều chỉnh thuật toán sao cho có thể áp dụng các mức độ khó khác nhau (câm cho kẻ thù siêu thông minh).
  • Thuật toán sẽ cho phép các mục tiêu khác nhau, vì kẻ thù không chỉ muốn tránh đạn, anh ta cũng có thể bắn người chơi. Điều đó có nghĩa là các vị trí mà kẻ thù có thể bắn vào người chơi nên được ưu tiên khi né đạn.

Vì vậy, làm thế nào bạn sẽ giải quyết điều này? Trái ngược với các game khác thuộc thể loại này, tôi chỉ muốn có một vài kẻ thù nhưng rất "lành nghề" thay vì hàng loạt kẻ thù câm.


2
Bạn đã xem xét sử dụng một cái gì đó như hành vi lái? Có một cách để tránh chướng ngại vật cụ thể: red3d.com/cwr/steer/Obstacle.html
Tetrad

@Tetrad Tôi đã nghĩ về các hành vi lái .. cũng bởi vì chúng có thể được chuyển đổi độc đáo, như "cố gắng bắn người chơi" và khi nguy hiểm đang ở phía trước chuyển sang "trốn tránh". Tôi sợ rằng phiên bản trốn tránh 1D (về cơ bản là tôi đang xử lý) sẽ quá ngu ngốc để đưa ra quyết định tốt. Tôi có thể sai mặc dù.
bummzack

Câu trả lời:


8

Tôi nghĩ ý tưởng cơ bản của bạn là âm thanh, nhưng nó không phải là tương tự. Bạn cần một trường giá trị tương tự chạy trên màn hình. Vì vậy, gradient khuếch tán 1D, từ đó bạn có thể lấy được một giá trị tại một điểm chính xác trên đường thẳng đó, một cách nhanh chóng. Độ dốc khuếch tán rẻ và có thể được sử dụng bởi nhiều kẻ thù cùng một lúc, vì chúng mô tả môi trường chứ không phải quan điểm của thực thể về nó (hơi giống với ánh sáng phóng xạ) - có lẽ là lý do tại sao bạn chọn cách tiếp cận trong câu hỏi của mình . Độ dốc này phải tương đối trơn tru, để gợi lên chuyển động hữu cơ từ kẻ thù, và rõ ràng là cập nhật như trò chơi của bạn. Có lẽ di chuyển trung bình ?

Độ dốc nên kết hợp:

  • Gần
  • Vận tốc
  • Bề rộng của viên đạn
  • (tùy chọn) Vị trí của mục tiêu (người chơi)

Để né tránh, chúng ta phải có khả năng tìm ra giải pháp chính xác mỗi khi có giải pháp . Đó là trường hợp bất cứ khi nào có một khoảng cách đủ nhỏ để kẻ thù có thể lách qua. Đó là, bạn chỉ có thể làm những gì bạn có thể làm, vì vậy cách tiếp cận gradient sẽ hoạt động không tệ hơn bất kỳ cách tiếp cận nào khác theo nghĩa này, tôi nói.

Độ dốc khuếch tán sẽ đẩy kẻ thù về phía tối ưu cục bộ (là các đỉnh trong biểu đồ) mà ít bắt buộc phải di chuyển, chúng ta càng ở gần mức tối thiểu cục bộ, do đó hiệu ứng trả về giảm dần khi né tránh. Điều này mở ra cơ hội cho việc ra quyết định thông minh hơn khi đối phương có một cơ hội tốt để khai hỏa.

Nếu nhu cầu bắn lớn hơn nhu cầu di chuyển, thì hãy làm như vậy; mã của bạn cũng có thể xác định điều này bằng cách chúng khác nhau bao nhiêu . Bạn có thể thực hiện điều này như một phần của biểu đồ cơ sở, trong trường hợp đó, vị trí người chơi sẽ giảm các giá trị xung quanh trong biểu đồ (giả sử kẻ thù bị hút về điểm thấp nhất), kết hợp tất cả việc ra quyết định thành một biểu đồ hoặc bạn có thể giữ " mong muốn bắn "biểu đồ tách biệt với biểu đồ" mong muốn né tránh "chính, điều này sẽ cung cấp cho bạn quyền kiểm soát trực tiếp hơn.

IRL, tôi sẽ không bận tâm đến việc né một viên đạn cho đến khi nó ở một khoảng cách mà tôi biết, ở tốc độ né tránh hàng đầu của tôi, bắt đầu trở nên khó tránh. Kinh nghiệm đầu tay từ ném đá như một chàng trai. Một viên đạn ở khoảng cách x di chuyển với vận tốc y có cùng mức độ nguy hiểm như một viên đạn ở khoảng cách gấp 2 lần khi đi được 2y. Vì vậy, điều này cần phải được xác nhận một cách chính xác.

Các cách để điều chỉnh thuật toán cho khó khăn của kẻ thù bao gồm

  • giới thiệu độ trễ về các bản cập nhật cho biểu đồ (Sinh ra quá chậm)
  • giới thiệu ngẫu nhiên, không chính xác cục bộ vào biểu đồ
  • chỉ đơn giản là không có kẻ thù tuân theo những gì đồ thị nói với họ, qua một chuỗi các bản cập nhật (nói từ 1 đến 10 khung hình) do sự lười biếng AI tuyệt đối.

Một lần nữa, bạn có thể triển khai tất cả các yếu tố thành một biểu đồ (ít kiểm soát hơn và ít hữu ích hơn cho nhiều kẻ thù) hoặc vào một số biểu đồ mà bạn nhìn vào để có kết quả (nhiều mô đun hơn, có thể hoạt động tốt hơn cho nhiều kẻ thù). Thật khó để cụ thể hơn, vì có rất nhiều hướng bạn có thể thực hiện phương pháp này.


1
Nick thân mến. Tôi đã đi trước một phiên bản thử nghiệm nhỏ về hành vi đó trong flash và kết quả rất hài lòng (đạn được sinh ra ngẫu nhiên). Tôi hiện đang sử dụng 3 độ dốc, một cho mối đe dọa, chi phí di chuyển và một độ tĩnh cho các cạnh (để các cạnh của màn hình ít được mong muốn hơn). Chúng được hiển thị trong ứng dụng flash. Tôi cảm thấy rằng với một số điều chỉnh, tôi có thể đạt được kết quả rất tốt và cũng là yếu tố trong các trọng lượng khác như vị trí chụp. Cảm ơn rất nhiều bạn đời.
bummzack

1
Xin chào @bummzack, đó là một người bạn vui, đó là một bản demo nhỏ thú vị! Quan điểm của bạn về vấn đề này rất mới đối với tôi và có vẻ thú vị - Tôi rất vui khi thấy nó hoạt động! Vui mừng được giúp đỡ với nó, và cảm ơn vì đã chia sẻ.
Kỹ sư

7

Điều này có thể được xem như là một vấn đề đường dẫn. Thay vì suy nghĩ làm thế nào baddy tránh được đạn, hình ảnh những viên đạn là tĩnh và baddy phải đi qua chúng đến cuối màn hình.

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E = kẻ thù
B = đạn
P = người chơi
* = tùy chọn đường dẫn đến cuối màn hình

Một khi baddy đã vạch ra một con đường thành công, nó chỉ cần thực hiện bước tiếp theo mỗi lần. Có lẽ đã có một số thuật toán tốt xung quanh để tìm đường dẫn như thế này. Nếu baddy di chuyển với cùng tốc độ với viên đạn thì thuật toán ví dụ có thể là;

Bắt đầu tại baddy và đánh dấu các vị trí an toàn trong các khoảng trống ở bên dưới bên trái, ngay bên dưới và bên dưới bên phải. Sau đó xem xét từng không gian an toàn bạn vừa tạo và lặp lại. Nếu bất cứ lúc nào bạn thấy không có không gian an toàn bên dưới thì hãy đánh dấu không gian là không an toàn và quay lại.


1
Cách tiếp cận thú vị. Tôi sợ rằng điều này khá tốn kém mặc dù môi trường thay đổi quá nhanh và thật khó để sử dụng các thuật toán tìm đường phổ biến vì chúng hoạt động tốt nhất với các "bản đồ" rời rạc.
bummzack

Không nên quá đắt, đừng quên rằng bạn chỉ phải tính hàng dưới cùng mỗi lượt, bạn không phải tính toán lại toàn bộ.
Qwerky

@bummzack Môi trường không "nhanh", ít nhất là về mặt máy tính. Đối với nhà phát triển trò chơi, bạn nên hiểu rằng, hầu như mọi trò chơi đều dựa trên bước, nó chỉ là về kích thước của bước đó. Nhưng, ở mỗi bước, các tính toán có thể được thực hiện, do đó, Qwerky soltuion là thứ bạn cần.
Deele

Thật ra, tôi đồng ý với @bummzack. Mặc dù cách tiếp cận này là vững chắc về mặt logic, nó sẽ đắt hơn cách tiếp cận 1D được đề xuất trong câu hỏi. Có thể tối ưu hóa sớm, nhưng tôi thấy cách tiếp cận đó thanh lịch hơn nhiều. Xem câu trả lời của tôi cho một chi tiết về điều đó.
Kỹ sư

2
Đây có lẽ là câu trả lời thích hợp , nhưng không chính xác là một câu trả lời thực tế . Trong thời gian kẻ địch phải tìm ra một con đường, trường có thể có một loạt đạn khác làm mất hiệu lực đường dẫn hoàn toàn, nghĩa là tính toán lại đường dẫn sẽ là điều bắt buộc. Và tính toán lại là một con chó cái . Hơn nữa, ý tưởng của bạn về backpropagating đến một điểm mà nó an toàn làm cho nó thậm chí còn đắt hơn! @Nick Wiggill Tôi không nghĩ đó là tối ưu hóa sớm, chỉ là tầm nhìn xa để đảm bảo bạn không tự đá mình vào háng.
Ray Dey
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.