Thu nhập giảm dần đơn giản với nắp


19

Vấn đề

Người chơi đạt được 5 điểm cho mỗi cấp độ lên tới cấp 80 với tối đa 400. Có 5 chỉ số được phân phối và không giới hạn tối đa cho số tiền bạn có thể thêm vào một chỉ số.

  • Sức mạnh
  • Độ bền
  • Sự thông minh
  • Nhanh nhẹn
  • May mắn - Cung cấp cơ hội quan trọng và thiệt hại quan trọng

Tôi muốn thực hiện một phương trình hoàn trả giảm dần trên giả sử May mắn. Đối với cơ hội quan trọng, tôi không muốn người chơi có thể đạt 100% cơ hội quan trọng.

Sẽ có một mức trần mà nó sẽ đạt được khi tăng trưởng ngày càng giảm xuống tới 0 mỗi điểm được thêm vào.

Ví dụ nếu cơ hội quan trọng tối đa tôi muốn người chơi có là 40%, Mỗi điểm may mắn sẽ tăng cơ hội quan trọng ít hơn và ít hơn, cho đến khi cơ hội quan trọng đạt khoảng 40%. Bởi 1 may mắn sẽ cho một số lượng rất rất nhỏ.

Giải pháp nào? Cảm ơn bạn và sự giúp đỡ của bạn được đánh giá rất cao!


Bản sao có thể có của Cách phát triển Công thức sát thương RPG? - tl; dr từ khóa bạn đang tìm kiếm là đường cong sigmoid
BlueRaja - Danny Pflughoeft

@BlueRaja Tôi nghĩ đó không phải là một bản sao. Câu hỏi này là về các hàm trả về giảm dần nói chung là một trong số đó là về tính toán thiệt hại. Khi điều đó xảy ra, câu trả lời cho câu hỏi đó hầu hết đã thảo luận về các hàm trả về giảm dần, nhưng tôi nghĩ các câu hỏi vẫn khác nhau rõ ràng.
Anko

Câu trả lời:


30

Bạn muốn bắt đầu với một chức năng tiệm cận. Đó là, một bắt đầu từ một số avà tiếp cận một số khác b, nhưng không bao giờ thực sự đạt được nó. Nó có lẽ sẽ dễ dàng nhất nếu a = 0b = 1. Bạn sẽ lấy phương trình này, nhập số điểm stat (Điểm may mắn) mà nhân vật có và lấy giá trị chỉ số thực tế (Crit Chance) làm đầu ra.

Một ví dụ rất đơn giản là y = x / (x + n)nơi nmột số hằng số dương. Đây xlà đầu vào của bạn, nơi bạn cung cấp số lượng điểm stat và ylà đầu ra của bạn, nơi bạn nhận được giá trị stat cuối cùng.

Để n = 5kiểm tra xem nó trông như thế nào:

y = x / (x + 5) vẽ đồ thị cho x trong [0,100]

Khi bạn ăn trong x = 0bạn nhận được y = 0, nhưng không có vấn đề một lớn như thế nào xbạn đưa vào, ykhông bao giờ khá đạt 1. Perfect.

Bây giờ, bạn có thể điều chỉnh điều này để trái tim của bạn mong muốn. Bạn có thể nhân với hệ số tỷ lệ để đặt 'giới hạn' thành bất cứ điều gì bạn muốn. y = a * x / (x + 5). Nếu bạn muốn giới hạn là 40%, nhân với .4. y = .4 * x / (x + n). Bây giờ khi bạn cho ăn x, ysẽ tăng nhưng nó sẽ không bao giờ đạt được .4.

Điều chỉnh nđể thiết lập mức độ nhanh hay chậm của phương trình tăng tốc. n = 100sẽ tăng chậm hơn rất nhiều so với n = 5:

âm mưu y = x / (x + 100) cho x trong [0,400]

Bạn có thể giải phương trình này nnếu bạn biết bạn muốn giá trị stat bạn muốn đạt được tại một điểm số cụ thể. Giả sử nhân vật nên có 35% Crit Chance với 100 điểm May mắn. Giải quyết .35 = .4 * 100 / (100 + n)cho nnăng suất n = 14.29.

Những con số này không phải là hằng số thô. Có thể các số liệu thống kê khác đi vào tính toán các giá trị của n. Có thể một số nhân vật có những điểm khác nhau nđể họ có quy mô tốt hơn trong chỉ số 'ưa thích' của họ.

Nếu bạn muốn một đường cong có hình dạng khác hoặc phức tạp hơn, có nhiều ví dụ khác về các hàm tiệm cận bạn cũng có thể sử dụng. Tôi sẽ để bạn khám phá điều đó như bạn muốn.


3
Đường cong yêu thích của tôi là số mũ. Chỉ cần lấy một tỷ lệ cố định của nhóm còn lại với mỗi cấp độ.
John Dvorak

@JanDvorak cho đầy đủ, bạn có thể cung cấp một ví dụ? Có rất nhiều đường cong theo cấp số nhân và một người đọc có thể không biết cách áp dụng đề xuất của bạn từ nhận xét trước đó.
Adam

Đây là một điểm khởi đầu tốt và toán học được giải thích tốt, nhưng hãy nhớ rằng bạn không thể chỉ chọn một hàm có vẻ tốt; vấn đề này đòi hỏi phải xem xét cẩn thận và rất nhiều điều chỉnh. Ví dụ, một trong những nhược điểm của phương pháp này là không khuyến khích chuyên môn hóa. Nếu tất cả năm chỉ số đều khả thi như nhau, điểm dành cho điểm kém phát triển nhất sẽ có giá trị nhất (và điểm phát triển nhất là ít nhất). Bản dựng lý tưởng sẽ là sự phân phối điểm bằng nhau, điều này khiến cho sự lựa chọn của người chơi về cách sử dụng chúng ít thú vị hơn.
Marcks Thomas

@MarcksThomas Giả sử không có sự phối hợp giữa các thuộc tính hoặc khả năng cô lập một cách khéo léo một thuộc tính và "giành chiến thắng" với nó. Ví dụ, hãy tưởng tượng một cung thủ đáng kinh ngạc, người nhanh nhẹn đến mức kẻ thù chết trước khi họ tiếp cận họ: ngay cả khi sự nhanh nhẹn có hiệu quả giảm dần, chiến thuật được chọn làm cho các thuộc tính khác không quan trọng. Một chiến thuật khác liên quan đến sức mạnh có thể có hiệu quả tương đương, vì vậy các thuộc tính có "giá trị như nhau", nhưng chiến thuật thường có nghĩa là chuyên môn hóa chiếm ưu thế. Nếu hệ thống thuộc tính của bạn cũng thưởng cho chuyên môn hóa, trò chơi sẽ phân kỳ.
Yakk

Tôi gọi đây là hệ thống "rút đá ra khỏi túi". Giá trị P = x/(x+n)là xác suất, được cho một túi có n viên đá đen và x viên đá trắng, rằng bạn rút một viên đá trắng ra khỏi túi mù. Một cách tiếp cận bạn có thể làm là đặt crits đặt X = may mắn của bạn và N = may mắn của họ. Cơ hội của bạn để sau đó là 50% nếu bạn có cùng may mắn như kẻ thù của bạn. Nếu bạn muốn cơ hội cơ bản là 10%, thì chúng tôi X = may mắn của bạn, N = 9x may mắn của họ.
Yakk

10

Một cơ sở tốt sẽ là một chức năng như thế arctan, vì nó đi qua nguồn gốc và thể hiện một tiệm cận ngang.

hồ quang

Quy mô nó bằng 40 / (pi/2), hoặc 80/picho giới hạn mong muốn của bạn. Sau đó biến đổi luckđể có được độ dốc đường cong mà bạn muốn.

critical = 80/pi * arctan(f(luck))

8

Tôi thực sự thích cách các trò chơi Souls giải quyết vấn đề này. Thay vì làm cho mỗi chỉ số đưa ra tiền thưởng dựa trên chức năng liên tục như đã được đề xuất, nó cung cấp tiền thưởng trong chức năng tuyến tính từng phần.

Tôi không thể nhớ các con số chính xác ở trên đỉnh đầu của mình, nhưng các chức năng nằm dọc theo các dòng sau (mỗi chỉ số có hằng số riêng)

{0 <= x <20: y = 4x, 20 <= x <30: y = 3x + 20, 30 <= x <40: y = 2x + 50, 40 <= x <60: y = 1x + 90 , 60 <= x: y = 0,5x + 120}

Âm mưu

Phương pháp này cung cấp nhiều lợi ích cho người thiết kế và người chơi. Nhà thiết kế có lợi khi bạn có thể điều chỉnh lợi ích chính xác cho mỗi điểm trong một kỹ năng khá tầm thường và người chơi được lợi khi họ biết chính xác mức độ lợi ích mà họ sẽ thấy từ cấp này đến cấp khác.

Trong trường hợp hàm liên tục, một số mức có thể mang lại lợi ích không được phản ánh trong các số do bí danh đo lường. Chắc chắn rằng cấp độ cuối cùng đã giúp bạn tăng thêm 0,9 XYZ, nhưng vì giá trị thực tế đã tăng từ 23,52 lên 24,42 và bạn làm tròn số trước khi hiển thị nó, người chơi không nhận ra điều gì đó đã thay đổi.

Từ góc độ UX, tôi chắc chắn sẽ khuyên bạn nên sử dụng hàm tuyến tính từng phần. Tuy nhiên, sử dụng chức năng liên tục có thể dễ dàng điều chỉnh sau này hơn, vì người chơi sẽ không được gắn với các hằng số tròn.


1
Xấp xỉ một đường cong không đòi hỏi nhiều toán học và đơn giản để thay đổi. Tôi thích nó. :)
Casey Kuball

> Bạn làm tròn số trước khi hiển thị nó => một cách để bù đắp là ceilcác lượng tăng trước khi thêm, và chỉ cho phép số nguyên mức stat. hoặc floorsau đó x <= 0: x = 1để tránh vô tình đi qua nắp mềm.
Bob

1
Mặc dù bạn vẫn có thể thực hiện chức năng từng phần, nhưng nó không có tác dụng mà bạn đang tìm kiếm ở đây. Giá trị may mắn là một tỷ lệ phần trăm, với tối đa 400 đánh giá. Điều này có nghĩa là mọi điểm xếp hạng phải dẫn đến tăng giá trị dưới 1% về giá trị, ngay cả trong hàm tuyến tính với 100% may mắn. Thủ thuật chỉ hiển thị đủ số thập phân mà y (399) khác với y (400). Hàm của bạn thực hiện điều tương tự bằng cách làm cho y phát triển rất lớn để tăng luôn có thể là tích phân. Tại x = 40, y gấp hơn 4 lần giá trị của x.
MichaelS

@MichaelS Tôi vừa đưa ra một ví dụ về loại chức năng được sử dụng trong Dark Souls. Nó sẽ cần phải được cân bằng khác nhau tùy thuộc vào tình huống được áp dụng, nhưng quan điểm của tôi vẫn là người chơi sẽ hiểu tác dụng của hàm tuyến tính từng phần dễ dàng hơn nhiều so với đường cong hình cung hoặc phần hình nón.
Kaslai

3

Jan Dvorak chỉ ra hàm số mũ trong một bình luận. Tôi sẽ giải thích nó ở đây.

Lưu ý rằng các phép toán theo cấp số nhân (và trig) đắt hơn đáng kể so với các phép toán căn bậc hai, bản thân chúng kém hơn toán học cơ bản, vì vậy bạn có thể tốt hơn với cách tiếp cận của Adam nếu bạn thực hiện các phép tính này nhiều lần trong một giây . Nếu bạn chỉ tính toán các giá trị khi cấp độ người chơi, thay đổi thiết bị, v.v., tốc độ không quan trọng, vì vậy hãy sử dụng bất cứ thứ gì mang lại cho bạn đường cong tốt nhất.

Hàm số mũ là một số cơ sở, B , với một số lũy thừa , x , y=B^x. Các nhà toán học thường sử dụng cơ sở của e , (~ = 2.718), nhưng không có lý do gì bạn không thể sử dụng 2 hoặc 10 nếu bạn thích.

y=e^x trông như thế này: y = e ^ x

Lưu ý rằng bên trái đang di chuyển không đối xứng đến 0. Vì vậy, chúng ta có thể lật trục x bằng cách thực hiện y=e^(-x) nhưng nó vẫn giảm dần từ 1 đến 0 và chúng tôi muốn nó tăng dần. Vì vậy, chúng ta có thể lật nó qua trục y với y=-e^(-x) . Bây giờ, nó tăng dần từ -1 đến 0. Chúng ta có thể thêm 1 để nhận y=1- e^(-x) và tăng dần từ 0 đến 1.

y = 1-e ^ (- x)

Từ đây, chỉ là vấn đề nhân rộng nó theo chiều dọc và chiều ngang. Chúng ta có thể nhân toàn bộ mọi thứ với một giá trị nào đó, hãy gọi nó là A , đặt giới hạn tiệm cận. Sau đó, chúng ta có thể nhân x với giá trị thay đổi tỷ lệ, k , để điều chỉnh mức độ đóng của nó trong giới hạn.

Điều này cho chúng ta một phương trình cuối cùng của y=A*(1 - e^(-k*x)). Sử dụng các giá trị của k=0.012A=0.5, chúng ta có thể đặt giới hạn thành 50% và để nó gần với giới hạn đó x=400.

y = 0,5 * (1-e ^ (- 0,012 * k))

Bây giờ, bạn có thể thực hiện một vài điều chỉnh cho việc này. Một điều chỉnh tôi đã thực hiện là thay đổi thành A=0.5041tỷ lệ phần trăm với 2 số thập phân (như 32,23%), y (399) = 49,99% và y (400) = 50,00%. Từ y (347) trở đi, có một số nơi cần hai điểm để thay đổi 0,01%. Nhưng điểm cuối cùng có thể đó vẫn mang lại lợi ích hữu hình (hầu như không) và mang lại cho nó thậm chí 50%.

Thay phiên, chúng tôi có thể điều chỉnh kgiá trị để có hiệu ứng tương tự. Tại k=0.02305, giá trị làm tròn đến 49,99% tại y=399và 50,00% tại y=400. Tuy nhiên, điều này có một vấn đề là đồ thị ở cuối rất nông - phải mất 48 điểm để có được một phần trăm cuối cùng (từ y(352)=49.99%đến y(399)=49.99%đến y(400)=50.00%) và cơ hội phê bình 1% cuối cùng mất tới 230 điểm (từ y(170)=49.01%đến y(400)=50.00%) mà có lẽ là một chút quá giảm về lợi nhuận.

Nếu bạn muốn, bạn có thể điều chỉnh cả A và k để nó giảm đến giới hạn cao hơn một chút với tốc độ chậm hơn, để đưa ra một cái gì đó giữa phân rã tuyến tính và hàm mũ. Làm y=0.6*(1-e^(-0.00447*x)), bạn kết thúc với điều này: y = 0,6 * (1-e ^ (- 0,00447 * x))

Lưu ý rằng đường cong tiếp tục vượt quá 50%, nhưng vì có giới hạn cứng là 400 xếp hạng, người chơi không thể vượt qua điểm đó (và nếu họ có thể vượt qua nó, vẫn còn giới hạn cứng là 60%. Với phương trình này, bạn có thể sử dụng 1 vị trí thập phân và vẫn thấy mức tăng cứ sau 2 đến 3 điểm, với một đánh dấu cuối cùng từ y(399)=49.9%đến y(400)=50.0%.

Về mặt toán học, các phương trình trước đó có vẻ tốt hơn, vì chúng thực sự đạt gần 50%, nhưng cá nhân tôi nghĩ rằng mức tăng 0,1% mỗi điểm đôi cảm thấy tốt hơn mức tăng 0,01%. Ngay cả với A=0.05041k=0.012, phải mất 102 điểm để đi từ y(298)=49.00%đến y(400)=50.00%. 25% số điểm của bạn dành cho 2% số điểm của bạn có lẽ là quá giảm. Phương trình 60% chỉ mất 20 điểm cho phần trăm cuối cùng (vẫn cao hơn 5 lần so với 4 điểm cần thiết cho phần trăm đầu tiên).

Với một vài phương trình cuối cùng, tôi chỉ cần cắm các phương trình vào bảng tính và điều chỉnh các giá trị bằng tay cho đến khi chúng trông ổn. Bạn sẽ phải làm một cái gì đó tương tự nếu bạn muốn có một nắp khác.


2
Lưu ý về tốc độ tương đối của các phép toán là chính xác, nhưng có lẽ không liên quan đến số liệu thống kê của người chơi. Nút cổ chai trong các trò chơi hiện đại thường là thứ xử lý hàng ngàn vật phẩm trên mỗi khung hình (ví dụ: vật lý & kết xuất). Các kịch bản trò chơi có thể chạy vài chục lần trên mỗi khung hình dường như không phải là một đốm sáng liên quan đến điều này, và nói chung là đầy bộ nhớ cache dù sao sẽ khiến CPU mất nhiều thời gian để thực hiện bất kỳ phép toán nào bạn muốn. tl; dr: Đừng cảm thấy áp lực để tránh các ops đắt tiền trừ khi bạn đang viết shader hoặc những thứ khác cần để chạy các lô lớn
DMGregory

-1

Đối với một giải pháp rất đơn giản, làm thế nào về căn bậc hai x 2

Căn bậc hai của 400 (tối đa có thể) là 20, 20 * 2 = 40.


Tại sao bỏ phiếu xuống? Nó giải quyết các câu hỏi và đơn giản mà cũng được yêu cầu.
Catwood

1
Tôi không phải là người đánh giá thấp, nhưng có lẽ là do câu trả lời của bạn quá cụ thể và không cung cấp bất kỳ thông tin nào đã được cung cấp (căn bậc hai chỉ là lũy thừa cho sức mạnh của 1/2) và bạn không giải thích lý do tại sao điều này có thể hữu ích.
Kaslai

Tôi đã không downvote, nhưng tôi không nghĩ rằng đây là một câu trả lời hay vì nó không linh hoạt - căn bậc hai không có triệu chứng, vì vậy nếu mức tối đa thay đổi, bạn cần thay đổi công thức để giữ mức tối đa stat giống nhau.
BlueRaja - Daniel Pflughoeft
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.