gpt4 book ai didi

java - 从另一个不是子类的类中查找一个类的现有实例的良好做法

转载 作者:行者123 更新时间:2023-11-29 05:32:54 25 4
gpt4 key购买 nike

我正在尝试开发简单的 TowerDefense 游戏,但是当我遇到问题时,似乎我错过了 OOP 的基础知识必须以某种方式修复,因为每个使用 OOP 编程的人都必须具备遇到了。

这是非常非常基本的结构

Game
|__ Map

Player
|__ UnitController

+ Block
+ Unit

所以基本上 Map() Controller 创建 100 new Block()路过x and y坐标到它并存储有关这些信息的信息 Blocks()List<> 里面.其中之一Block正在开始位置(它仍然是一个 Block 对象)。

现在UnitController()SpawnUnit()方法。它创建 new Unit()它(问题来了)必须将此单元实例放在起始 block 上。为了做到这一点,UnitController将不得不问Map对于起始位置(这是由 Map 存储的变量)但是.. UnitController如何可以联系 map 实例。我看到的唯一方法是 Map 是一个单例,我可以做到 Map.getStartingPos否则,如果 Map 不是单例(因此是实例),那么 UnitController 将如何找到该实例?当我实例化 UnitController 时,我可以将这个实例传递给 UnitController,但我猜这不是一个选项因为在这个游戏中会有很多其他的例子(例如攻击单位的塔,它必须找到一个单位......)我不能简单地将这些实例扔到代码周围吗?

谢谢

最佳答案

为什么你反对给 UnitController 一个对其 Map 的引用?

public UnitController {

private final Map map;

public UnitController(Map map) {
this.map = map;
}
}

现在您的 UnitController 具有对 Map 的引用。如果您考虑一下,这是有道理的。没有 map 可以控制哪些单位?难道不是所有的 UnitController 都有一个 Map 来控制单元吗?它作为一种属性(property)很有意义,不是吗?

您当然不想像您建议的那样将 Map 设为单例,因为这会破坏模型优雅的面向对象特性。重点是能够拥有多个 Map,多个 UnitController 可以作用于其上。将此限制为一次运行一次,一次一个 Map,使得代码比面向对象的代码更具过程性。

无论您做什么,MapUnitController 都必须有一些共同点才能共享数据,即使您不希望它们相互直接引用。

就“攻击最近单位的塔”作为不使用此模型的理由而言,这没有意义; Tower 应该简单地请求距离 Map 对象最近的单位(即 map.getNearestUnit(int x, int y))。不需要任何更复杂的引用,只要一切都可以从 Map 推送和拉取信息。

有关您关注的线程 Tower 的更复杂示例:

public class Tower extends Unit implements ActionListener {

private final Timer fireTimer;
private final Map map;
private int damage;
private int range;

public Tower(Map map, int damage, int range, int fireRate) {
this.map = map;
this.damage = damage;
this.range = range;
fireTimer = new Timer(fireRate, this);
fireTimer.start();
}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == fireTimer) {
map.damageNearestUnit(this, range, damage);
}
}

}

... map.damageNearestUnit 的签名类似于 damageNearestUnit(Unit unit, int range, int damage)。这实际上应该采用传入的 Unit,获取其坐标,并在 int range 中找到最近的单元。如果范围内有一个,则对另一个单位造成 int 伤害。然后,如果受损的 Unit 生命值少于 1,则应将其从 Map 中移除,触发 UI 更改等。

实际上,如果我的 Tower 中有简单的 getter 和 setter,并且我的 damageNearestUnit 方法假定一个单元正在损坏另一个单元,我可以简单地将其签名设为 damageNearestUnit(单位攻击者)

我希望这表明 Map 是如何将其他所有内容绑定(bind)在一起并控制其上存在的结构。

关于java - 从另一个不是子类的类中查找一个类的现有实例的良好做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20502724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com