Làm thế nào để phát triển Công thức sát thương RPG?


117

Tôi đang phát triển một game nhập vai 2d cổ điển (trong một mạch tương tự như tưởng tượng cuối cùng) và tôi tự hỏi liệu có ai có lời khuyên nào về cách thực hiện các công thức / liên kết đến tài nguyên / ví dụ không? Tôi sẽ giải thích thiết lập hiện tại của tôi. Hy vọng rằng tôi không làm quá với câu hỏi này và tôi xin lỗi nếu câu hỏi của tôi quá lớn / rộng

Số liệu thống kê nhân vật của tôi bao gồm:

enum Stat
{
    HP = 0,
    MP = 1,
    SP = 2,
    Strength = 3,
    Vitality = 4,
    Magic = 5,
    Spirit = 6,
    Skill = 7,
    Speed = 8, //Speed/Agility are the same thing
    Agility = 8,
    Evasion = 9,
    MgEvasion = 10,
    Accuracy = 11,
    Luck = 12,
};

Vitality về cơ bản là phòng thủ trước các đòn tấn công vật lý và tinh thần là phòng thủ trước các đòn tấn công ma thuật.

Tất cả các số liệu thống kê có mức tối đa cố định (9999 cho HP, 999 cho MP / SP và 255 cho phần còn lại). Với các khả năng, mức tối đa có thể tăng (99999 cho HP, 9999 cho HP / SP, 999 cho phần còn lại) với các giá trị điển hình (ở cấp 100) trước / sau khả năng + thiết bị + vv sẽ là 8000 / 20.000 cho HP, 800 / 2000 cho SP / MP, 180/350 cho các số liệu thống kê khác

Enemy HP vào cuối game thường sẽ ở hàng triệu người thấp hơn (với một siêu trùm có tối đa ~ 12 triệu).

Tôi đã tự hỏi làm thế nào để mọi người thực sự phát triển các công thức thiệt hại thích hợp có tỷ lệ chính xác? Chẳng hạn, dựa trên dữ liệu này, sử dụng các công thức gây sát thương cho Final Fantasy X làm căn cứ có vẻ rất hứa hẹn. Một tài liệu tham khảo đầy đủ ở đây http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381 nhưng như một ví dụ nhanh: Str = 127, lệnh 'Tấn công' được sử dụng, kẻ thù Def = 34.

1. Physical Damage Calculation:
Step 1 ------------------------------------- [{(Stat^3 ÷ 32) + 32} x DmCon ÷16]
Step 2 ---------------------------------------- [{(127^3 ÷ 32) + 32} x 16 ÷ 16]
Step 3 -------------------------------------- [{(2048383 ÷ 32) + 32} x 16 ÷ 16]
Step 4 --------------------------------------------------- [{(64011) + 32} x 1]
Step 5 -------------------------------------------------------- [{(64043 x 1)}]
Step 6 ---------------------------------------------------- Base Damage = 64043
Step 7 ----------------------------------------- [{(Def - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------ [{(34 - 280.4)^2} ÷ 110] + 16
Step 9 ------------------------------------------------- [(-246)^2) ÷ 110] + 16
Step 10 ---------------------------------------------------- [60516 ÷ 110] + 16
Step 11 ------------------------------------------------------------ [550] + 16
Step 12 ---------------------------------------------------------- DefNum = 566
Step 13 ---------------------------------------------- [BaseDmg * DefNum ÷ 730]
Step 14 --------------------------------------------------- [64043 * 566 ÷ 730]
Step 15 ------------------------------------------------------ [36248338 ÷ 730]
Step 16 ------------------------------------------------- Base Damage 2 = 49655
Step 17 ------------ Base Damage 2 * {730 - (Def * 51 - Def^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ---------------------- 49655 * {730 - (34 * 51 - 34^2 ÷ 11) ÷ 10} ÷ 730
Step 19 ------------------------- 49655 * {730 - (1734 - 1156 ÷ 11) ÷ 10} ÷ 730
Step 20 ------------------------------- 49655 * {730 - (1734 - 105) ÷ 10} ÷ 730
Step 21 ------------------------------------- 49655 * {730 - (1629) ÷ 10} ÷ 730
Step 22 --------------------------------------------- 49655 * {730 - 162} ÷ 730
Step 23 ----------------------------------------------------- 49655 * 568 ÷ 730
Step 24 -------------------------------------------------- Final Damage = 38635

Tôi chỉ đơn giản là sửa đổi các dải phân cách để bao gồm xếp hạng tấn công của vũ khí và xếp hạng áo giáp của áo giáp.

Sát thương phép được tính như sau: Mag = 255, Ultima được sử dụng, kẻ thù MDef = 1

Step 1 ----------------------------------- [DmCon * ([Stat^2 ÷ 6] + DmCon) ÷ 4]
Step 2 ------------------------------------------ [70 * ([255^2 ÷ 6] + 70) ÷ 4]
Step 3 ------------------------------------------ [70 * ([65025 ÷ 6] + 70) ÷ 4]
Step 4 ------------------------------------------------ [70 * (10837 + 70) ÷ 4]
Step 5 ----------------------------------------------------- [70 * (10907) ÷ 4]
Step 6 ------------------------------------ Base Damage = 190872 [cut to 99999]
Step 7 ---------------------------------------- [{(MDef - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------- [{(1 - 280.4)^2} ÷ 110] + 16
Step 9 ---------------------------------------------- [{(-279.4)^2} ÷ 110] + 16
Step 10 -------------------------------------------------- [(78064) ÷ 110] + 16
Step 11 ------------------------------------------------------------ [709] + 16
Step 12 --------------------------------------------------------- MDefNum = 725
Step 13 --------------------------------------------- [BaseDmg * MDefNum ÷ 730]
Step 14 --------------------------------------------------- [99999 * 725 ÷ 730]
Step 15 ------------------------------------------------- Base Damage 2 = 99314
Step 16 ---------- Base Damage 2 * {730 - (MDef * 51 - MDef^2 ÷ 11) ÷ 10} ÷ 730
Step 17 ------------------------ 99314 * {730 - (1 * 51 - 1^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ------------------------------ 99314 * {730 - (51 - 1 ÷ 11) ÷ 10} ÷ 730
Step 19 --------------------------------------- 99314 * {730 - (49) ÷ 10} ÷ 730
Step 20 ----------------------------------------------------- 99314 * 725 ÷ 730
Step 21 -------------------------------------------------- Final Damage = 98633

Vấn đề là các công thức hoàn toàn sụp đổ một khi các số liệu thống kê bắt đầu vượt quá 255. Cụ thể là các giá trị Phòng thủ trên 300 hoặc hơn bắt đầu tạo ra hành vi thực sự kỳ lạ. Chẳng hạn, chỉ số Sức mạnh + Phòng thủ cao dẫn đến các giá trị âm lớn. Mặc dù tôi có thể sửa đổi các công thức để hoạt động chính xác cho trường hợp sử dụng của mình, nhưng có lẽ sẽ dễ dàng hơn khi sử dụng một công thức hoàn toàn mới. Làm thế nào để mọi người thực sự phát triển các công thức thiệt hại? Tôi đã xem xét việc mở excel và cố gắng xây dựng công thức theo cách đó (ví dụ ánh xạ Chỉ số tấn công so với Chỉ số phòng thủ) nhưng tôi tự hỏi liệu có cách nào dễ hơn không? Trong khi tôi không thể truyền tải toàn bộ cơ chế trò chơi của trò chơi của mình ở đây, ai đó có thể đề xuất một nơi khởi đầu tốt để xây dựng công thức sát thương không?

Cảm ơn


1
Tôi nghĩ rằng bạn đã làm điều đúng đắn trong lần đầu tiên thiết lập loại thống kê, HP, v.v. bạn muốn. Đây là một phần của trải nghiệm người chơi và toán học phải phù hợp với 'xung quanh' các giá trị này. Tuy nhiên, với rất nhiều chỉ số, người chơi nên trực giác biết những chỉ số nào sẽ ảnh hưởng đến phép thuật, tấn công vật lý của mình, v.v. Vì vậy, câu hỏi lớn đầu tiên là chỉ số nào tương ứng với một cuộc tấn công và chỉ số nào bảo vệ chống lại các chỉ số này (Đối với Tiến sĩ cũ chỉ bảo vệ chống lại PhAtk).
Jonathan Connell

Điều quan trọng là sự cân bằng, có lẽ sẽ là một ý tưởng tốt để tạo một chương trình tương tác (nói bằng C # hoặc một cái gì đó nhanh chóng) nơi bạn có thể thay đổi số liệu thống kê và xem loại kết quả bạn nhận được. Nếu bạn có thể thay đổi công thức trong thời gian chạy, điều đó cũng có ích :)
Jonathan Connell

4
Cân nhắc sử dụng Excel để làm điều này. Có vẻ phù hợp với nhiệm vụ và bạn sẽ không phải viết một dòng mã.
Alex Schearer

2
Câu hỏi quan trọng nhất là: Công thức nào mang lại cho người chơi niềm vui nhất ? (đã tìm kiếm trang "vui vẻ" và không có câu trả lời nào được đề cập: P) Nếu chỉ số hoặc thiệt hại tăng quá nhanh, người chơi sẽ bị vô cảm, nếu đi lên chậm thì họ sẽ chán. Người chơi cần cảm thấy hạnh phúc khi đạt được một cấp độ, vì vậy họ cần cảm thấy như họ đã đưa công việc vào đó và cũng sẽ có một số hiệu ứng đáng chú ý đối với hiệu suất trò chơi của họ. (đó là 2 xu của tôi)
Annan

3
"(Def - 280.4) ^ 2" hả? Chà, tôi hy vọng mọi thứ sẽ trở nên kỳ lạ không phải với Def> 255 hoặc Def> 300 mà chính xác là khá nhiều cho Def> 280.4;) Sau đó, def cao hơn sẽ có nghĩa là def thấp hơn tại thời điểm này của công thức trong khi tiếp tục hành xử như dự kiến ​​ở những điểm khác. BTW, bạn chỉ có thể vẽ đồ thị này với Wolfram Alpha hoặc hơn thế. Sửa đủ các biến để chỉ giữ hai và bạn sẽ có được một biểu đồ bề mặt đẹp.
Christian

Câu trả lời:


140

Tạo các công thức như thế này đòi hỏi kiến ​​thức về các hàm toán học cơ bản - những điều bạn đã học về lớp Đại số và Tiền tính toán.

Khi bạn đã thành thạo, chỉ cần tự hỏi (thay thế "giá trị" bằng "thiệt hại" hoặc "sức khỏe" hoặc "tốc độ" hoặc bất cứ điều gì) :

  • Bạn có muốn giá trị tăng trưởng với tốc độ không đổi? Sử dụng hàm tuyến tính .
  • Bạn có muốn giá trị tăng chậm lúc đầu, nhưng nhanh về sau không? Sử dụng hàm đa thức hoặc hàm mũ .
  • Bạn có muốn giá trị tăng nhanh lúc đầu, và chậm lại sau không? Sử dụng hàm nth-root hoặc logarit .
  • Bạn có muốn giá trị tăng chậm ở đầu / cuối nhưng nhanh ở giữa không? Hay bạn muốn nó phát triển nhanh chóng nhưng vẫn có giới hạn trên? Sử dụng đường cong sigmoid , chẳng hạn như atan hoặc hàm logistic .
  • Bạn có muốn giá trị dao động? Sử dụng một tội lỗi hoặc một số sóng khác .

Sau đó, chỉ cần tinh chỉnh nó (thêm / nhân thứ, thay đổi giá trị cơ sở, v.v.) cho đến khi cảm thấy đúng. Một máy tính vẽ đồ thị sẽ giúp bạn hình dung cách thay đổi các tham số sẽ ảnh hưởng đến chức năng.


Nhân tiện, các vấn đề bạn đang gặp phải là do tràn số nguyên .

Sử dụng các loại biến đủ lớn để chứa số bạn đang làm việc. Kích thước khác nhau tùy theo nền tảng trong C ++, nhưng sử dụng trình biên dịch Visual Studio unsigned int32 bit, là 32 bit, trong khi unsigned __int64 (dành riêng cho MS) là 64 bit. Cũng xem xét sử dụng a double.

Ngoài ra, hãy cố gắng sắp xếp lại các hoạt động của bạn để bạn không gặp phải số lượng lớn như vậy ở nơi đầu tiên (ví dụ, thay vì MDef * MDef / 110, làm (int)((float)MDef / 110 * MDef)) .


3
Nếu bạn đang chạy vào tràn số nguyên, chuyển đổi thành float - chỉ hỗ trợ đáng tin cậy 24 bit của phần nguyên - sẽ có một bộ vấn đề chính xác khác.

@Joe: Tôi đã quay lại chỉnh sửa của bạn; Tôi đặc biệt lựa chọn __int64hơn uint64_tstdint.hkhông có sẵn trên Visual Studio 2008 và dưới đây, và tôi không muốn nhầm lẫn giữa cậu bé nghèo bất kỳ hơn anh đã là.
BlueRaja - Daniel Pflughoeft

1
@BlueRaja: Tôi không thấy bất kỳ bằng chứng nào mà người hỏi đang sử dụng Visual Studio và nó có mặt trong mọi chuỗi công cụ tiêu chuẩn khác (bao gồm Visual Studio 2010).

Bạn nghĩ rằng bạn cũng đã bỏ qua một biến thể quan trọng: Nếu bạn muốn sát thương có giới hạn trên mà bạn có thể tiến gần đến, nhưng không bao giờ có thể tiếp cận được, bạn có thể sử dụng chức năng sigmoid.
Martin Sojka

1
user127817: Tất cả những gì thực sự quan trọng là cách chức năng phát triển. Đối với phần còn lại, chỉ cần kiểm tra nó cho đến khi nó cảm thấy cân bằng. Nếu bạn cảm thấy nhân vật quá mạnh, hãy giảm sát thương. Nếu bạn cảm thấy mất quá nhiều thời gian để giết một ông chủ hoặc kẻ thù cụ thể, hãy hạ thấp máu hoặc áo giáp của kẻ thù đó. Và như vậy.
BlueRaja - Daniel Pflughoeft

31

Số liệu thống kê nhân vật của tôi bao gồm:

Có vấn đề thực sự của bạn: bạn định nghĩa thống kê của bạn trước khi xác định những gì các số liệu thống kê thực sự có ý nghĩa . Bạn đang đặt xe trước ngựa.

Nhìn vào cách D & D (mặt bàn) hoạt động. "Sức mạnh" không có nghĩa gì cả; nó chỉ có nghĩa là một cái gì đó bởi vì có một quy tắc nói, "Thêm phần thưởng sức mạnh của bạn vào cuộc tấn công cận chiến của bạn." Quy tắc đó là một phần của quy tắc chiến đấu của D & D. Không có các quy tắc chiến đấu, "Sức mạnh" nói chung là một số lượng vô nghĩa.

Câu hỏi đầu tiên bạn cần tự hỏi mình là: tôi muốn có bao nhiêu sự khác biệt giữa các nhân vật? Một lần nữa, hãy nhìn vào D & D. Ở đó, họ có 6 chỉ số cơ bản. Các chỉ số này xác định các kích thước chơi khác nhau cho các nhân vật. Một nhân vật có Độ khéo léo cao sẽ có các tùy chọn khác với một nhân vật có Độ khéo léo thấp.

Nhưng lý do cho sự khác biệt đó thậm chí trở lại quy tắc. Khéo léo cao có nghĩa là tiền thưởng cho các cuộc tấn công tầm xa; bạn có thể đánh thường xuyên hơn với các cuộc tấn công tầm xa. Vì vậy, chỉ giữa Sức mạnh và Khéo léo, bạn có hai chiều chơi: tầm với so với cận chiến.

Trí thông minh và Trí tuệ cũng tạo thành một cái gì đó của một cặp, nhưng những thứ này tương tác nhiều hơn với các lớp cụ thể. Int làm cho Phù thủy và các phép thuật phức tạp khác tốt hơn (hoặc có thể theo một số quy tắc), Trí tuệ rất quan trọng đối với Giáo sĩ và các phép thuật thần thánh khác. Bởi vì các phép thuật thần thánh và ma quỷ có danh sách chính tả khác nhau, hai chỉ số này có liên quan đến các chiều chơi khác nhau.

Bạn cần xác định các quy tắc cơ bản xung quanh các số liệu thống kê trước khi bạn có thể xác định các hàm tăng trưởng và tương tự. Bạn không cần chi tiết cụ thể; bạn không cần phải nói rằng "mỗi điểm sức mạnh được thêm vào cuộn ngẫu nhiên để xác định xem một cuộc tấn công cận chiến có xảy ra hay không." Những gì bạn cần là các quy tắc meta như "khéo léo làm cho kẻ tấn công tầm xa tốt hơn." Bạn có thể tìm ra chính xác làm thế nào nó làm cho chúng tốt hơn sau này.

Có nhiều cách khác nhau để tiến bộ nhân vật. Một mẹo Final Fantasy phổ biến ở trường học cũ là chỉ đơn giản là sử dụng cấp độ của nhân vật như là một phần trong tính toán sát thương của họ. Điều này có thể chỉ đơn giản là nhân cấp độ với chỉ số thích hợp hoặc có thể có nghĩa là áp dụng một chức năng cho cấp độ của nhân vật. Nói, một sự tiến triển bậc hai, để tỷ lệ sát thương của một nhân vật sẽ tăng lên theo mỗi cấp độ.

Tuy nhiên, bạn muốn các chức năng chiến đấu của mình hoạt động, chúng cần phải tính đến sự tiến bộ. Chức năng của bạn cần móc để tiến triển.

D & D có một cách tiến bộ hài hước. Nó là một phần dựa trên lớp học; mỗi khi bạn lên cấp, bạn sẽ nhận được các tính năng mới của lớp và phần thưởng cố định cho cú đánh của bạn, dựa trên lớp nhân vật của bạn. Tuy nhiên, một số tính năng lớp học đã trở nên tốt hơn. Các phép thuật trong D & D sẽ có sự tiến triển được xây dựng trong chúng. Một câu thần chú có thể gây sát thương 1d4 cho mỗi 2 cấp của một phép thuật trên cấp đầu tiên. Vì vậy, mọi cấp độ thuật sĩ khác làm cho phép đó tốt hơn.

D & D cũng đã sử dụng tiến trình dựa trên vật phẩm rất nhiều. Cho đến phiên bản thứ 4, sự tiến bộ dựa trên vật phẩm chủ yếu là để chiến đấu với các nhân vật, nhưng ngay cả trong các phiên bản cũ hơn, các nhân vật chính tả đã có các vật phẩm cho họ các phép bổ trợ hoặc điều chỉnh khác (hoặc bỏ qua cho họ phép thuật).

Vì vậy, các vật phẩm là một thứ khác mà chức năng chiến đấu của bạn cần phải tính đến. Các vật phẩm chỉ cần buff một hoặc nhiều chỉ số trong khi được trang bị, hay chúng cũng làm những thứ khác? D & D hơi kỳ quặc, trong đó chỉ số hiếm khi thay đổi; vũ khí chỉ đơn giản là gây sát thương XdY, có thể với phần thưởng dựa trên một trong những chỉ số của bạn. Và đó là điều đó. Vì vậy, cách duy nhất của bạn để gây sát thương nhiều hơn trong trận chiến là tìm một vũ khí tốt hơn. Trong nhiều game nhập vai trò chơi điện tử, họ tính đến cấp độ ngoài vũ khí.


6
" Có vấn đề thực sự của bạn: bạn đã xác định số liệu thống kê của mình trước khi xác định những chỉ số đó thực sự có ý nghĩa gì. Bạn đang đặt giỏ hàng trước con ngựa. " Tôi rất không đồng ý; bản thân các con số chỉ là một cách để thông báo cho người chơi về sức mạnh của anh ta, v.v ... nó một phần của thiết kế trò chơi. Nếu bạn tiến hành vòng ngược lại, bạn có thể kết thúc với một con trùm cuối với 147 mã lực ... ai thực sự muốn điều đó?
Jonathan Connell

8
Chà, Sarevok (ở Cổng Baldurs) chỉ có 135 HP ...
Martin Sojka

12
@ 3nixios: Có vấn đề gì nếu ông chủ cuối có 147Hp? Điều quan trọng là liệu ông trùm cuối có thách thức, thú vị hay không, và trên hết là phần thưởng cho thất bại. Một ông chủ có nhiều Hp không thú vị; thật là phí thời gian. Một ông chủ có thể gây rối với nhóm của bạn, đòi hỏi những chiến thuật đặc biệt thay đổi từ khoảnh khắc này sang khoảnh khắc khác, đòi hỏi bạn phải sử dụng mọi khả năng bạn có với tiềm năng tối đa của nó, đó là điều tạo nên một ông chủ cuối cùng tuyệt vời. Tôi sẽ đưa ông chủ 147Hp thú vị vượt qua khối Hp nhàm chán bất cứ ngày nào.
Nicol Bolas

@Nicol Bolas Tôi hoàn toàn đồng ý với bạn, tôi đã cố gắng hỗ trợ lý do tại sao tôi tin rằng điểm khởi đầu phải đến từ các số liệu thống kê. Các chỉ số mà người chơi bắt đầu là chỉ dẫn và lối chơi chính mà người chơi chơi trong suốt trò chơi. Tôi đồng ý rằng các thanh HP khổng lồ cho các ông chủ là không cần thiết, nó cung cấp cho người chơi một dấu hiệu tốt hơn về thiết lập tốt nhất để chống lại ông chủ, vũ khí thống kê nào, v.v ... hiệu quả hơn. Số lượng khóa học không liên quan đến cách bạn tính toán, bởi vì bạn chỉ có thể chia hoặc nhân các phép tính cuối cùng của mình cho một hằng số c và được thực hiện với nó.
Jonathan Connell

2
@ 3nixios: Nhưng đó là một phần quan điểm của tôi. Khéo léo trong D & D tồn tại để cho phép phân biệt giữa các nhân vật chuyên gia cận chiến và chuyên gia tầm xa. Nếu không có khái niệm về các cuộc tấn công cận chiến và tầm xa (và trong nhiều game FF chẳng hạn), thì sự khác biệt này sẽ không cần phải tồn tại. Bạn có thể thoát khỏi 5 chỉ số thay vì 6. Xác định phạm vi Hp là một chuyện, nhưng xác định chỉ số cơ bản nào bạn có là một chỉ số khác. Số liệu thống kê yêu cầu các quy tắc trước khi bạn có thể hiểu ý nghĩa của chúng và bạn phải biết bạn dự định làm gì trước khi bạn có thể nói rằng có chỉ số đó là một ý tưởng hay.
Nicol Bolas

22

Công thức của bạn có vẻ khá phức tạp. Tôi không chắc các nhà phát triển game nhập vai chuyên nghiệp xử lý việc này như thế nào, nhưng tôi khuyên bạn nên tập trung vào sự đơn giản. Cố gắng tìm công thức đơn giản nhất có thể mà bạn vẫn có thể kết hợp phạm vi số liệu thống kê bạn muốn sử dụng. Chẳng hạn, bạn có thể có các số liệu thống kê sửa đổi lẫn nhau trước khi tính toán thiệt hại, thay vì sửa đổi thiệt hại trong quá trình tính toán không? Khi bạn đã có một công thức trong đầu, tôi sẽ thử vẽ biểu đồ cho một loạt các giá trị có thể để xem nó sẽ hoạt động như thế nào khi người chơi lên cấp. Rõ ràng là bạn có ít biến số hơn, chúng sẽ khả thi hơn.

Ngoài ra, BlueRaja cung cấp một lời giải thích quan trọng về lý do tại sao bạn có thể thấy các giá trị không mong muốn ở các mức độ chỉ số cao hơn. Sử dụng các loại không dấu và kiểm tra tràn sẽ rất quan trọng.


10
+1 cho đơn giản. Bất cứ ai cũng có thể tạo ra những thứ phức tạp nghiêm ngặt, điều đó không tạo ra một trò chơi hay.
aaaaaaaaaaaa

8
@Randolf trừ khi bạn đang chạy trên Apple 2 hoặc một cái gì đó, rất đáng nghi ngờ rằng việc loại bỏ bội số hoặc chia ở đây và sẽ ảnh hưởng đến hiệu suất theo bất kỳ cách nào có thể đo lường được.
Tetrad

8
@Randolf Một trận chiến lớn trong một game nhập vai có thể có nghĩa là 10 phép tính sát thương mỗi giây, một CPU hiện đại có thể thực hiện vài tỷ thao tác mỗi giây. Bạn có thể giả định một cách an toàn rằng tác động hiệu suất của bất kỳ toán học "có thể nhìn thấy" như vậy là không đáng kể. Đơn giản trong trường hợp này là vì lợi ích của những người thiết kế và những người chơi trò chơi, không phải cho máy tính của chúng tôi.
aaaaaaaaaaaa

6
@Randolf Richardson: Tôi chỉ nghĩ rằng bạn có thể thiếu mục tiêu một chút trong trường hợp này. Đối với MMO, giao thức không béo nhanh tốt là điều tối quan trọng và các nhiệm vụ nặng nề như vật lý cần phải được thiết kế với hiệu suất trong tâm trí. Nhưng tính toán thiệt hại là lối chơi cốt lõi, nó nên được thiết kế với lối chơi trong tâm trí, nếu bạn mang những lo ngại về hiệu suất vào một câu hỏi như vậy, bạn có nguy cơ làm tổn hại đến phần trò chơi. Nói về hiệu suất khi nó quan trọng, bạn có nguy cơ tạo ấn tượng rằng đây là một lĩnh vực quan trọng để tối ưu hóa, do đó đánh cắp sự chú ý từ những kẻ tội lỗi hiệu suất thực sự.
aaaaaaaaaaaa

5
@Randolf: Tôi không ngụ ý gì cả; Tôi đang nói rằng tối ưu hóa một cái gì đó không phải là nút cổ chai là một sự lãng phí thời gian.
Nicol Bolas

11

Enemy HP vào cuối game thường sẽ ở hàng triệu người thấp hơn (với một siêu trùm có tối đa ~ 12 triệu).

Điều này tôi có một vấn đề với. Bạn nên xây dựng các ông chủ của mình xung quanh những gì bạn nghĩ rằng người chơi của bạn sẽ có thể xử lý. Bạn đang xây dựng các cầu thủ của mình và công thức chiến đấu xung quanh những gì bạn muốn các ông chủ của mình sẽ như thế nào.

Khi bạn đã xây dựng cơ chế chiến đấu và vai trò của mình, sau đó bạn có thể quyết định cách bạn muốn thiết kế các ông chủ của mình vì nó phải là sự cân bằng tốt giữa thiệt hại mà người chơi có thể gây ra / hấp thụ so với những gì ông chủ có thể gây ra / hấp thụ.


4
+1 sức khỏe của kẻ thù nên dựa trên những gì người chơi có thể xử lý hợp lý tại thời điểm đó, chứ không phải theo cách khác.
BlueRaja - Daniel Pflughoeft

7

Những con số bạn trích dẫn có khả năng xuất phát từ việc chỉ điều chỉnh một mô phỏng, qua hàng ngàn lần chạy.

Vì vậy, bạn nên viết một mô phỏng tạo ra một nhân vật cấp 20, và xem cách anh ta vượt qua 200 trận chiến hoặc chống lại các loại kẻ thù mà anh ta sẽ chiến đấu vào thời điểm đó. Làm lại cho một nhân vật cấp 30 (có lẽ là phần tiếp theo của thế giới).

Sẽ mất một chút thời gian để làm đúng, nhưng viết mô phỏng tự động chắc chắn sẽ giúp việc này dễ dàng hơn nhiều so với việc chỉ đoán và phát thủ công.


5

Tôi nghĩ rằng bạn đã phạm sai lầm rằng bạn muốn tạo ra một công thức mà không có một thiết kế phù hợp trong tâm trí.

Đầu tiên bắt đầu với một thiết kế, sau đó bắt đầu suy nghĩ về việc thể hiện thiết kế trong các công thức. Thiết kế của bạn càng rõ ràng thì càng dễ tìm thấy các công thức đơn giản và / hoặc chính xác.

Cố gắng thực hiện "các loại" kẻ thù, ví dụ "bọc thép" => một cuộc tấn công của người chơi nếu nó thuộc loại vật lý bị giảm 50%. Đừng biến một trận chiến thành trừu tượng, hãy nghĩ về những gì có liên quan và những gì không.

Nếu thiết kế của bạn nói "kẻ thù bọc thép" yếu chống lại ma thuật nhưng mạnh chống lại sát thương vật lý, hãy thể hiện điều đó bằng mã. Nhưng hãy nhớ rằng bạn đã thực hiện nhiều thử nghiệm, vì các giá trị sẽ không hoạt động một cách kỳ diệu ngay lần đầu tiên bạn viết mã. Cố gắng tạo một thiết kế, đặt logic vào mã, luôn kiểm tra xem đây có phải là biểu diễn kỹ thuật của những gì bạn có trong đầu không và liệu nó có thay đổi giá trị cho đến khi nó không.


Tôi đã bao gồm thứ đó - thứ hạng áo giáp giảm bớt sát thương vật lý trừ khi đòn tấn công được gắn cờ là xuyên giáp hoặc sử dụng công thức sát thương dựa trên%
127817

5

Mặc dù thiết kế của tôi chưa rời khỏi giai đoạn Bảng tính, tôi đã đi đến một kết luận về việc thiết kế toán học cho RPG:

Giữ chúng đơn giản nhất có thể. Trong thiết kế mà tôi đang làm việc, tôi đã sử dụng các công thức rất đơn giản, phù hợp với hệ thống bán lớp. I E. Fireball Spell có sát thương 30. Diễn đàn là:

BaseSpellDamage * Attribute (5 * 6)

Chúng tôi cũng có thể thêm các sửa đổi như thế này:

Result = (BaseSpellDamage * Attribute) (5*6)
Result = Result + (Result * 50%) (30 = 30 + (30 * 50%))

Vì vậy, kết quả cuối cùng sẽ là 45 thiệt hại. Tôi thấy rằng sử dụng hệ số nhân trước là rất dễ dàng và giải pháp rất có thể mở rộng để làm việc. Thay vì đến với một số số lẻ với toán học phức tạp để tìm ra kết quả mà chúng ta muốn.

Bây giờ chúng ta có thể điều chỉnh lại khả năng gây sát thương, điều đó sẽ giúp phòng thủ chống lại loại sát thương. Có hai cách tiếp cận và tôi thực sự chưa quyết định cái nào phù hợp hơn, nhưng cả hai đều đơn giản và khả thi:

DamageResult = Resistance * Damage ( 50% * 45)

Vì vậy, kết quả cuối cùng sẽ là 22damage được thực hiện (tôi chỉ cắt kết quả một phần).

Công thức khác:

DamageResult = Damage - Resistnace (45 - 22).

Vì vậy, kết quả cuối cùng sẽ là 23. Nếu xảy ra rằng lực cản lớn hơn sát thương gây ra thì nhân vật sẽ không nhận được bất kỳ thiệt hại nào. Tất nhiên tùy thuộc vào bạn để đảm bảo rằng tình huống như vậy không có chỗ, ngoại trừ khi bạn muốn nó là trường hợp.

Mặc dù tôi phải thừa nhận rằng quy mô tiền lệ có phần dễ dàng hơn để cân bằng và quy mô. Nhưng điều này cũng phụ thuộc vào số cơ sở của bạn. Chia tỷ lệ chính xác sẽ hoạt động tốt nhất nếu bạn bắt đầu từ 100 trở lên. Nếu bạn đang hoạt động với số lượng nhỏ (bất cứ điều gì dưới 100 thành thật), điều đó có thể trở nên tồi tệ vì bạn sẽ bắt đầu nhận được kết quả dấu phẩy động, điều đó sẽ khó cân bằng và thực sự làm bất cứ điều gì thú vị với chúng.

Có lẽ giải pháp tối ưu trong trường hợp đó là sử dụng cả hai phương pháp khi họ thấy phù hợp. Hoặc nếu bạn là fan hâm mộ của số lượng lớn bắt đầu từ 1000.

Và khi kết thúc. Tôi đã không tự mình đi đến kết luận này. Tôi thực sự đã dành khá nhiều thời gian để đọc các hướng dẫn sử dụng RPG khác nhau (Hero, DnD). Đặc biệt, Ddo rất hữu ích, vì nó hoạt động theo các nguyên tắc tương tự nhưng thay vì các thuộc tính mà nó sử dụng các cấp cho công thức của nó, đôi khi chúng có thể phức tạp hơn. Hơn những gì tôi trình bày ở đây.

Trong mọi trường hợp, lời khuyên tốt nhất là: cố gắng giữ chúng đơn giản nhất có thể. Không sử dụng bất kỳ toán học nâng cao hoặc phương trình dài nào, vì chúng dễ bị lỗi, rất khó phát hiện, khi bạn phải giải quyết 87234 việc khác cùng một lúc.


3

Như những người khác đã đề cập, công thức Final Fantasy X khá phức tạp. Nói chung đối với loạt trò chơi đó càng muộn, công thức càng phức tạp. Có lẽ dễ dàng hơn để căn cứ công thức sát thương của bạn vào một trò chơi khác hoàn toàn. Nhưng nói chung, tôi nghĩ rằng đáng để thảo luận từ cấp độ chung chung về loại công thức thiệt hại bạn có thể tìm thấy trên thế giới và cách bạn có thể tạo một trò chơi dựa trên chúng. Điều đầu tiên bạn cần quyết định là mức độ thiệt hại mà bạn muốn có thể gây ra vào cuối trò chơi, và bạn muốn người chơi có thể có những chỉ số nào? Khi bạn đã có điều đó, bạn có thể chọn một hệ thống công thức, sau đó tối ưu hóa công thức và giá trị vũ khí để phản ánh các phạm vi đó theo thời gian.

Hoàn toàn dựa trên Stat

Đây là một ý tưởng tốt nếu bạn muốn nhân vật của mình linh hoạt về mức độ kẻ thù mà họ có thể thách đấu. Một công thức như thế này sẽ chỉ phụ thuộc vào chỉ số của người chơi, trang bị của họ và chỉ số của kẻ thù. Những công thức này thường khá đơn giản. Final Fantasy Legend II (Xem http://www.shenafu.com/ffl2/weapon.php chẳng hạn, có vũ khí gây sát thương dựa trên công thức đơn giản:

(Stat+StatBonus)*WeaponStrength - Defense*4

Một công thức như thế này là tốt nếu bạn muốn một phương pháp ước tính thiệt hại rất đơn giản, hoặc một điểm xuất phát nhanh để sửa đổi thiệt hại dựa trên các yếu tố khác như kỹ năng và điểm yếu của nguyên tố.

Để cho thấy loại công thức này thực sự có thể phát triển đến mức nào, hãy xem xét công thức thiệt hại cho Lạm phát RPG, một trò chơi Android và IOS (Xem http://inflation-rpg.wikia.com/wiki/Calculations ). Công thức phụ thuộc rất nhiều vào cả stat và thiết bị. Mỗi thiết bị có hai chỉ số - phần thưởng cho chỉ số ATK và giá trị nhân. Một số thiết bị có số nhân thấp, nhưng tiền thưởng cao, số khác có tiền thưởng thấp nhưng số nhân cao. Đối với một nhân vật chỉ có 10 ATK, Battle Axe có 5000 ATK Bonus nhưng hệ số nhân thấp 145% là một lựa chọn tuyệt vời. Tổng thiệt hại là (10+5000)*1.45 = 7264, nhưng Estoc, với 0 điểm thưởng và hệ số nhân 300% là một lựa chọn kém - thiệt hại là (10+0)*3 = 30. Sau đó trong game, một nhân vật có 5000 đòn tấn công sẽ thích chuyển vũ khí.

Thống kê và dựa trên cấp độ:

Một ví dụ điển hình cho điều này là Final Fantasy V, VI và Final Fantasy XII ( ví dụ: xem http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 ). Công thức cho kiếm trong FFXII là:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+STR)/256]

và công thức thiệt hại cho các staves là:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+MAG)/256]

Chúng rất giống nhau, nhưng lưu ý rằng công thức kiếm chỉ phụ thuộc vào sức mạnh và cấp độ, trong khi công thức nhân viên phụ thuộc vào sức mạnh, ma thuật và cấp độ. Ưu điểm của loại công thức này là cho phép người chơi hai con đường phát triển - xây dựng chỉ số của họ, hoặc xây dựng cấp độ của họ. Nhược điểm là nó cũng phạt nhân vật cả hai cách. Điều này thực sự kết thúc là cho phép người chơi tăng cấp để tăng lượng sát thương của họ (đối với FFXII, số tiền này tăng thêm 4% sát thương mỗi cấp quanh cấp 50 khi bạn tăng chỉ số) để giúp tùy chỉnh độ khó theo mức độ thoải mái.

Sửa lỗi:

Công thức sát thương cố định không phụ thuộc vào chỉ số hoặc cấp độ của nhân vật, chúng chỉ phụ thuộc vào công thức sát thương bên trong của chính vũ khí. Chúng vẫn có thể thay đổi trong một phạm vi, nhưng chúng gây sát thương tương tự bất kể người dùng (cấm mọi hiệu ứng đặc biệt hoặc đặc điểm nhân vật khác). Chúng được sử dụng tốt nhất nếu vũ khí sẽ gây sát thương cố định và khả năng trang bị vũ khí phụ thuộc vào chỉ số và / hoặc cấp độ. Diablo 2, ví dụ, làm điều này, cũng như nhiều roguelike có vũ khí phụ thuộc vào cuộn chết. Điều đó đang được nói, 'thiệt hại cố định' không không bao hàm sự "phi ngẫu nhiên" - và trong thực tế có thường một số yếu tố ngẫu nhiên đến những thiệt hại thực hiện.

Đây là một phương pháp tốt nếu bạn muốn có vũ khí dễ dàng chuyển giữa các nhân vật hoặc kiểm soát cẩn thận đầu ra thiệt hại mà các nhân vật tại một số điểm nhất định trong trò chơi có thể làm nếu bạn biết họ có quyền truy cập vào thiết bị nào (thông qua bảng thả, rương và ăn cắp bảng).

Một nơi khác bạn sẽ gặp phải điều này là với một số loại thiết bị hoặc vật phẩm nhất định trong Final Fantasy. Ví dụ, 1000 kim luôn gây sát thương 1000. Trong Final Fantasy Legend II, võ thuật gây sát thương dựa trên công thức:

Damage = WeaponStrength*(90-UsesLeft) - 4*Defense

Final Fantasy XII cũng có phần sát thương cố định cho súng, gây sát thương theo công thức:

DMG = [ATK x RANDOM(1~1.125)]^2

Mặc dù thiệt hại có phần ngẫu nhiên, nhưng nó chỉ thay đổi 26,5 phần trăm trên tổng phạm vi, do đó, bạn được đảm bảo trung bình gây ra một mức độ thiệt hại nhất định theo thời gian. Những kiểu tấn công này rất hữu ích cho các nhân vật có cả chỉ số thấp và cấp độ thấp trong các trò chơi thường chiếm các yếu tố đó trong việc gây sát thương. Thêm vào đó, họ bỏ qua việc phòng thủ của mục tiêu (mặc dù công thức có thể dễ dàng được làm lại để phù hợp với phòng thủ nếu bạn muốn).


2

tất cả các trò chơi trong loạt phim giả tưởng cuối cùng đều có chỉ số 255 vì vấn đề bạn gặp phải. ở cấp 100 chỉ số sẽ là 255.

bạn nói về việc tăng chỉ số với khả năng và trang bị và tôi nhớ đã thấy điều này trong các trò chơi nhưng cách thức thực hiện là trong công thức. có thêm một bước kiểm tra khả năng và sửa đổi thiết bị và áp dụng chúng sau khi sử dụng số liệu thống kê.

trong trường hợp của bạn, đó sẽ là bước 21: áp dụng công cụ sửa đổi khả năng bước 22: áp dụng công cụ sửa đổi thiết bị bước 23: thiệt hại cuối cùng.

nếu bạn quan tâm google cho các công thức tưởng tượng cuối cùng, chúng ở ngoài đó. Tôi có các bản sao của cơ chế chiến đấu thực tế bao gồm AI cho tưởng tượng cuối cùng 4, 6, 7 và 9. mọi người đã bẻ khóa chúng từ các trò chơi gốc khi chúng đang tạo ra các bản rom cho trình giả lập. Không có gì khó tìm nếu bạn trông đủ cứng.

điều lớn nhất để tạo công thức là thử nghiệm. thiết lập một kịch bản để điều hành trận chiến của bạn với ai cả hai bên và điều hành hàng trăm trận chiến. thay đổi quái vật và các chỉ số và xem nếu nó hoạt động hoặc nếu lv 40 giết chết mọi thứ, hoàn toàn có khả năng một ông chủ thực sự không thể giết được lol. một mẹo sẽ là tắt tất cả hoạt hình vì thật ấn tượng khi AI có thể chiến đấu nhanh như thế nào khi không có ai xem.


2

Tôi đã tự hỏi làm thế nào để mọi người thực sự phát triển các công thức thiệt hại thích hợp có tỷ lệ chính xác?

2 điều đầu tiên là:

  • quyết định ý của bạn là 'chính xác' - ý tưởng của bạn về 'thiệt hại chính xác' là gì?
  • quyết định ý của bạn theo 'tỷ lệ' - những giá trị nào sẽ thay đổi và bạn muốn những thay đổi đó có ảnh hưởng gì?

Khi bạn biết điều đó, bạn có đủ thông tin để sử dụng các công thức toán học mà BlueRaja đã đề cập trong câu trả lời của mình . Chỉ cần nhớ rằng không có thứ gọi là công thức sát thương 'phù hợp' - chỉ là một công thức phù hợp với thiết kế của bạn cho loại trải nghiệm mà bạn muốn người chơi của mình có.


Đây là một bình luận cực kỳ không có ích. Nó tổng hợp thành "Tôi không biết" và vì điều đó là lãng phí thời gian của mọi người. Cờ để xóa.
Krythic

1

thay vào đó, nếu bạn đang tìm kiếm một công thức rất đơn giản, hãy làm như sau:

(Lưu ý rằng đây là ý tưởng của tôi cho một công thức,)

Đầu tiên, đối với một công thức tấn công đơn giản, bạn sẽ chỉ cần một vài chỉ số. Chỉ số Tấn công của người chơi (đây có thể là Sức mạnh hoặc Phép thuật, tùy thuộc vào loại di chuyển.)

Sau đó, tạo một biến, được gọi là MovePower. Điều này sẽ phụ thuộc vào việc di chuyển và di chuyển tốt hơn sẽ có MovePower tốt hơn. Đối với công thức của tôi, các lệnh "Tấn công" chung có MovePower là 5.

Sau đó, làm cho hệ thống phòng thủ trở thành một chỉ số dựa trên phần trăm, (và tất nhiên, làm cho nó không thể đạt được 100% phòng thủ về thiệt hại)

Sau đó, trong giai đoạn tấn công, chỉ cần nhân chỉ số tấn công bằng sức mạnh di chuyển và loại bỏ thiệt hại dựa trên phòng thủ của kẻ thù! đơn giản!

Bạn cũng có thể chọn để có các sửa đổi khác, như nếu di chuyển sẽ đạt (Độ chính xác), nếu di chuyển có thêm hiệu ứng khác (Bio, gây độc,) và chọn để đánh, (Chính xác lại,) có nâng cấp / hạ cấp sát thương di chuyển mà thay đổi số liệu thống kê, ect. Hãy vui vẻ với nó!


Một tùy chọn khác để tránh áo giáp là một vấn đề phần trăm (do đó cho phép các giá trị của nó trông giống nhau) là tính toán thiệt hại so với áo giáp khi so sánh trở thành số nhân. Một cái gì đó như Ln (atk / def) làm cơ sở. Điều này cho phép các chỉ số áo giáp phòng thủ mở rộng theo thời gian. Tìm hiểu làm thế nào để có được phạm vi sát thương mong muốn cơ bản của bạn khi chỉ số sát thương và giáp giống nhau và ngoại suy từ đó. Điều này thực hiện các cuộc tấn công "tránh áo giáp" đòi hỏi một mẹo để tạo ra, nhưng đó là một phần của sự sáng tạo dành cho.
Aviose

1

Về bản chất, bạn cần phải tìm ra hai điều.

  1. Làm thế nào để tính toán phôi đúng với số lượng lớn.
  2. Làm thế nào bạn muốn và mong đợi thiệt hại tấn công để hành xử chống lại các đối thủ yếu hơn và mạnh hơn.

1

Bạn có thể sử dụng doublehoặc một thư viện số lượng lớn. Thực hiện tính toán với số lượng lớn (như trong các trò chơi nhấp chuột / nhàn rỗi thường dựa vào các thư viện số lượng lớn như vậy). Trong trường hợp của bạn, các số tương đối nhỏ nên sử dụng dấu phẩy động 64 bit sẽ cho phép sự linh hoạt cần thiết.

2

Bạn muốn trò chơi ứng xử như thế nào? vài ví dụ:

  • Một cách tiếp cận là sử dụng ATKđể quyết định xem bạn có đánh hay không và lăn một con chết với chỉ số sát thương đã biết tùy thuộc vào vũ khí: ví dụ như kiếm dài 1d8, kiếm hai tay 1d10, dao găm 1d4. Điều này sẽ không mở rộng đáng kinh ngạc nếu hp có thể phát triển liên tục. Nếu bạn sử dụng ATKđể xác định xem các nhân vật đánh hay bỏ lỡ, bạn có thể thực hiện một cú ném khác sau khi đánh thành công với ATK* 80% để xác định crits.
  • Nếu bạn muốn sử dụng công thức sát thương, công thức gây sát thương có thể đơn giản như (ATK - DEF) +/- 20%được thực hiện trong Thế giới cuối (một game chiến thuật RPG). Điều này có nghĩa là các cuộc tấn công chống lại một đối thủ mạnh DEFkhông thể gây sát thương. Đối với instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2và nó cũng có nghĩa là tấn công cao vs def hơi thấp hơn, có thể làm thiệt hại ít, có khả năng làm cho cuộc chiến lâu hơn với tăng HP. Ví dụ với ATK = 1010, ENEMY DEF = 1005thiệt hại sẽ là 5. Thiệt hại cũng sẽ tăng đáng kể nếu ATKtăng thêm một tỷ lệ nhỏ. Chẳng hạn ATK = 1055, sẽ gây thêm sát thương 900% chỉ với mức tăng% 5 về ATKgiá trị.
  • Để tránh điều này, bạn có thể làm một cái gì đó như ATK / DEF * WEAPON_DAMAGEĐiều này sẽ mở rộng dần dần khi ATKhoặc DEFđược tăng lên và cho phép kẻ tấn công yếu gây sát thương cho một sinh vật mạnh DEF.

tl; dr Bạn cần xử lý các con số của mình một cách có trách nhiệm và tìm ra cách bạn muốn trò chơi hành xử trong các tình huống khác nhau. Một số câu hỏi để tự hỏi:

  1. Cần bao nhiêu đòn tấn công (lượt), để đánh bại tên trùm / tay sai đó?
  2. Làm thế nào các kỹ năng khác nhau, buff, debuff ảnh hưởng đến xtrận chiến? Có nên vô vọng, nên chiến thắng sẽ y%ít hơn / nhiều khả năng?
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.