卡牌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变量未指向任何已创建的敌人对象,属于未定义状态。
修复步骤
- 创建玩家实例:在Player.js中添加玩家初始化代码,比如:
// 放在Player函数定义之后 player = new Player(1, 100, 15, 12, 8, 0);
绑定当前战斗敌人:
- 全局声明
currentEnemy变量,进入战斗时赋值为选中的敌人,比如:// 比如选择哥布林作为当前敌人 let currentEnemy = goblin; - 修改Player.js的
calcAttack函数,把所有enemy替换为currentEnemy:let enemySpeed = currentEnemy.speed; currentEnemy.health = currentEnemy.health - outputDmg;
- 全局声明
补充伤害变量定义:代码中
outputDmg和outputEnemyDmg未定义,需要补充伤害计算逻辑,比如:
// 在calcAttack函数内添加 let outputDmg = player.attack; // 简化的玩家伤害计算 let outputEnemyDmg = currentEnemy.attack; // 简化的敌人伤害计算
内容的提问来源于stack exchange,提问作者Alejandro Garcia Baltazar
相关产品推荐
相关产品推荐

