Java游戏开发:单向持有引用场景下类间值获取与英雄捡币逻辑实现问题
解决英雄收集金币的逻辑问题
嘿,我看你在做这个Java竞技场游戏时卡在了英雄捡金币的环节——其实核心问题是对象职责的划分,咱们不需要让Hero直接持有Coin列表或者Arena实例,而是让Arena这个“场景管理者”来处理碰撞检测和金币收集的逻辑,毕竟它本来就握着Hero和所有Coin的引用,是干这件事的最佳人选。
下面是具体的解决步骤:
1. 完善Arena的金币收集方法
你已经在Arena里写了空的retrieveCoins()方法,现在把它补全,让它遍历所有金币,检查英雄是否和金币处于同一位置:
private void retrieveCoins() { // 用迭代器遍历,避免遍历过程中修改列表抛出ConcurrentModificationException Iterator<Coin> coinIterator = coins.iterator(); while (coinIterator.hasNext()) { Coin currentCoin = coinIterator.next(); // 检查英雄位置和金币位置是否重合 if (hero.getPosition().equals(currentCoin.getPosition())) { coinIterator.remove(); // 收集到金币,从列表中移除 // 这里可以添加英雄加分逻辑,比如调用hero的加分方法 hero.addScore(10); } } }
2. 英雄移动后触发收集检测
每次英雄移动完成后,都要调用上面的方法检查是否捡到金币,所以修改moveHero()方法:
public void moveHero(Position position) { if (canHeroMove(position)) { hero.setPosition(position); retrieveCoins(); // 移动后立即检测金币收集 } }
3. 给Hero添加分数属性(可选但实用)
如果想记录英雄的收集成果,可以在Hero类里加分数相关的属性和方法:
public class Hero extends Element{ public final String color = "#ff0000", model = "X"; public final boolean bold = true; private int score = 0; // 新增分数属性 public Hero(int x, int y){ super(x, y); } // 原有移动方法... // 新增加分方法 public void addScore(int points) { this.score += points; System.out.println("当前分数:" + this.score); // 后续可以替换成游戏UI的分数显示逻辑 } // 新增获取分数的方法 public int getScore() { return score; } }
为什么这个方案更合理?
- 职责单一:Hero只需要管好自己的移动和状态(比如分数),不需要关心整个场景的金币分布;Arena负责管理场景内的所有元素交互,逻辑更清晰。
- 避免耦合:如果让Hero持有Arena的引用,会造成对象之间的循环依赖(Arena有Hero,Hero又有Arena),后续修改代码会变得麻烦。
- 易于扩展:以后要加怪物、道具等元素,只需要在Arena里新增对应的检测逻辑,不需要修改Hero类的代码。
内容的提问来源于stack exchange,提问作者MoscaCareca
相关产品推荐
相关产品推荐

