Tính toán đầu ra của hai đội quân chiến đấu


20

Tôi đang lập trình một trò chơi chiến lược bằng Flash. Trò chơi hoạt động rất giống với trò chơi nổi tiếng "Travian".

Vấn đề của tôi là như sau: Tôi đang cố gắng làm cho việc tính toán quân bị mất do kết quả của cuộc chiến giữa hai quân đội. Hai đội quân có các loại đơn vị khác nhau. Một số trong số họ mạnh hơn so với một số đơn vị khác và yếu hơn so với các loại khác.

Làm thế nào tôi có thể đặt hiệu ứng của sự khác biệt này trong phương trình của cuộc chiến?

Có vẻ là dễ dàng nếu họ chỉ có điểm att và def mà thôi, nhưng khi nó đến với sự phụ thuộc loại đơn vị, tôi bị mất.


6
Kết quả của trận chiến của bạn có hoàn toàn mang tính quyết định hay bạn muốn sử dụng một loại ngẫu nhiên nào đó?
sum1stolemyname

4
Tôi không nghĩ rằng nó nên được gắn thẻ dưới dạng trò chơi nhiều người chơi vì OP không được đưa ra - nó có thể là con người vs AI. Và bằng 'loại phụ thuộc', chúng ta đang nói về loại đá cổ điển-> kéo-> giấy-> loại đá?
Vịt Cộng sản

Câu trả lời:


10

Ngoài việc hỗ trợ đề xuất của Amit về việc xem xét các phương trình Lanchester, tôi chỉ muốn nói thêm rằng đây là một quyết định thiết kế trò chơi, không phải là một thực tế thực tế mà chúng tôi có thể cung cấp cho bạn. Nếu bạn muốn đưa loại đơn vị vào tài khoản, bạn phải quyết định điều đó có nghĩa là gì. Điều này có nghĩa là chọn một phương trình bao gồm tất cả các yếu tố mà bạn muốn lối chơi của mình bao gồm. Nếu bạn muốn bộ binh tốt hơn kỵ binh, thì bạn phải quyết định điều đó có nghĩa là gì - vd. bạn cần bao nhiêu kỵ binh để bằng 100 bộ binh? Và có vấn đề ai tấn công ai? Bạn dường như đang ám chỉ rằng chỉ cần cung cấp cho bộ binh và kỵ binh các giá trị tấn công và phòng thủ khác nhau là không đủ - tại sao vậy? Những gì khác bạn đang cố gắng để đại diện mà không thể bị bắt bởi những giá trị đó?

Bạn phải quyết định những yếu tố nào bạn muốn mô hình hóa trong trò chơi của mình, vì chúng ảnh hưởng đến cách người chơi sẽ tiếp cận nó. Chúng có thể bao gồm kích thước / số lượng đơn vị, loại đơn vị, kinh nghiệm đơn vị (ví dụ như tình trạng cựu chiến binh), hiệu ứng địa hình và môi trường, sự khác biệt giữa tấn công và phòng thủ nếu có, có nên mô hình thiệt hại và tiêu hao hay không, có nên mô hình hóa thời gian trôi qua chiến đấu, khả năng rút hoặc chạy trốn (có thể bao gồm mô hình hóa tinh thần), bạn muốn có bao nhiêu sự ngẫu nhiên trong phương trình, v.v.

Một khi bạn biết tất cả điều này, có một số cách tiếp cận toán học cơ bản bạn có thể thực hiện. Bạn có thể thực hiện một vòng theo hệ thống "cơ hội để đánh" như nhiều game nhập vai có, vd. hệ thống chiến đấu d20. Bạn có thể thực hiện một hệ thống tung đồng xu có trọng số "tấn công và phòng thủ" một vòng như trò chơi Civilization gốc. Bạn có thể yêu cầu mỗi bên tạo một số điểm bằng cách thêm các thuộc tính vào một số ngẫu nhiên và ai có giá trị cao nhất sẽ thắng. Và bạn có thể cho phép các hệ thống này hoạt động trên cơ sở từng vòng, hoặc để trừ điểm nhấn hoặc điểm tinh thần, hoặc bất cứ điều gì. Bất kỳ hệ thống nào cũng có thể hoạt động, nhưng bạn phải cân bằng nó theo cách bạn muốn chơi. Cuối cùng, việc lựa chọn cách mô hình hóa chiến đấu là một phần quan trọng trong thiết kế trò chơi và không phải là thứ mà người khác có thể cung cấp cho bạn.


Bạn hoàn toàn đúng Kylotan. Tôi đã có một số ý tưởng về cuộc chiến trước khi bắt đầu thiết kế trò chơi. Tuy nhiên, tôi đã đăng câu hỏi này để hỏi liệu có cách nào tốt hơn để thiết kế nó và tìm ra cách tốt nhất để thực hiện nó là gì. Tôi đã thắng cả hai mục đích tôi đoán :) Bạn của tôi, bạn có thể vui lòng cho tôi biết nơi tôi có thể tìm thêm thông tin về các phương pháp toán học đó không? Ngoài ra, nếu tôi trả lời tất cả các câu hỏi bạn hỏi về việc chọn hệ thống, bạn có thể tư vấn cho tôi cách nào phù hợp nhất với trường hợp của tôi không? Cảm ơn bạn rất nhiều vì thời gian của bạn :)
Ali Albahrani

Tôi không thể nói cho bạn biết cái nào sẽ tốt nhất, nhưng có lẽ bạn nên bắt đầu đơn giản và cải thiện điều đó nếu bạn cần. Travian dường như có một cuộc tấn công đơn giản so với hệ thống phòng thủ, với 2 loại đơn vị (bộ binh và kỵ binh) và 2 điểm phòng thủ cho mỗi đơn vị tương ứng. Một cách dễ dàng để giải quyết một trận chiến, như được sử dụng trong Civilization 1, là chia điểm tấn công của những kẻ tấn công bằng tổng số điểm đó cộng với điểm phòng thủ của người phòng thủ. Điều này cung cấp cho bạn một tỷ lệ phần trăm. Bây giờ chọn một số ngẫu nhiên từ 0 đến 100 phần trăm. Nếu nó thấp hơn điểm tấn công của kẻ tấn công, kẻ tấn công sẽ thắng. Nếu không thì các hậu vệ giành chiến thắng.
Kylotan

15

Đối với Solar Realms Elite, tôi được truyền cảm hứng từ phương trình của Lanchester để mô hình hóa chiến tranh . Tôi đã có một vài trận đánh đồng thời trong mỗi vòng chiến đấu.

Trong trận chiến đầu tiên, mọi người đều tấn công binh lính. Trong SRE, lính là tốt nhất để chống lại binh lính (không phải là kéo giấy, mà là bộ binh, không kích và không gian sâu). Tôi thiết lập một sức mạnh tấn công và phòng thủ nơi những người lính có cuộc tấn công tốt nhất:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

Trong cuộc chiến thứ hai, mọi người tấn công các trạm phòng thủ. Trong các máy bay chiến đấu SRE (trên không) là tốt nhất để chống lại các trạm phòng thủ (ví dụ như phòng không):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

Trong cuộc chiến thứ ba, mọi người đều tấn công các tàu tuần dương hạng nặng. Trong các tàu tuần dương hạng nặng SRE đang ở trong không gian và tốt nhất so với các tàu tuần dương hạng nặng khác:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(Tôi không nhớ những hằng số tôi đã sử dụng; đó chỉ là những ví dụ.) Trong mỗi vòng chiến đấu, những kẻ tấn công sẽ mất một phần sức mạnh phòng thủ và những người phòng thủ sẽ mất một phần sức mạnh tấn công. Tôi tin rằng điều này tương ứng với Luật bình phương của Lanchester (phương trình ở đây ). Tôi đã thêm ngẫu nhiên nhưng tôi không nhớ chính xác ở đâu. Sau mỗi vòng chiến đấu, quân đội sẽ nhỏ hơn. Tôi đặt giới hạn tối đa cho số vòng; Sau đó, phe thua cuộc sẽ rút lui.

Thật không thực tế khi bộ binh trên mặt đất bắn vào không gian sâu, nhưng nó hoạt động tốt hơn vì lý do chơi trò chơi để tất cả các đơn vị có thể chiến đấu với tất cả các đơn vị khác (giảm hiệu quả).


12

Tôi có xu hướng nói 'nếu bạn không thể tìm thấy một giải pháp rõ ràng, hãy tìm một giải pháp ngầm'. Bạn có thể mô phỏng trận chiến trong nội bộ cho đến khi một đội quân bị xóa sổ hoặc rút lui (tùy thuộc vào kết quả có thể xảy ra trong trò chơi của bạn).

Tôi sẽ sử dụng một cái gì đó như thế này:

Đối với mỗi lần lặp lại của trận chiến, tất cả các đơn vị đều có cơ hội, vì vậy họ cố gắng gây sát thương nhiều nhất có thể. Mỗi đơn vị chọn một đơn vị quân địch sẽ tấn công vào vòng này, dựa trên những lợi thế / bất lợi đã biết.

Sau đó, tất cả các trận đấu phụ được thực hiện. Một ví dụ:

Hãy để spearmen có hiệu quả chống lại kỵ binh, cavalaray hiệu quả chống lại cung thủ và cung thủ có hiệu quả chống lại spearman.

Trong một cuộc chiến giữa hai đội quân bao gồm cả hai loại đơn vị cơ bản này, tất cả các giáo sĩ sẽ tấn công kỵ binh, tất cả các đơn vị kỵ binh sẽ tấn công cung thủ và tất cả cung thủ sẽ tấn công giáo. Ví dụ, nếu một bên không có cung thủ, đội kỵ binh bên kia sẽ chọn loại mục tiêu tốt nhất tiếp theo (là đơn vị kỵ binh địch)

Mỗi sự kiện đơn vị tấn công-đơn vị được giải quyết một cách riêng biệt, với đơn vị bị mất bị hư hại hoặc được đánh dấu là bị phá hủy.

Sau khi tất cả các trận đánh cá nhân đã được giải quyết, hãy loại bỏ tất cả các đơn vị đã bị phá hủy nghiêm trọng hoặc bị phá hủy.

Lặp lại tiếp theo bắt đầu sử dụng quân đội giảm bây giờ.


Thực sự đồng ý với bài này. Tốt hơn là lặp đi lặp lại qua trận chiến thay vì giảm nó thành một phương trình duy nhất. Và tôi chắc chắn sẽ thêm một chút ngẫu nhiên vào nó. Phải có cơ hội nhỏ đến mức mà hậu vệ yếu phải lăn cao và ghi điểm. Một ưu điểm khác của phép lặp là bạn có thể tạo một tường thuật về các sự kiện để hiển thị cho người chơi. "Các kiếm sĩ đã tấn công và sớm tàn sát những người hầu, nhưng sau đó, người lính đã đến và ..."
Tim Holt

Tôi rất thích câu trả lời của bạn và tôi nghĩ rằng tôi sẽ thực hiện nó một cách ngẫu nhiên :)
Ali Albahrani

3

Tôi đang thử nghiệm bản beta một trò chơi hiện là phiên bản đơn giản của Solar Realms ( Star Empire Elite ) và tôi đã bắt đầu bằng cách sử dụng một cái gì đó tương tự như phương trình của Amit (ở trên). Đặc biệt, tôi thích ý tưởng có ba giai đoạn vào trận chiến, nơi bạn phải giành được hai trong số ba. Nhưng tôi cũng muốn giới thiệu một yếu tố ngẫu nhiên vào trận chiến, và vì thế tôi bị ảnh hưởng bởi một số trò chơi trên bàn.

Xử lý là một vấn đề đáng lo ngại nếu trò chơi có quy mô, vì vậy tôi không muốn làm theo phương pháp được đề xuất bởi sum1stolemyname ở trên, mặc dù nếu trò chơi của bạn đang sử dụng máy khách để xử lý kết quả, trái ngược với máy chủ, điều này dường như là một cách tiếp cận tốt.

Tôi quyết định chia trận chiến thành hai giai đoạn (tương tự như ba trong mô hình của Amit): không khí và mặt đất. Tôi tính toán sức tấn công và phòng thủ, và điều chỉnh sức mạnh tấn công xuống một phần (để tạo lợi thế cho người phòng thủ). Vào thời điểm đó, nếu sức mạnh tấn công và sức mạnh phòng thủ bằng nhau, cuộc tấn công có 50% cơ hội chiến thắng. Từ đó, tôi điều chỉnh tỷ lệ phần trăm cơ hội chiến thắng lên hoặc xuống dựa trên mức độ (hoặc ít hơn) sức mạnh của kẻ tấn công so với người phòng thủ. Dưới đây là một số phương trình đơn giản hóa cho không khí:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Tôi xác định rằng cơ hội không bao giờ có thể lớn hơn 80 hoặc nhỏ hơn 5. Từ đó, tôi chỉ cần tạo một số ngẫu nhiên trong số 100, và sau đó chuyển tiếp kết quả đó đến trận chiến trên bộ.

Một điều tôi chưa giải quyết được cho sự hài lòng của mình là tỷ lệ thương vong. Nhưng tôi nghĩ rằng một cách tốt để tìm ra điều này sẽ là so sánh cơ hội_of_victory với số ngẫu nhiên được tạo ra, và sử dụng nó để lấy một phần lực lượng phòng thủ tấn công làm thương vong.

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.