随着游戏的进行,我如何在攻击浪潮中缩放敌人的数量和挑战?


9

我目前正在制作一个防御游戏,敌人会生成并攻击玩家的军队。除了只有一个级别外,它类似于塔防游戏。敌人将继续产卵,直到最终用户死亡或他调遣足够大的部队以消灭立即产卵的任何敌人(希望这足以挑战不会发生这种情况)。

目前,我正在努力解决的问题是,如何使这款游戏变得越来越困难,以及敌人产生的可能性最终最终达到100%。

到目前为止,我有类似以下内容

if(Math.random() < 1 - (1/elapsed_time) && spawnTimer <= 0 ){
    spawnEnemy()
    spawnTimer = rand(); // random number between 1 and 3
}

但是似乎一开始就不太统一。目前,我仅生成一种类型的敌人,这种想法是随着时间的推移也会生成更强悍的敌人。

我还认为我需要将随机数spawnTimer更多一些,并随着时间的推移而使速度更快,但是我只是看不出我对整个部分的逻辑面貌有所了解。有人能帮助您大致了解这种公式吗?

我目前正在使用javascript编写游戏,但是显然它更多地是关于这个概念的。


什么时间经过?到现在为止是过去了吗?您多久将此情况称为一次?
AturSams 2014年

嗨,对不起,经过的时间是自游戏开始以来经过的时间,这在我的基于基于window.requestAnimationFrame的游戏update()周期中调用
TommyBs 2014年

Answers:


3

您选择的功能不太可能适合您的目的。首先,如果走这条路线,失败的随机条件会导致下一次掷骰子之前的延迟。而且,将生成计时器保持在恒定范围内不太可能对您的目标有利。

thresh您认为很高的难度阈值。我们稍后会用它来决定何时放慢游戏难度。

rate是你想在每分钟(或圆形)未来的怪物的数量。

假设GROWTH_RATE难度增加的速率(现在是0.2)。

假设您从开始rate = 10。现在,玩家杀死了5怪物,因此您可以通过GROWTH_RATE * 5 = 1.0和增加速率rate = 11

如何实现rate每分钟都会产生怪物的条件:

设置产卵计时器多项之间0.51.0 multiplied by 60 seconds or圆时间and divided by. Also leave a0.25`的机会,当定时器到达0,次再被随机没有怪物催生。

如果rate到达thresh,则需要放慢速度。现在,而不是增加rateGROWTH_RATE,你可以通过增加它1 / math.sqrt(rate)。这样,在较硬的环境中不会立即摧毁玩家。

您可以重置threshrate玩家输掉游戏的80%左右。

如果您希望随机化怪物的力量,请谨慎使用计时器。例如,如果您决定player-score(由到目前为止杀死的怪物决定)将用来确定可能产生的怪物的最大力量,则可以执行以下操作:max-monster-strength = player-score / 1000。然后将floatdouble之间随机分配0.0到,1.0然后将其自身相乘。

float monster_power = Math.random();
monster_power *= monster_power; // Multiply result by itself
    // Makes hard monsters less frequent than weak ones
monster_power *= max_monster_strength;

现在,当您使计时器随机化时,您可能应该考虑功率水平。例如,您可以将计时器结果乘以下一个怪物力量的平方根。

spawn_timer *= math.sqrt(monster_power);

6

有很多选项,其中两种当前设置:

  • 使敌人更难
  • 产生更多敌人(一次或更多次)

再加上其他功能:

  • 敌人开始造成不同类型的伤害,玩家必须针对每种伤害采取不同的防御措施。例如,远程攻击,魔法等
  • 敌人开始防御各种类型的损害。玩家必须建造多种类型的伤害处理装置来对抗。例如,玩家从箭击和炮弹攻击开始。产生对箭的抵抗力很高的敌人,因此玩家必须确保他们平衡了攻击。

至于绘制难度曲线,实际上没有正确的答案。为了使其正确,需要进行大量的游戏测试和调整。这将取决于游戏应该持续多长时间以及您希望游戏持续多久。我建议您使用Excel或WolframAlpha之类的网站,看看不同功能会创建什么样的曲线。尝试指数增长,线性增长等。找到一种适合您的方法。


感谢您的想法,但我认为选择的答案是我所需要的。但是,您肯定给了我更多的思考的机会,并且我赞成您的回答
TommyBs 2014年

2

代替以固定的概率生成固定数量的敌人(一个),您可以将其绕开并以固定的概率生成可变数量的敌人。

static const double SPAWN_CHANCE_ON_DIFFICULTY_1 = 0.01;

for (int i = 0; i < currentDifficulty; i++) {
   if(Math.random() < SPAWN_CHANCE_ON_DIFFICULTY_1 ){
       spawnEnemy()
   }
}

难度为1级时,每跳动产生1个敌人的机率为1%。

难度等级为1000时,它会产生多达1000个敌人,每个敌人的几率分别为1%。这意味着平均每个滴答声会产生10个,但也可能更多或更少。很有可能一次产生的数字与10截然不同,甚至可能是1000。但是由于概率是如何工作的,因此发生这种情况的可能性很小(比较:大数定律)。

当您添加更多具有不同行为和统计数据的不同敌人时,您可能希望一些更强悍的敌人只在难度较高时才开始产卵,甚至刚开始时密度较低。为此,您可以添加从当前难度中减去的难度修改器。这样,敌人就不会在达到该难度级别之前生成,即使那样,一开始的机会也很少:

for (EnemyType enemyType: allEnemyTypes) {
    for (int i = 0; i < currentDifficulty - enemyType.getDifficulty(); i++) {
        if(Math.random() < enemyType.spawnChance() ){
            spawnEnemy(enemyType);
        }
    }
}

1
这很刺激,但是在使用之前应该对其进行优化。例如,您可以一次使用Math.random()来确定要产生多少个敌人。如果您想为大量敌人留出较小的机会,则可以更有效地实施“正态分布”。stackoverflow.com/questions/2325472/...
AturSams
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.