Ý tưởng cho thuật toán sát thương tấn công (ngôn ngữ không liên quan)


8

Tôi đang làm việc trên một trò chơi và tôi cần ý tưởng về thiệt hại sẽ gây ra cho kẻ thù khi người chơi của bạn tấn công. Tổng lượng enemyHealthmáu mà kẻ địch được gọi và có giá trị 1000. Bạn bắt đầu với vũ khí gây sát thương 40 điểm (có thể thay đổi.) Người chơi có chỉ số tấn công mà bạn có thể tăng, được gọi playerAttack. Giá trị này bắt đầu từ 1 và có giá trị tối đa có thể là 100 sau khi bạn tăng cấp nhiều lần và khiến nó đi sâu hơn vào trò chơi. Lượng sát thương mà vũ khí gây ra được cắt và làm khô, và trừ 40 điểm trong tổng số 1000 điểm máu mỗi khi kẻ địch bị tấn công. Nhưng những gì playerAttacknó làm là thêm vào giá trị đó với tỷ lệ phần trăm. Đây là thuật toán tôi có bây giờ. (Tôi đã lấy ra tất cả các gui, các lớp, v.v. và đưa ra các biến rất giống tên)

double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05))
enemyHealth -= (int)totalDamage;

Điều này dường như làm việc tuyệt vời cho hầu hết các phần. Vì vậy, tôi đã thử nghiệm một số giá trị ...

//enemyHealth ALWAYS starts at 1000
weaponDamage = 50;
playerAttack = 30;

Nếu tôi đặt các giá trị này, lượng sát thương gây ra cho kẻ thù là 125. Có vẻ như là một con số tốt, vì vậy tôi muốn xem điều gì sẽ xảy ra nếu người chơi tấn công tối đa, nhưng với vũ khí khởi đầu yếu nhất.

weaponDamage = 50;
playerAttack = 100;

TotalDamage kết thúc là 300, sẽ giết kẻ thù chỉ sau vài cú đánh. Ngay cả khi đòn tấn công của bạn quá cao, tôi cũng không muốn vũ khí yếu nhất có thể giết kẻ thù nhanh như vậy. Tôi đã nghĩ về việc thêm phòng thủ, nhưng tôi cảm thấy trò chơi sẽ mất đi sự nhất quán và trở nên mất cân bằng trong thời gian dài. Có thể một thuật toán được thiết kế tốt cho công cụ sửa đổi giảm vũ khí sẽ hoạt động cho vũ khí cấp thấp hơn hoặc đại loại như thế. Chỉ cần nghỉ ngơi để cố gắng tìm ra cách tốt nhất để giải quyết vấn đề này, và có lẽ ai đó có kinh nghiệm với các trò chơi và giữ mức độ nhất quán có thể cho tôi một số ý tưởng / gợi ý.


2
Tôi nghĩ rằng chúng ta cần thêm một chút thông tin. Làm thế nào dễ dàng để cấp playerAttackchỉ số của bạn đến 100? Xem xét đây là giá trị tối đa, sẽ không giết kẻ thù trong một vài cú đánh là phù hợp? (Có phải kẻ thù 1000 HP là thứ bạn sẽ thấy khi bắt đầu trò chơi không? Một kẻ thù tiêu chuẩn? Ông chủ?)
Lee

Câu trả lời:


14

Câu trả lời được cung cấp bởi Grzegorz Sławecki đã là một câu hỏi hay, nhưng tôi muốn giải thích lý do đằng sau phương pháp của anh ấy và cung cấp cho bạn các công cụ để điều chỉnh các giải pháp cho nhu cầu chơi trò chơi của bạn.

Các thông số của vấn đề hiện tại là cấp độ tấn công của người chơi a , sát thương vũ khí w , tổng sát thương gây ra trong một đòn tấn công d , máu của kẻ thù H và số lần đánh tối thiểu cần thiết để tiêu diệt kẻ thù, hãy gọi nó là n .

Nếu bạn muốn người chơi giết trong n lượt truy cập, sau đó tổng thiệt hại của ông d phải được như vậy mà

(n-1) .d <H ≤ nd    hay nói cách khác, n = ceil (H / d) .

d phụ thuộc vào sát thương vũ khí w và vào cấp độ tấn công của người chơi a và chúng ta có thể hy vọng vũ khí sẽ tốt hơn khi tăng cấp độ, vì vậy hãy viết d (a)w (a) thay vì chỉ đơn giản là dw . Kẻ thù mà người chơi phải đối mặt cũng được dự đoán sẽ khó khăn hơn, một lần nữa, H (a) . Đây là tất cả các hàm tăng của a và bạn muốn chúng thỏa mãn các bất đẳng thức trên. Những ẩn số của vấn đề là các chức năng. Bạn đặt một cái là một ràng buộc và bạn tìm thấy những cái khác. Bạn có mức độ tự do mặc dù, đó là một điều tốt.

Nếu tôi hiểu rõ câu hỏi của bạn, bạn có một lối chơi chính xác và trò chơi này chủ yếu được thể hiện ở đây bằng số lần truy cập cần thiết để tiêu diệt kẻ thù, n (a) . Do đó, đặt n (a) tùy thuộc vào lối chơi mà bạn hình dung cho trò chơi và sau đó tìm phần còn lại của các biến số của vấn đề . Đây là điều bạn nên luôn luôn làm bởi vì, như câu hỏi của bạn cho thấy, nỗ lực đầu tiên của bạn là thử một thuật toán mà bạn nghĩ có thể làm và sau đó nhận ra rằng nó dẫn đến lối chơi không mong muốn.

Ví dụ, giả sử bạn muốn người chơi phải đánh nhiều lần hơn khi anh ta tiến bộ trong trò chơi. Bạn cũng muốn rằng, khi số lần truy cập yêu cầu tăng lên, nó sẽ tăng ít hơn và ít thường xuyên hơn, do đó người chơi dành một phần dài hơn của trò chơi đánh 5 lần hơn 2 lần. Đây là những gì n (a) trông giống như:

n (a) mong muốn

Hàm được sử dụng là n (a) = ceil (2 / 3.sqrt (a)) .

Chúng tôi muốn H (a) / d (a) ở trong phạm vi các giá trị làm cho n (a) có giá trị mong muốn và vì n (a) = ceil (H (a) / d (a)) , các phạm vi này là các hình chữ nhật sau:

n (a) và n (a) -1

H (a) / d (a) tự nhiên có thể được đặt thành 2 / 3.sqrt (a) để chúng ta có được biểu đồ sau, với đường cong màu đỏ là H (a) / d (a) :

n (a), n (a) -1 và H (a) / d (a)

Lưu ý: chúng ta có thể dễ dàng tìm thấy H (a) / d (a) ở đây vì chúng ta biết chức năng của n (a) là trần nhà, nhưng nếu đặc điểm kỹ thuật của chúng ta cho n kém hơn, chúng ta sẽ phải tự điều chỉnh chức năng sử dụng các thủ thuật khác nhau. Không phải tất cả các vấn đề là tốt đẹp này!

Vì vậy, chúng tôi muốn H (a) / d (a) giống với hàm căn bậc hai tùy chỉnh và chúng tôi biết rằng Hd phải là các hàm tăng. Giải pháp là rất nhiều. Ví dụ,

H (a) = a. 2 / 3.sqrt (a)    và    d (a) = a

Một giải pháp đầu tiên cho H và d

Nhưng chúng tôi muốn sát thương và HP của kẻ thù tăng lên rất nhiều để có những con số lớn, ấn tượng ở cuối trò chơi, chỉ vì phong cách, vì vậy chúng tôi thay vào đó đặt

H (a) = a². 20 / 3.sqrt (a)    và    d (a) = 10.a²

Một giải pháp tốt hơn cho H và d

Toàn bộ vấn đề và phần hay nhất là đây: bạn biết rằng các giải pháp của bạn cho vấn đề ( H (a)d (a) ) tuân theo các thông số kỹ thuật ( n (a) ), vì vậy bạn có cùng n (a) , nhưng bạn có tự do. Bạn biết chính xác sự tự do mà bạn có, và bạn có thể sử dụng nó để tùy chỉnh trải nghiệm. Bạn nên luôn cố gắng tạo cho mình sự tự do như vậy trong khi đáp ứng những nhu cầu quan trọng nhất của bạn, bất cứ khi nào có thể.

Bây giờ chúng tôi đã chọn sát thương một lần d (a) và vì d (a) phụ thuộc vào sát thương vũ khí w (a) , chúng tôi có thể sử dụng d (a) làm thông số kỹ thuật của mình và cố gắng tìm w (a) ) cung cấp cho chúng tôi điều này d (a) . Các nguyên tắc là như nhau, vấn đề là khác nhau: chúng tôi muốn người chơi gây ra nhiều thiệt hại hơn khi cấp độ của anh ta tăng lên, ngay cả khi vũ khí vẫn giữ nguyên, và chúng tôi cũng muốn thiệt hại tăng lên khi một mình vũ khí tốt hơn và cấp độ vẫn giữ nguyên giống nhau.

Nhưng tầm quan trọng của từng yếu tố? Giả sử chúng ta muốn cấp độ quan trọng hơn vũ khí: một phần lớn hơn trong các biến thể của d (a) = a² nên độc lập với w (a) , ví dụ như với

w (a) = 22.sqrt (a)    và do đó,    d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))

Chúng tôi nhận được biểu đồ sau cho w (a) ...

w (a)

... và vẫn như nhau d (a) , bởi vì chúng tôi một lần nữa tìm thấy một giải pháp mà tuân theo đặc điểm kỹ thuật , ở đây d (a) , và chúng tôi có các tính chất nêu trên với wmột góp phần vào sự thiệt hại (giả sử chúng ta nhìn vào d là hàm của aw : sau đó nếu a đã cố định và chúng ta có w khác nhau trong phương trình d (a, w) = a / 30.w , d vẫn sẽ là hàm tăng của w , và điều tương tự là đúng nếu bạn khắc phục w và làm cho một thay đổi).

Điều này (a) có thể cung cấp cho bạn giá trị được hiển thị trong phần mô tả ingame của vũ khí: chúng tôi sẽ nhận được "Damage Weapon: 220" với vũ khí tốt nhất trong trò chơi chẳng hạn.

Chúng tôi có thể đã sử dụng một đặc điểm kỹ thuật hoàn toàn khác cho trò chơi của mình và do đó, đối với n (a) , ví dụ như một số làm cho số lần truy cập cần thiết tăng nhanh khi trò chơi tiến triển và sau đó là cao nguyên, và các giải pháp kết quả sẽ khác.


Điều này kết hợp một sự hiểu biết âm thanh của toán học với trò chơi như một điểm khởi đầu. Một câu trả lời tuyệt vời.
Marcks Thomas

1
@MarcksThomas Xin cảm ơn! Tôi muốn nhiều người xác định rõ nhu cầu của họ và xây dựng trò chơi của họ từ đó. Chúng ta sẽ thấy các trò chơi hoàn thiện hơn, hoàn thiện có chất lượng theo cách đó.
jrsala

Vâng, tôi đồng ý rằng đây là câu trả lời hoàn hảo. Tôi đọc nó với niềm vui :)
Grzegorz Sławecki

1
Tuyệt diệu! Tôi muốn loại toán học này là một phần thường xuyên hơn của tài liệu thiết kế hệ thống. (Có lẽ tôi nên viết bài luận về sát thương và khiên đôi khi ...)
Steven Stadnicki

Câu trả lời tuyệt vời, nhưng tại sao bạn phải sử dụng một biến ký tự trong phương trình của bạn? Đã bao nhiêu lần tôi hỏi, "Điều gì ađứng lại một lần nữa?" và cuộn lên?
Daniel Kaplan

9

Tôi khuyên bạn nên thiết kế trò chơi của mình theo hướng khác: Trước tiên hãy nghĩ về cách bạn muốn trò chơi của mình chơi (về trải nghiệm trò chơi, không phải về số), sau đó thiết kế cả công thức và phạm vi số để có được kết quả đó

Mục tiêu chơi trò chơi của bạn là cần một số lần đánh nhất định để tiêu diệt kẻ thù. Có bao nhiêu lần truy cập phụ thuộc vào ba biến:

  • cấp độ sức mạnh của kẻ thù
  • cấp độ sức mạnh của nhân vật
  • cấp độ sức mạnh của vũ khí

Trước tiên, bạn nên tạo một bảng gồm tất cả các kết hợp có thể có của ba biến này là thấp, trung hoặc cao (chưa có số cụ thể, chỉ là "thấp", "giữa" hoặc "cao") và có bao nhiêu lần truy cập bạn muốn được yêu cầu cho các kết hợp này.

Sau đó, bạn nên cố gắng tìm một công thức và phạm vi giá trị gần đúng nhất với giá trị mong muốn của bạn.


7

Cách dễ nhất, là tăng sát thương vũ khí giữa các cấp vũ khí theo cấp số nhân.

Tuy nhiên, điều quan trọng là Bạn cũng nên xác định HP của kẻ thù đang phát triển như thế nào khi chúng trở nên mạnh hơn. Vì vậy, khi bạn rất mạnh, bạn nên tiêu diệt kẻ thù dễ dàng chỉ bằng một vài cú đánh, nhưng những kẻ ở cấp độ của bạn sẽ tương đối khó giết hơn những kẻ thù ở cấp độ của bạn lúc ban đầu. Vì vậy, tôi sẽ thiết kế nó để trông giống như dưới đây:

level   weapon  enemy   attack  total   hits needed
        dmg     hp      factor  dmg     to kill
======================================================
1       1       2       5       1.25    1.6
2       4       16      10      6       2.666666667
3       9       54      15      15.75   3.428571429
4       16      128     20      32      4
5       25      250     25      56.25   4.444444444
6       36      432     30      90      4.8
7       49      686     35      134.75  5.090909091
8       64      1024    40      192     5.333333333
9       81      1458    45      263.25  5.538461538
10      100     2000    50      350     5.714285714
11      121     2662    55      453.75  5.866666667
12      144     3456    60      576     6
13      169     4394    65      718.25  6.117647059
14      196     5488    70      882     6.222222222
15      225     6750    75      1068.75 6.315789474
16      256     8192    80      128     6.4
17      289     9826    85      1517.25 6.476190476
18      324     11664   90      1782    6.545454545
19      361     13718   95      2075.75 6.608695652
20      400     16000   100     2400    6.666666667
Ở đâu:
1. tổng dmg được tính bằng công thức của bạn
2. vũ khí dmg = level * level (tăng trưởng theo cấp số nhân)
3. hp địch = 2 * cấp * cấp * cấp (tăng theo cấp số nhân)
4. hệ số tấn công = 5 * cấp
5. lượt truy cập cần thiết mô tả có bao nhiêu lượt truy cập cần thiết ở cấp độ x và sử dụng vũ khí ở cấp độ x, để tiêu diệt kẻ thù ở cấp độ x

Tôi đã điều chỉnh các yếu tố không đổi đó trong các công thức chỉ để đạt được kết quả mà tôi nghĩ là có thể chấp nhận được, vì điều quan trọng là nơi bạn muốn tăng trưởng tuyến tính và nơi bạn muốn theo cấp số nhân.

Bạn cũng nên chú ý rằng để tiêu diệt kẻ thù lv 20 có 100 đòn tấn công và có vũ khí lvl1, mất tổng cộng 6 dmg sẽ mất rất nhiều thời gian. Nếu nó mất quá nhiều theo ý kiến ​​của bạn, hãy chơi với hằng số.


"Yếu tố tấn công" nghĩa là gì?
Daniel Kaplan

0

Tôi nghĩ rằng thế giới của phương pháp thủ công chiến tranh là một trong những phương pháp tốt nhất. Chỉ số cơ bản của người chơi có tác động thấp đến tổng sát thương, với hầu hết các công cụ sửa đổi sát thương đến từ chỉ số tiền thưởng trên trang bị. Điều đó giúp mở rộng trò chơi dễ dàng hơn và cân bằng nó khi thời gian trôi qua

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.