我会弄清楚您希望“保证命中”和“保证错过”的机会是什么(即,一只小猫撞龙而一只龙错过小猫)的机会。存储您的随机结果,并且在应用功效差异之前,如果命中范围内,则将其标记。这样可以避免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和其他桌面游戏中汲取灵感。这就是他们最初都是如何设计的。您也不需要向玩家确切显示规则的工作原理,并且可能会发现,使用平滑的浮点骰子曲线比将自己局限于物理骰子的整数约束要好。