如何防止小的数字优势主导相遇的平衡?


27

我一直在玩游戏,并且在某些事情上遇到了很多麻烦:

我有两个字符,每个字符都有一个属性(大约10个),范围在1到20之间。我想使用这些属性来生成“掷骰”,以使较高的掷骰赢得该特定的遭遇。值得注意的是,两个字符不是互相损害/防御。他们俩都在滚动查看他们是否通过了我认为可以称为技能检查的内容。他们都在为一个共同的价值通过/失败。他们不会互相影响。

但是,当其中一个字符的数值优势很小时,我想出的任何公式都可以使优胜劣汰的字符在绝大多数时间内获胜。这是不希望的。

我尝试将测试的“最相关”属性的权重设置为80%,将其他属性的权重设置为20%。我还尝试比较平均值以产生相对差异,并使用该差异来增强较弱的性格。两种方法都带来了我要消除的显着优势(例如,如果我将遭遇5000次,则经常会在一侧赢得全部5,000次胜利)。

看起来,添加“运气”组件仅是重要的,如果以某种方式加权了它以偏爱较小的角色,并且我在那里还没有达到一个好的平衡。

我可以采取什么方法来钝化小的数值优势的影响,但是当属性的相对差距增加时仍然保留并增加该优势?


根据要求,以下是我到目前为止的详细信息。有些事情我还没有弄清楚,所以它们仍然是概括性的:

目前,该滚动生成为

0.8 * (mainAttribute) + 0.2 (1/3 * subAttA + 1/3 * subAttB * 1/3 subAttC)

目前,这将产生4.0附近的数字。属性是在指定范围之间随机生成的。当前的测试使用一个字符,其属性从2到4,对手在3到5之间。可以预见,这将分别产生接近3和4的平均值。

凭借这一单点优势,我希望看到55%到60%的时间里两次获胜者中的优势者,这种优势将扩大到大约80%的时间,而平均属性优势为5或6,在7或8的优势下为90%,当差距越来越大时,留下了一些不太可能获胜的空间。我不希望再也不能保证有胜利,但是也许事情变得不太可能了-当差距变得非常大时,赢得99.5%或99.6%的声音。

当前公式产生一个非随机数。随机性来自对哪些属性相关的选择。不是全部每个卷都使用属性。一个总体上较弱的人有可能在与该掷骰相关的领域中更强,并赢得胜利。但是,可以预见的是,这种情况很少发生。

我的下一个尝试是权衡它们的相对优势,方法是取每个人的所有属性的平均值,将它们彼此相除,然后使用该值对次要角色有所帮助。这样可以使情况稍微好一些,但是仍然有明显的趋势,在5,000次尝试中,一个人可以赢得5,000次胜利。


2
您说“已生成角色”,但随后发布了一个公式,该公式将始终生成固定数字。随机性在哪里?
菲利普

1
因此,如果我对您的理解正确,那么游戏机制中唯一的随机性就是对主要属性的随机选择?
菲利普

2
但是正如@Philipp所暗示的,那么5000次尝试将产生完全相同的结果吗?还是您每次模拟都会生成新属性
Felsir '16

1
如果两个人之间没有互动,那么其中一个会如何取胜?这里似乎缺少一些数据?
Erik

1
每个人产生的掷骰与他们要达到的目标进行比较。如果一个人到达了而另一个人没有到达,那一个就赢了。如果他们两个都达到了,则两个获胜者中的较高者。如果两者均未达到,则均无意义。在平局中,他们平分秋色。“不互动”,我的意思是传统意义上的不互相殴打或防御,因为那是一些最初讨论的地方。
ffenliv

Answers:


36

方法的问题在于,您在决定主要属性时就决定了战斗结果。当您有4个主要统计数据时,而战斗机仅在其中一个统计数据中表现更好,则无论实际差异有多大,他们的获胜几率始终为1比4。当您想要更细粒度的结果时,您需要更细粒度的随机性。

首先,我认为您可以保留对main属性的随机选择,也可以根据需要保留公式。这个数字代表了这个战斗员在这次特定遭遇中所拥有的优势。对于本文的其余部分,我将其简称为power

我在很多游戏中使用的一种方法,当在确定性的两件事之间进行决斗时,对我很有用,一种方法power是在两者之间0以及power在两者之间滚动一个随机浮点数,然后看看谁滚动得更高。这是此方法的预期结果的列表。百分比不是计算出来的,而是通过每个组合进行100000次打斗和迭代计数并计算赢得频率的人来实验产生的:

PowerA | PowerB | Win chance of A
  9    |   1    |    94.5%
  8    |   2    |    87.5%
  7    |   3    |    78.6%
  6    |   4    |    66.6%
  5    |   5    |    50.0%
  4    |   6    |    33.3%
  3    |   7    |    21.5%
  2    |   8    |    12.5%
  1    |   9    |    5.5%

关于此算法的好处是,无论您处理多少数字,它都可以缩放。0.3与0.7的机会与3与7、300与700或3,000,000,000与7,000,000,000的机会相同。

如果您的口味仍然难以预测,则可以通过为每个战斗人员滚动多个随机数并将其相加来使战斗更加可预测。由于大数定律,许多随机事件将平均并导致更可预测的结果。这是具有不同迭代次数的表。

| A | B | Iterations
|   |   |       1 |     2 |     3 |     4 |     5 |     6 |     7 |     8 |     9 |
-----------------------------------------------------------------------------------
| 9 | 1 |   94.5% | 99.3% | 99.9% |100.0% |100.0% |100.0% |100.0% |100.0% |100.0% | 
| 8 | 2 |   87.4% | 96.3% | 98.8% | 99.5% | 99.8% |100.0% |100.0% |100.0% |100.0% | 
| 7 | 3 |   78.7% | 89.2% | 94.0% | 96.6% | 97.8% | 98.9% | 99.2% | 99.6% | 99.7% | 
| 6 | 4 |   66.8% | 74.3% | 79.2% | 82.9% | 85.7% | 88.0% | 89.9% | 91.2% | 92.5% | 
| 5 | 5 |   50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 
| 4 | 6 |   33.6% | 25.6% | 20.9% | 17.1% | 14.7% | 12.0% | 10.2% |  8.9% |  7.5% | 
| 3 | 7 |   21.4% | 10.7% |  6.0% |  3.5% |  2.0% |  1.2% |  0.7% |  0.4% |  0.3% | 
| 2 | 8 |   12.7% |  3.7% |  1.2% |  0.4% |  0.1% |  0.1% |  0.0% |  0.0% |  0.0% | 
| 1 | 9 |    5.5% |  0.7% |  0.1% |  0.0% |  0.0% |  0.0% |  0.0% |  0.0% |  0.0% | 

上表中100%和0%的结果是由于四舍五入而产生的一种幻觉。除非power非战斗人员的恰好为0,总有可能获胜。在上面的测试中它只是没有发生,因此您可以期望它低于1:100000。

您可能还会注意到一些细微的不正常现象,这可能归因于java.lang.Random的情绪波动,当您使用其他种子再次运行代码时可能不会出现。

我用来生成此表的程序(Java)。

public class Main {

    private static Random random = new Random();
    private static final int SAMPLES = 100000;

    public static void main(String[] args) {        
        for (int i = 1; i < 10; i++) {
            double powerA = 10.0 - i;
            double powerB = i;
            System.out.print("| ");
            System.out.print((int)powerA);
            System.out.print(" | ");
            System.out.print((int)powerB);
            System.out.print(" |   ");

            for (int iterations = 1; iterations < 10; iterations++) {
                int wins = 0;
                for (int j = 0; j < SAMPLES; j++) {
                    if (fight(powerA, powerB, iterations)) wins++;
                }
                System.out.print(String.format("%2.1f", 100.0 * (double)wins / (double)SAMPLES));
                System.out.print("% | ");
            }
            System.out.print("\n");
        }       
    }

    private static boolean fight(double powerA, double powerB, int iterations) {        
        double sumA = 0.0f;
        double sumB = 0.0f;     
        for (int i = 0; i < iterations; i++) {
            sumA += random.nextDouble() * powerA;
            sumB += random.nextDouble() * powerB;

        }       
        return sumA > sumB;
    }
}

如果您想在游戏中使用此代码,则该代码已由Sam Hocevar发布的WTF Public License Version 2许可


这是一个有趣的方法。在我的一些尝试中,我几乎做到了这一点。我将其连接起来并尝试一下。非常感谢。
ffenliv

10
您第一个表格中的百分比可以完全按照计算1 - powerA / ( 2 * powerB )
凯尔(Kyle)

2
@Kyle只能使用powerA < powerB。一旦powerA变大,您需要切换到powerB / (2 * powerA)
Dorus's

1
我不确定StackExchange ToS是否会让您偏离内容和代码的强制性站点许可证,即使您的许可证比其许可更宽松。当然,不可能找到是提议的MIT还是CC。
Lars Viklund

5
@LarsViklund您正在这里开始主题外的讨论,但是不,这是不正确的。stackexchange的许可是非排他性的,这意味着我仍然可以在任何其他许可条款下随意放弃我的知识产权。我的贡献是CC-BY-SA(由Stackexchange授权)和WTFPL双重授权的。您可以选择在哪种条件下使用我的捐款。
菲利普

13

您的错误是使用“基于骰子”的方法。您在计算机上,可以使用任何喜欢的系统。制作一张表格,将值的差异转化为获胜的百分比机会,然后您可以将值设置为绝对喜欢的任何值,例如

Difference (A-B) | %chance A wins
-----------------|---------------
+5 or greater    | 100%
+4               | 95%
+3               | 85%
+2               | 70%
+1               | 55%
0                | 50%

(您只需要做一半的表,只需始终选择A作为具有较高统计信息的表)

显然,这些数字仅是示例,您可以按照自己喜欢的任何分布进行设置。


2
尽管我目前正在使用基于公认答案的系统,但这非常简单,并且可能对我来说是一个很好的解决方案。我知道StackExchange对我来说会很好。
ffenliv

5

老实说,从游戏机制的角度来看,这是一个非常深刻的问题。但是有些事情可能会有所帮助。

首先,这就是为什么大多数游戏都有单独的命中和伤害成分的原因,其中有一个“掷骰”来查看您是否受到伤害,然后是针对给定角色的伤害表或范围的“掷骰”。这也会导致某些类型的标准原型,您可能拥有较小,较快的角色,但命中点较少但造成的伤害更大(玻璃大炮法师,某些类型的流氓),而装甲较大的角色则受到的伤害较小(坦克,战士)。

这会导致自然平衡,较小的角色可能会很脆弱,但避免由于敏捷类型的能力而被频繁击中,并且还会通过造成更大的伤害(法术或对敌人造成伤害的毒药效果)来平衡游戏场时间)。战车的速度可能较慢且命中率更高,但通常有很大的生命值或生命值要维持,但是每次命中造成的伤害往往较小(或每秒造成的伤害)。

这些背景是为什么许多游戏会持续平衡武器,等级和统计数据。《魔兽世界》,《命运》,《暗黑破坏神》,《战地风云》:任何类型的游戏中,任何类型的游戏通常都需要经过一段时间的平衡和调整。

这可能不是直接的答案,但您确实要求一般性的想法。因此,我们还要评估游戏系统。

这些属性如何起作用?如果其他所有条件都是平等的(没有原型,没有装甲,没有更好的武器等等),那么任何微小的收获都绝对有可能使事情变得很有利于一方。虽然增加战斗力会使任何系统复杂化,但它也提供了更大的灵活性。


顺便说一句,我认为这是一个很好的问题,可能导致一些非常有趣的游戏机制讨论。这可能最终会变成基于观点的观点,因此,请注意此类切线(此游戏比此游戏要好,等等),这一点很重要,但是随着更多人发布,其中涉及的一些基本原理可能会有所启发。
杰西·威廉姆斯

有趣的是,我确实先做了一个“打击”和“损坏”机制,但是由于我不再记得的原因而报废(只是昨天。我的记忆有点……很差)我应该清楚,角色没有互相攻击/防御。没有损坏组件。这是一项技能检查,将两者对照一个共同的值进行检查,以查看掷骰是否“通过”。.相互竞争的两者之间没有交互作用。
ffenliv

2

有两件大事。

首先,请记住您在计算机上。您可以创建所需的任何系统。无需限制自己进入d20掷骰,尽管这对于玩家来说很容易理解。像滚动6 d6骰子之类的事情在计算机上很容易,并且随机结果更少。

其次,看一下诸如D&D之类的其他系统,很明显,它们只是在很大程度上抑制了属性的作用。与其让您的基本统计数据添加其价值的80%到规则,不如按比例缩小它并使它的添加更加微妙。例如,在D&D中,如果您具有18的敏捷性,那么您的装甲等级只会得到4点加值。

简而言之,从数字上来说,您需要做的就是缩小域以更好地适应您的范围。但从质上来说,我认为考虑其他系统,并提出一些数学上似乎较少的东西,将会为玩家提供一个更令人满意的系统。


1d20或6d6或5d4-结果或多或少是随机的,您只需更改范围。随机是随机的。缩小范围和域不足以平衡系统。可能只会花更长的时间。
杰西·威廉姆斯

8
@JesseWilliams并非如此。1d20有相等的机会获得任何可能的值。随着5D4,你更可能多获得12或13比你得到一个20
罗布·沃茨

多次滚动还可以掩盖数字生成器中的缺陷,因此在计算机上尤其重要。实际上,将卷按位进行组合几乎是许多生成器的基础。
Yudrist '16

我站得住了。
杰西·威廉姆斯

3
@RobWatts仍然不是或多或少是随机的,只是一种不同的分布。拥有有关先前“滚动”的信息并不能使您对未来的结果做出更好的预测(忽略RNG中的缺陷),因此它是随机的。
chbaker0

1

怎么样:向所有相关属性添加一个常量,例如1000。然后,相对差异变得很小。


1

知道你的号码

Philipp的答案增加一点,即rand [x]与rand [y]的比较可能并不总是能产生预期的结果。在表格下方,我们将A与B进行比较。A和B的值均为1 ... 10。我们以两种方式进行比较(注意:在这种情况下,rand()会生成整数,即rolls):

  1. rand [A]> rand [B]
  2. rand [A]≥rand [B](即大于或等于)

另外我们比较

  1. rand [A * 1000000]> rand [B * 1000000]
    (在这种情况下,是>还是≥无关紧要,因为它们是如此接近)。这些大数字在括号内。

单元格保留%的值。每个结果保留一百万次迭代(使用Dyalog APL进行)。

┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐
 A      B  1 (1000000)│ 2 (2000000)│ 3 (3000000)│ 4 (4000000)│ 5 (5000000)│ 6 (6000000)│ 7 (7000000)│ 8 (8000000)│ 9 (9000000)│10(10000000)│
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 1 (1000000)│ >0(50) 100  >0(25) 50  >0(17) 33  >0(13) 25  >0(10) 20   >0(8) 17   >0(7) 14   >0(6) 13   >0(6) 11   >0(5) 10
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 2 (2000000)│>50(75) 100 >25(50) 75 >17(33) 50 >12(25) 38 >10(20) 30  >8(17) 25  >7(14) 21  >6(13) 19  >6(11) 17  >5(10) 15
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 3 (3000000)│>67(83) 100 >50(67) 83 >33(50) 67 >25(37) 50 >20(30) 40 >17(25) 33 >14(21) 29 >12(19) 25 >11(17) 22 >10(15) 20
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 4 (4000000)│>75(87) 100 >62(75) 88 >50(62) 75 >37(50) 63 >30(40) 50 >25(33) 42 >21(29) 36 >19(25) 31 >17(22) 28 >15(20) 25
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 5 (5000000)│>80(90) 100 >70(80) 90 >60(70) 80 >50(60) 70 >40(50) 60 >33(42) 50 >29(36) 43 >25(31) 38 >22(28) 33 >20(25) 30
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 6 (6000000)│>83(92) 100 >75(83) 92 >67(75) 83 >58(67) 75 >50(58) 67 >42(50) 58 >36(43) 50 >31(38) 44 >28(33) 39 >25(30) 35
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 7 (7000000)│>86(93) 100 >79(86) 93 >71(79) 86 >64(71) 79 >57(64) 71 >50(57) 64 >43(50) 57 >38(44) 50 >33(39) 44 >30(35) 40
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 8 (8000000)│>88(94) 100 >81(87) 94 >75(81) 87 >69(75) 81 >63(69) 75 >56(62) 69 >50(56) 62 >44(50) 56 >39(44) 50 >35(40) 45
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 9 (9000000)│>89(94) 100 >83(89) 94 >78(83) 89 >72(78) 83 >67(72) 78 >61(67) 72 >55(61) 67 >50(56) 61 >44(50) 56 >40(45) 50
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
10(10000000)│>90(95) 100 >85(90) 95 >80(85) 90 >75(80) 85 >70(75) 80 >65(70) 75 >60(65) 70 >55(60) 65 >50(55) 60 >45(50) 55
└────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┘

如果查看A = 2和B = 3(以及100万次测试):

  • 在17%的情况下,rand(2)大于rand(3)
  • 在33%的情况下,rand(2000000)大于rand(3000000)(注意缩放./ ..整数舍入)
  • 在50%的情况下rand(2)大于或等于rand(3)
  • (在50%的情况下,rand(2000000)也大于或等于rand(3000000))

令人惊讶的是:

  • rand(2)> rand(3)仅在17%的情况下
  • rand(10)> rand(10)在45%的情况下
  • 每隔一次rand(6)> rand(5)

实际上,我可能会用不同的方法来解决这个问题,只需简单地手动键入一个10x10的表格,并按要求的百分比分配好(也许有人也想要不规则性?)。然后,如果需要在两个值之间进行插值,以获得确切的百分比,例如出于某种原因53。那么只需执行rand(100)并进行测试,就很容易生成53%的概率命中率0或1。如果它小于或等于53 :-)。

这是沿着杰克Aidley提到。


1
您是否正在使用生成整数的随机数生成器?我的答案使用的是RNG,它会在0.0和之间生成双精度浮点数1.0。在这种情况下,>和之间的差异>=可以忽略不计。您可能要指出这一点。
菲利普

是的,这只是预期消息的一部分,以指出例如数字空间的变化行为。小值整数(粗粒度)与具有细粒度的大值整数(实际上也是浮点型)。我将在某处插入“整数”,以精确定位。实际上,我确实指出了可忽略不计的问题:“(在这种情况下,是>还是≥无关紧要,因为它们是如此接近”)。如果不鼓励系统寻求平衡,数字经常会发现令人惊讶的价值(对于人类而言)。通常来说,不一定是这种情况。
暴风城

0

隐式引用了多个答案但实际上没有人真正阐明的传统方法是,该任务需要固定的掷骰,并添加从您的统计数据中得出的能力修正值。

例如,如果两个玩家遵循以下步骤:

  • 滚动14面模具
  • 将它们的改性剂添加到模具辊中

重复直到一侧击败另一侧,然后您便得到了您范围内的数字:以下是获胜的几率,其修饰符具有给定的数值优势:

0   50%
1   57%
2   64%
3   70%
4   76%
5   81%
6   85%
7   89%
8   92%
9   95%
10  97%

0

角色不至于互相挑战。他们挑战要求。如果两者都通过了该怎么办?谁赢?令您惊讶的是,您还没有对逻辑提出足够的挑战,甚至还没有进行过计算。

无论哪种方式,这都有两点可能会对您有所帮助。

以优势赢得机会:

如果通行证/技能检查是10点,则A点为40点。B点为42点。如果只有一个获胜,则为。从相等的A 50%赢/ B 50%赢开始。您可以根据优势金额添加%赢得机会。纸卷B在纸卷方面有(42-40)/ 40 = 5%的优势。直接添加它会使B的获胜机会55%。或者,您可以确定每个优势百分比的自定义获胜机会。说出每100%的优势,您就有10%的获胜机会。因此,如果A掷10,B掷20,那么A胜40%,B胜60%。

公平随机性概念:

以30%的标准机会赢得您,最终可能会赢得100张中的38张支票。

有些人希望在公平性方面采取额外的步骤,并确保30%的几率总是在100次相遇中准确赢得30次,并且足够随机,不知道序列中的哪些相遇是胜利,而哪些是损失。

这对于精心计算的游戏经济性特别有用。因为随机属性有70%的几率获胜。说一个暴民有70%的几率掉5金。暴徒最终可能会将黄金从100中减少81次。这使收入/支出流失平衡。并且,取决于使用多少个滚动体/实例,不可避免地会导致通胀和/或短缺。当然,许多人甚至对他们的经济的全部投入/支出减少都没有一个粗略的估计。很多人满足于“最”经济要点。并保留一些未计算的生成变量,即使有相当的随机性,堆栈超时也会出现差异。

通胀和短缺本身并不是问题。如果您的经济体系能够对通货膨胀和短缺做出充分的反应,那么您就可以管理非公平的随机性甚至是无法预料的变量。

为什么要打扰一下,因为从长远来看,大数定律会平复事情?

并非所有环境都可以保留其设计行为,同时又可以指望事情在以后实现均衡……


我特别喜欢最后一句话。从其他地方抢来:例如,我认为维京乐透的进场与出场比率从长远来看约为4:1(可以用“大”代替“长”);它具有几乎有争议(但定义明确)的设计行为,并且可以起作用。除非首先精确定义设计行为,否则无法执行下面的数学运算。数字趋于不受控制……
Stormwind

@Stormwind当然。如果缺乏设计/理论-数学是没有用的。它只是一个工具。我见过五年级数学水平的设计师可以节省开支。他们只是简单地映射了他们想在逻辑上做的事情,并向数学人员(通常是编码人员)寻求工具/建议,以完成数学工作。在某种程度上,它仍然设法对每个人都不是显而易见的-蓝图中存在的问题越多-施工中就越会出现头痛。仅获取一些系统并进行调整就完全失去了重点。如果您只决定首先做什么,它就不是真正的创意。
helena4 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.