You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

卡牌RPG游戏读取Enemy/speed属性时出现TypeError问题求助

卡牌RPG游戏Attack按钮触发TypeError:无法读取undefined的speed属性

点击Attack按钮时,本该读取玩家与敌人的speed属性判断攻击顺序,却持续触发以下错误:

Uncaught TypeError: Cannot read properties of undefined (reading 'speed')
    at Object.calcAttack (Player.js:18:28)
    at HTMLButtonElement.onclick ((index):34:64)
calcAttack @ Player.js:18
onclick @ (index):34

相关代码

Index.HTML

<button onclick="playerMoves.calcAttack()">Attack!
</button>

Player.JS

let player;

function Player(level, health, attack, speed, magic, experience){
    this.level = level;
    this.health = health;
    this.attack = attack;
    this.speed = speed;
    this.magic = magic;
    this.experience = experience;
};

let playerMoves =  {
    calcAttack: function(){
        // 攻击顺序逻辑:获取玩家和敌人速度判断先手
        let playerSpeed = player.speed;
        let enemySpeed = enemy.speed;

        console.log(playerSpeed, enemySpeed);
        
        if (playerSpeed >= enemySpeed){
            enemy.health = enemy.health - outputDmg;

            if(enemy.health <= 0){
                alert("你击败了敌人!");
                // 加载新敌人的函数
            } else{
                player.health = player.health - outputEnemyDmg;

                if(player.health <= 0){
                    alert("你阵亡了")
                }
            };
        }    
    }
}

Enemy.JS

function Enemy(rank, name, imgName, health, attack, speed, droppedExp){
    this.rank = rank;
    this.name = name;
    this.imgName = imgName;
    this.health = health;
    this.attack = attack;
    this.speed = speed;
    this.droppedExp = droppedExp;
};

// 敌人等级分为E、D、C、B、A、S,对应数值1-6
let goblin = new Enemy(1,"哥布林", "goblin", 50, 5, 10, 10);
let raikan = new Enemy(1, "钢牙雷坎", "raikan", 50, 5, 10, 10);
let briga = new Enemy(1, "利爪布里加", "briga", 55, 15, 10, 10);
let centipede = new Enemy(2 ,"巨型沙漠蜈蚣", "centipede", 100, 15, 5, 20);
let jackal = new Enemy(2, "地牢豺狼", "jackal", 75, 10, 15, 20);

问题原因

错误核心是player或enemy变量未被正确赋值:

  • player仅声明但未通过new Player()创建具体实例,调用player.speed时自然找不到属性;
  • Enemy.js里定义了多个敌人实例,但calcAttack函数中直接使用的enemy变量未指向任何已创建的敌人对象,属于未定义状态。

修复步骤

  1. 创建玩家实例:在Player.js中添加玩家初始化代码,比如:
// 放在Player函数定义之后
player = new Player(1, 100, 15, 12, 8, 0);
  1. 绑定当前战斗敌人:

    • 全局声明currentEnemy变量,进入战斗时赋值为选中的敌人,比如:
      // 比如选择哥布林作为当前敌人
      let currentEnemy = goblin;
      
    • 修改Player.js的calcAttack函数,把所有enemy替换为currentEnemy:
      let enemySpeed = currentEnemy.speed;
      currentEnemy.health = currentEnemy.health - outputDmg;
      
  2. 补充伤害变量定义:代码中outputDmg和outputEnemyDmg未定义,需要补充伤害计算逻辑,比如:

// 在calcAttack函数内添加
let outputDmg = player.attack; // 简化的玩家伤害计算
let outputEnemyDmg = currentEnemy.attack; // 简化的敌人伤害计算

内容的提问来源于stack exchange,提问作者Alejandro Garcia Baltazar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:33:15