Javascript / Jquery RPG游戏(计时器)的战斗系统

时间:2019-01-03 01:15:06

标签: javascript jquery

我大约一个月前才开始学习javascript。我一直在从事一个个人项目,以帮助我磨练自己的脚步,并决定制作一个基于文本的RPG游戏。

我想要实现的是一种基于“滴答”系统或时间的战斗系统。基本上,一旦战斗开始(通过攻击),滴答声就会开始响起,敌人每隔3滴答声(秒)就会袭击我一次。敌人的攻击频率还取决于他们的敏捷性统计。

到目前为止,我有一个基本的战斗系统,可以根据玩家的力量和敌人的防御值随机攻击敌人。但是,敌人只有在我攻击它们后立即进行攻击。这是代码。

regPlayerAttack = function () {
    //random boolean to determine if its going to be 10% dmg of positive or 
negative
    randomDmgFlag = Math.round(Math.random());
    //the 10% will be added on
    if (randomDmgFlag === 1) {
        rawDmg = Math.round((player.level * 3 + player.strength * 8) - 
(chosenEnemy.stamina * 2));
        randomDmgRange = (15.0 / 100) * rawDmg;
        randomDmg = Math.floor(Math.random() * (randomDmgRange - 0) + 0);
        totalDmg = rawDmg + randomDmg;
        chosenEnemy.health -= totalDmg;
        $("#textbox-text").prepend("You attacked the " + chosenEnemy.name + 
" for " + totalDmg + " damage." + "<br>");
    }
    //the 10% will be subtracted
    else {
        rawDmg = Math.round((player.level * 3 + player.strength * 8) - 
(chosenEnemy.stamina * 2));
        randomDmgRange = (15.0 / 100) * rawDmg;
        randomDmg = Math.floor(Math.random() * (randomDmgRange - 0) + 0);
        totalDmg = rawDmg - randomDmg;
        chosenEnemy.health -= totalDmg;
        $("#textbox-text").prepend("You attacked the " + chosenEnemy.name + 
" for " + totalDmg + " damage." + "<br>");
    }
}

我对敌人的攻击具有与上面的代码完全相同的功能。 (我知道我应该使其成为一个函数,但我想首先对其进行可视化处理)

因此,总而言之,一旦基于时间系统的战​​斗开始后,我想让敌人继续攻击我,而他们将根据敏捷度统计数据来更快或更慢地攻击我。我仍然对破坏公式感到困惑,因此一无所获。有任何想法吗??谢谢。

1 个答案:

答案 0 :(得分:0)

一个选择是使用转计数器和一个间隔,该间隔每秒触发一次(或您想要的任何时间)。当角色的turn % agility === 0受到攻击时。 (例如,敏捷度1表示角色每回合攻击一次;敏捷度3表示角色每3回合攻击一次)

const enemies = [
  { agility: 3, name: 'enemy1', hp: 100 }
];
const player = { agility: 1 };

let turn = 0;
const interval = setInterval(() => {
  console.clear();
  console.log('turn ' + turn);
  // player attacks every turn with agility 1:
  regPlayerAttack();
  
  // if all enemies are dead, end the interval
  if (enemies.every(({ hp }) => hp <= 0)) {
    clearInterval(interval);
    console.log('done');
  }

  // every enemy whose agility modulo the current turn is 0 attacks:
  enemies
    .filter(({ agility }) => turn % agility === 0)
    .forEach(enemyAttack);
  
  turn++;
}, 1000);

function regPlayerAttack() {
  console.log('player attacking...');
  // insert attack logic
}
function enemyAttack(enemy) {
  console.log(enemy.name + ' attacking...');
  // insert attack logic
}

请注意,像这样,敏捷度与速度成反比-敏捷度越低越好。这样,在不涉及任何分数的情况下,计算就非常容易可视化,但是如果您希望更高的敏捷度来对应更高的速度,则可以根据需要更改公式。