所以我有一段相当简单的代码:
Soldier Horseman = new Soldier("Horseman",Archer, 20);
Soldier Spearman = new Soldier("Spearman",Horseman, 10);
Soldier Archer = new Soldier("Archer",Spearman, 10);
士兵的构造函数接受参数
Soldier(String name, Soldier target, double range)
然后使用目标计算方法中两者之间的距离。
public double DistanceCalculation() {
distanceToTarget = ((Math.pow((soldierPosition[0] - soldierTarget.soldierPosition[0]), 2)) + Math.pow((soldierPosition[1] - soldierTarget.soldierPosition[1]), 2));
return distanceToTarget;
然而,当我尝试创建此代码时,无法创建最顶层的士兵,因为它的目标尚不存在。我尝试在构造函数中使用String而不是Soldier,但后来我无法弄清楚如何将字符串转换为Soldier以便SoldierTarget.soldierPosition工作。有什么想法吗?
答案 0 :(得分:4)
将目标信息存储在单独的数据结构中可能更好一点,例如,一个HashMap<Soldier, Soldier>
。然后你可以使Soldier
不可变,并且所有圆形问题都会消失。
Soldier horseman = new Soldier("Horseman", 20);
Soldier spearman = new Soldier("Spearman", 10);
Soldier archer = new Soldier("Archer", 10);
Map<Soldier, Soldier> targets = new HashMap<>();
targets.put(horseman, archer);
targets.put(archer, spearman);
targets.put(spearman, horseman);
答案 1 :(得分:3)
不要在构造函数中设置目标。用另一种方法设置它:
Soldier target;
Soldier(String name,double range) {
// etc
}
public void setTarget( Soldier s ) {
target = s;
}
然后你可以这样做:
Soldier horseman = new Soldier("Horseman", 20);
Soldier spearman = new Soldier("Spearman", 10);
Soldier archer = new Soldier("Archer", 10);
horseman.setTarget(archer);
spearman.setTarget( horseman );
archer.setTarget(spearman);
这样每个士兵都知道他目前的目标。然后,如果(例如)骑士征服射手,你可以拨打horseman.setTarget(spearman)
来设置一个新目标。
我假设范围是士兵的最大攻击范围,但如果它是到目标的距离,则不应在构造函数中设置。
答案 2 :(得分:2)
你可以创建另一个构造函数(除了你已经存在的构造函数):
Soldier(String name, double range)
然后在DistanceCalculation
方法中,执行hasTarget()
检查。
答案 3 :(得分:0)
如下:
Soldier Horseman = null;
Soldier Spearman = null;
Soldier Archer = null;
Horseman = new Soldier("Horseman",Archer, 20);
Spearman = new Soldier("Spearman",Horseman, 10);
Archer = new Soldier("Archer",Spearman, 10);