如何通过调用方法修改变量?循环调用attack方法修改enemyhp卡顿求助
嘿,这个问题我熟!你遇到的核心问题其实是值传递和引用传递的区别,尤其是跨类修改变量时特别容易踩这个坑,咱们一步步来解决它。
问题根源:为什么数值卡在18不动?
你说每次攻击后enemyhp降到18就停了,大概率是因为你的attack方法接收的是基本类型数值(比如int)——这种情况下传递的是变量的副本,也就是说attack方法里修改的只是那个临时副本,外面真正的enemyhp变量根本没被改变!举个典型的错误写法例子:
// 错误示例! public class AttackHandler { public void attack(int enemyhp) { enemyhp -= 2; // 这里改的是方法内部的局部变量,和外部的enemyhp毫无关系 } } // 主程序调用 int enemyhp = 20; AttackHandler ah = new AttackHandler(); while (enemyhp > 0) { ah.attack(enemyhp); System.out.println(enemyhp); // 永远输出20(或者你手动先减了一次到18,但之后再也不变) }
正确解决方案:用对象封装状态
面向对象编程的核心就是把属性和行为封装在一起,咱们把敌人的血量和受伤逻辑做成一个类,这样调用攻击方法时传递的是敌人对象的引用,修改的就是对象本身的血量值。
步骤1:定义Enemy类,封装血量与受伤逻辑
public class Enemy { private int hp; // 初始化敌人血量 public Enemy(int initialHp) { this.hp = initialHp; } // 获取当前血量的方法 public int getHp() { return hp; } // 专门处理受伤的方法,确保血量正确减少 public void takeDamage(int damage) { this.hp -= damage; // 防止血量变成负数,强制设为0 if (this.hp < 0) { this.hp = 0; } } }
步骤2:修改Attack类的方法,操作Enemy对象
public class AttackHandler { // 每次攻击造成2点伤害 public void attackEnemy(Enemy enemy) { enemy.takeDamage(2); System.out.println("攻击生效!敌人当前HP: " + enemy.getHp()); } }
步骤3:循环攻击直到敌人倒下
public class Battle { public static void main(String[] args) { // 创建一个初始血量20的敌人 Enemy goblin = new Enemy(20); AttackHandler playerAttack = new AttackHandler(); // 循环攻击,直到敌人血量<=0 while (goblin.getHp() > 0) { playerAttack.attackEnemy(goblin); // 可选:加个小延迟模拟战斗节奏 try { Thread.sleep(600); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("敌人被消灭了!"); } }
运行效果
这样运行后,你会看到血量依次是:20→18→16→…→0,完全符合你想要的持续攻击直到敌人倒下的需求。
额外小提示
- 永远不要直接暴露类的私有属性(比如别把Enemy的hp设为public),通过
getHp()和takeDamage()这类方法操作,这是面向对象的封装原则,能避免很多意外bug。 - 如果用的是其他语言(比如Python、C#),思路完全一致:用对象封装状态,传递对象引用而非基本类型的值。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

