Trợ giúp với trò chơi AI chiến lược


8

Tôi đang phát triển một trò chơi chiến lược AI (nghĩ: Final Fantasy Tactics), và tôi gặp khó khăn trong việc thiết kế AI. Vấn đề chính của tôi là xác định đó là điều tối ưu để làm.

Trước tiên, hãy để tôi mô tả mức độ ưu tiên của hành động mà tôi muốn AI thực hiện:

  1. Giết đơn vị người chơi gần nhất

  2. Hoàn thành chỉ thị chính (tiêu diệt tất cả các đơn vị người chơi, tiêu diệt đơn vị mục tiêu, sống sót trong x lượt)

  3. Chữa lành vết thương đơn vị / bộ đệm đúc

Bây giờ AI có thể thực hiện các thao tác sau:

  • Di chuyển -> {Tấn công / Khả năng / Vật phẩm} (tấn công hoặc khả năng hoặc vật phẩm)

  • {Tấn công / Khả năng / Vật phẩm} -> Di chuyển

  • Tiến lại gần (nếu mục tiêu không nằm trong phạm vi)

  • {Tấn công / Khả năng / Vật phẩm} (nếu không di chuyển)

Ghi chú

Khả năng có phạm vi / hiệu ứng / chi phí / hiệu ứng khác nhau. Mỗi đơn vị ai có thể có 5-10 khả năng để lựa chọn. AI sẽ ưu tiên tiêu diệt an toàn trừ khi chỉ thị của nó là tồn tại trong vòng x. Nó cũng không quan tâm đến khả năng chi phí nhiều. Mặc dù người chơi có thể muốn lưu một câu thần chú lớn cho lần sau, AI rất có thể sẽ sử dụng nó càng sớm càng tốt.

Di chuyển trên một lưới (hex)

số đơn vị người chơi: 3-6

num đơn vị ai: 3-7 trở lên. Có lẽ là tối đa 10.

AI và người chơi thay phiên nhau điều khiển MỘT đơn vị, thay vì tất cả cùng một lúc.

Nền tảng là Android (nếu chương trình không phản hồi sau một thời gian, sẽ có một cửa sổ bật lên nói với Force Quit hoặc Wait - trông rất tệ!).

Bây giờ đến câu hỏi:

  • Khả năng tốt nhất để sử dụng rõ ràng sẽ là thứ tấn công nhiều mục tiêu nhất để có nhiều sát thương nhất. Nhưng vì mỗi khả năng có phạm vi khác nhau, tôi sẽ không biết liệu chúng có trong phạm vi mà không khám phá từng địa điểm có thể mà tôi có thể di chuyển đến không.

  • Một giải pháp sẽ là đi qua từng địa điểm có thể để di chuyển đến, xác định cuộc tấn công tối ưu tại địa điểm đó - nơi cung cấp cho tôi danh sách các bước di chuyển tối ưu cho từng địa điểm. Sau đó, chọn các ra tối ưu của danh sách và thực hiện nó. Nhưng điều này sẽ tốn rất nhiều thời gian của CPU. Có một giải pháp tốt hơn?

  • Ý tưởng hiện tại của tôi là di chuyển càng gần càng tốt về phía nhóm người gần nhất, lớn nhất và xác định khả năng tấn công / khả năng tối ưu từ đó. Tôi nghĩ rằng điều này sẽ làm việc ít hơn cho CPU và vẫn cho phép các cuộc tấn công trên phạm vi rộng. Nó không tối ưu nhưng AI vẫn có vẻ 'thông minh'.

Ghi chú / câu hỏi khác:

  • Tôi có suy nghĩ quá mức / quá phức tạp không? Giải pháp tốt hơn? Tôi mở tất cả các loại đề xuất
  • Tôi đã xem xét câu hỏi về phép thuật , nhưng nó không tính đến chuyển động - vì vậy có lẽ nên sử dụng thuật toán đó cho từng vị trí di chuyển có thể? Câu trả lời hàng đầu đề cập rằng nó không tuyệt vời cho hiệu ứng khu vực và chiến đấu theo nhóm - vì vậy có lẽ cần phải điều chỉnh nhiều hơn?
  • Xin vui lòng , nếu bạn đề cập đến một biểu đồ / cây, hãy cho tôi biết về cơ bản cách sử dụng nó. Ví dụ: Node có nghĩa là khả năng, cấp độ tương ứng với thiệt hại, sau đó tìm kiếm nút sâu nhất.

Câu trả lời:


8

Có rất nhiều ứng dụng mà bạn có thể sử dụng cho loại AI này. Cá nhân, một trong những kỹ thuật rõ ràng nhất bạn có thể sử dụng là chức năng đánh giá vị trí. Killzone đã sử dụng kỹ thuật này và nó được mô tả trong bài báo sau:

http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

Trên thực tế, bạn có thể có thể sử dụng rất nhiều giấy đó vì nó mô tả đại diện thế giới, dòng dữ liệu quan sát, bảng tra cứu, v.v. và về cơ bản bạn đã có một biểu đồ với lưới hex của mình (bạn chỉ cần thêm các nút lân cận trong trường hợp này sẽ là các hình lục giác lân cận thành một hình lục giác đơn).

Một điều nữa để xem xét (điều đó khá ấn tượng vào lúc này, nhưng cao cấp hơn một chút) là các nhà quy hoạch. Tôi chưa đọc nhiều về Mạng nhiệm vụ phân cấp, tôi sẽ để lại cho bạn. Một kế hoạch có thể giúp là GOAP (Lập kế hoạch hành động theo mục tiêu)

Liên kết này có nhiều thông tin liên quan đến GOAP: http://web.media.mit.edu/~jorkin/goap.html

Một cái gì đó mà tôi vừa nghĩ đến liên quan đến mục tiêu "Sống sót cho số lượt quay" của bạn là việc sử dụng bản đồ ảnh hưởng. Bản đồ ảnh hưởng chỉ là một đại diện rất đơn giản cho thế giới của bạn, nơi mỗi nút (hình lục giác) có một giá trị duy nhất được liên kết với nó (được gọi là ảnh hưởng).

Ảnh hưởng có thể được tính theo một số cách, nhưng một ví dụ cho trường hợp của bạn có thể là người chơi tạo ra ảnh hưởng +10 trên hình lục giác mà họ được đặt và ảnh hưởng +1 trên hình lục giác được chỉ định là phạm vi tối đa của người chơi.

Vì vậy, ví dụ, nếu bạn có một nhóm người chơi tập hợp lại với nhau, tầm ảnh hưởng xung quanh họ sẽ tương đối cao. Điều này có thể được AI hiểu là mối đe dọa đối với cuộc sống của nó và tránh xa các điểm có ảnh hưởng cao nhất.

Đây chỉ là một vài kỹ thuật mà bạn có thể sử dụng, nhưng có rất nhiều thứ khác. Nếu bạn muốn một cái gì đó đơn giản, hãy sử dụng một cái gì đó như các FSM phân cấp (khá nhiều FSM với mỗi trạng thái chứa một FSM khác với mức độ chi tiết cao hơn). Nếu bạn muốn một cái gì đó phức tạp nhưng có chức năng và thực tế, hãy sử dụng GOAP và bản đồ ảnh hưởng. Thành thật không thành vấn đề vì ĐIỂM CHÍNH là làm cho AI trở nên thú vị và để làm được điều đó, bạn cần phải thực hiện một số "sự ngu ngốc giả tạo". Sẽ không ai muốn chơi một AI thông minh hơn họ vô cùng, bất kể bạn đã bỏ ra bao nhiêu nỗ lực. Tôi không nói điều này nghe có vẻ gay gắt, tôi đang nói điều này bởi vì điều quan trọng là AI mắc sai lầm vì các đối tác của con người họ chắc chắn làm!

Chúc may mắn! :)


1
Cảm ơn các nguồn lực. Tôi đã thấy họ liên kết trong trang web trước đây. Bây giờ tôi sẽ phải đọc nó sâu hơn để xem làm thế nào tôi có thể áp dụng nó vào trò chơi của mình. Tôi nhớ đã đọc ý tưởng bản đồ ảnh hưởng ở đâu đó quanh đây và ý tưởng cơ bản đó là những gì tôi đang sử dụng cho ý tưởng 'hiện tại' của mình.
f20k

5

Trong những năm qua, tôi đã viết 3 trò chơi AI, tất cả đều chơi một trò chơi đáng nể.

Hai trong số các trường hợp có các tùy chọn hạn chế mỗi lượt và vì vậy tôi đã khám phá tất cả các khả năng và đánh giá các vị trí kết quả - Tôi đã thay đổi độ sâu mà tôi đã tìm kiếm dựa trên độ khó và không mất nhiều lớp để tạo ra một đối thủ khá đáng nể. Tôi có thể giảm một vài lớp và vẫn có phản hồi trong một hoặc hai giây và đó là trên một số bộ xử lý khá cổ xưa. (Tất cả những điều này là trước khi Windows có mặt.) Chất lượng phân tích vị trí RẤT quan trọng khi sử dụng phương pháp này.

Trường hợp thứ ba không cho phép phân tích như vậy vì số lần di chuyển có thể mỗi lượt có thể dễ dàng vượt quá các hạt trong vũ trụ. Đó là một tình huống giống như Rủi ro - lãnh thổ có nhiều quân đội trên đó nhưng bạn có thể thực hiện bất kỳ số lần di chuyển nào mỗi lượt, yếu tố chính là di chuyển mất thời gian. Một tỉnh bên cạnh thường mất 1 lượt, một ở phía bên kia của bản đồ có thể mất 9 lượt.

Tôi đã sử dụng một cách tiếp cận hoàn toàn khác nhau ở đây. Tôi đã quyết định phần trăm lực lượng được phân bổ để phòng thủ và phân bổ lực lượng dựa trên giá trị của lãnh thổ và mối đe dọa của kẻ thù ước tính (Trong khi bạn có thể thấy lực lượng nào mà đối thủ của bạn di chuyển, bạn không thể thấy họ đang đi đâu - nó giả định con người sẽ tập trung lực lượng của nó ở một nơi nào đó và hình dung rằng đó rất có thể là nơi tất cả họ có thể đến ngay lập tức thay vì từng miếng.) Bất cứ điều gì không cần thiết cho quốc phòng đều có sẵn cho hành vi phạm tội. Tôi đã xem xét từng mục tiêu có thể và tính toán những gì cần có để có cơ hội nhanh chóng lấy nó (một trận chiến kéo dài sẽ phá hủy cơ bản tất cả sản xuất của nó) và tạo ra một loạt các lệnh tấn công cho nó. Giá trị của đơn hàng là giá trị của tỉnh, chi phí là số lượng quân đội / lượt cam kết cho cuộc tấn công. Chọn giá trị cao nhất và thực hiện các đơn đặt hàng, lặp lại cho đến khi các lực lượng có sẵn không thể lấy bất cứ thứ gì. Thời gian thực hiện là không đáng kể.

Tôi hy vọng tôi đã cho bạn một số ý tưởng ở đây.


1
Hmm, vì vậy những gì tôi có thể hiểu từ đoạn đầu tiên: nếu bạn thực hiện một cây quyết định thực sự chu đáo, bạn có thể tạo ra một người đàng hoàng trong một vài lớp và tăng 'sự thông minh' với chi phí thời gian bằng cách đi xuống một lớp khác (của khó khăn). Tôi nghĩ rằng tôi sẽ thử nó. Ngoài ra, tôi thích ý tưởng của bạn về việc ban hành các lệnh dựa trên giá trị của một vị trí.
f20k

4

Lưu ý của bạn về việc bỏ / chờ gợi ý cho tôi rằng bạn đang thực hiện tất cả các công việc xử lý trên luồng chính của ứng dụng. Bạn có thể, giả sử có đủ hỗ trợ luồng trong SDK của Android (mà tôi cho là phải có), giảm phần "suy nghĩ" của AI của bạn sang luồng công nhân trong khi luồng chính xuất hiện một AI trong trò chơi đang xem xét. .. "Giao diện người dùng nhưng lại hiển thị bình thường.

Tất nhiên có những lý do chính đáng để không muốn làm điều đó, chẳng hạn như không muốn AI mất quá nhiều thời gian vì dù sao người chơi sẽ chán.

Đối với câu hỏi thực tế của bạn, trong khi "ý tưởng hiện tại" của bạn hoàn toàn khả thi, thì nó rất đơn giản. Đó là một điểm khởi đầu tốt, mặc dù. Đó là một hệ thống mà AI hoàn toàn tập trung vào kết quả - cố gắng tối đa hóa một giá trị (thiệt hại). Các tùy chọn khác bao gồm cách tiếp cận tập trung vào mục tiêu, trong đó bạn chọn mục tiêu từ nhóm đối thủ (ngẫu nhiên, một người có nhiều HP nhất, một số kết hợp của chúng, et cetera) và di chuyển đến mục tiêu đó, cố gắng làm hỏng nó.

Một điều bạn có thể muốn xem xét là cung cấp cho mỗi khả năng một chỉ số 'sức mạnh' hoặc 'hiệu quả' được ẩn khỏi người chơi và chỉ được sử dụng bên trong bởi AI của bạn. Bạn tự xác định các giá trị của chỉ số này, dựa trên kiến ​​thức của riêng bạn về các khả năng là lập trình viên của trò chơi.

AI của bạn sau đó sẽ chọn khả năng được đánh giá cao nhất của họ và cố gắng sử dụng khả năng đó, nếu họ không thể vì bất kỳ lý do gì, hãy chọn tiếp theo, et cetera. Nếu được xây dựng đủ chung chung, bạn có thể bắt đầu gắn kết hai hệ thống này lại với nhau, để khi bạn thiết lập mục tiêu, bạn có khả năng tấn công các loại tấn công tốt nhất vào mục tiêu đó (ví dụ: tấn công MP gây sát thương MP hiệu quả hơn nếu mục tiêu có MP cao).


1
Đối với các điểm bạn đã đề cập - bạn đúng về việc sử dụng chủ đề đó. Tôi đã nghĩ đến một luồng hỗ trợ cho các tính toán AI nhưng vì người dùng sẽ di chuyển đơn vị của họ, nó sẽ loại bỏ các tính toán. Nhưng vâng, đó là một ý tưởng tốt. Tôi chắc chắn sẽ thêm một heuristic để AI có thể sẽ chọn một khả năng hơn các khả năng khác - nó cũng cho phép 'AI theo chủ đề' chỉ làm một số khả năng nhất định.
f20k
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.