在基于回合的游戏或Roguelikes中计算击中次数的属性


22

我试图找出一个很好的公式来确定玩家以Roguelike攻击敌人时的命中率。我想提出一些简单的方法,但仍然要遵循D&D或AngBand或NetHack等流行Roguelike的方法。

到目前为止,我所要做的就是添加玩家和敌人属性之间的差异,以及一个随机整数:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

这造成了不自然的游戏玩法:玩家永远不会错过弱小的敌人,反之亦然。有谁知道回合制游戏中使用的基于属性的战斗指南?我应该(也可以)逐字复制D&D规则吗?

Answers:


18

我会弄清楚您希望“保证命中”和“保证错过”的机会是什么(即,一只小猫撞龙而一只龙错过小猫)的机会。存储您的随机结果,并且在应用功效差异之前,如果命中范围内,则将其标记。这样可以避免100%的命中率/未命中率问题……尽管总有另一种方法可以始终提供命中率,详情如下。

D&D是一个“扁平”系统,其中概率在可能的掷骰结果中平均分配。其他系统使用更弯曲的分布,通常通过滚动多个骰子并添加它们来实现。创建这样的曲线很容易(想到的是(rand()+ rand())/ 2)。

另一种可能性是“爆炸骰子”。在Shadowrun和Savage Worlds等系统中,滚动最大可能的骰子结果可让您重新滚动该骰子并添加新结果。在您的游戏中,您将测试您的随机结果是否高于某个阈值,如果是,则再次滚动。如果让骰子无限期地爆炸,那么即使是最低级的地精也有机会击中上帝,并且您不需要明确的“保证击中”机制。

因此,一种可能的方法是采用弯曲的滚动,保证丢失的机会和骰子爆炸的可能性,例如:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

当然,这是未经测试和不平衡的;您需要调整所有这些魔术数字,直到感觉正确为止。

至于逐字复制规则,存在法律和道德问题。不过,您可以从D&D和其他桌面游戏中汲取灵感。这就是他们最初都是如何设计的。您也不需要向玩家确切显示规则的工作原理,并且可能会发现,使用平滑的浮点骰子曲线比将自己局限于物理骰子的整数约束要好。


3
有趣的类型decl是什么语言?还是仅仅是伪代码?
tenpn

2
我认为它可能是Actionscript或Javascript,但不要拘泥于此。
共产党鸭子

这是ActionScript3。我是Flash开发人员。
格雷戈里·艾弗里·威尔

6

我假设这是一个游戏平衡问题,而不是编码问题,并且有很多方法可以解决这个问题。从您现有的算法来看,我怀疑您正在使它变得比其复杂(从玩家的角度来看,三个属性和一个随机数构成了一个极其混乱的系统)。我的本能是简化!

支持执行多项操作的属性,而不是由多个属性确定的结果。DEX作为击中机会的主要决定因素就可以了。添加其他所有内容只会使平衡变得更加困难。这样想:玩家每次击中的预期伤害是其命中百分比乘以他们击中时的平均伤害。您打算如何计算包含这么多变量的“预期”或“典型”命中百分比?

我看到另一个问题,那就是您的公式无法缩放,这可能就是您遇到的问题。假设敏捷,幸运和速度在游戏过程中趋于增加,那么玩家和怪物之间的统计差异也会趋于增加。举例来说,如果玩家的早期游戏DEX处于4到6范围内,怪物也是如此,那么这就是10-20%的命中修正值。如果游戏后期阶段的范围更像是10到20,则修改率最高为100%。

解决该问题的一种方法是保持统计信息不变。在整个游戏中,玩家和怪物的范围是相同的,获得+1 DEX的东西是一笔大数目,非常罕见,并且被如此对待(如果确实存在)。这样,您的公式就可以在整个游戏中正常工作,并且您会看到一名球员在整个比赛中都有相同的被击中机会。

另一种方法是将硬编码的“ 10”更改为按级别缩放,因此可能是“ 10 +怪物级别”或“ 10 +地牢级别”之类的东西,这会导致游戏难度逐渐增加,除非玩家升级他们的统计数据。

正如其他人所说,第三种方法是对可接受的最高命中率和最低命中率设置硬上限,并简单地说:“如果计算值小于X,则使用X”。

为了完整起见,我要指出的是,没有绝对的法律规定您必须首先包括一个命中名单。在无效的游戏中执行动作并不是特别有趣,除非在极少数情况下,否则并不能真正增加体验。另一种选择是让玩家总是命中目标,并且只破坏伤害范围,这样有时他们造成的伤害就会比其他玩家少得多。请记住,对于设计师来说,复杂的系统比对玩家更有趣。


这是一个很好的答案。
seanicus

3

您可能想要添加关键命中(通常不会错过,额外伤害)和关键失误(无论如何都有机会错过的平坦机会,可能会使玩家发呆)。


0

除了正常的命中公式外,许多游戏都使用命中百分之五的变化,而不受所有因素的影响。

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.