我正在尝试编写基于控制台的场模拟器游戏。我的课程是:
Board.java
public class Board {
Spot[][] board = new Spot[50][50];
Values free = new Values(1000,'_');
Plant plant = new Plant(10,'@');
public Board() {
for(int i = 0; i < MAX_SIZE; ++i)
for (int j = 0; j < MAX_SIZE; ++j)
board[i][j] = new Spot(plant);
}
}
Spot.java
public class Spot {
Values values;
public Values getValue() {
return values;
}
public void setValue(Values values) {
this.values = values;
}
}
值.java
public class Values{
private int price,time;
private char sign;
public Values(int price, char sign){
setPrice(price);
setSign(sign);
}
// All the setters and getters...
}
植物.java
public class Plant extends Values {
private boolean onfire;
public Plant(int price, char sign)
super(price,sign);
setOnFire(false);
}
// Setter and getter for onfire...
}
问题:调用
(Plant)(board[0][0].getValue()).setOnFire(true)
时,它适用于具有board
的instanceof Plant
的每个元素。 最佳答案
当您只召唤一个植物时,所有植物都着火的原因是,您在电路板初始化中为所有斑点分配了完全相同的植物,因此开始时只有一棵植物。
尝试board[i][j] = new Spot(
new Plant(...)
);
,以便每个位置都具有自己的默认工厂,这些工厂彼此独立。
尽管这不是问题的一部分:出于相同的原因,一旦开始在任何setValue()
值上调用free
,您都会遇到相同的问题!
似乎您在尝试在电路板课程的开头创建默认的Value
和Plant
。除上述方法外,还有多种解决方法,例如:
明确列出默认值,然后可以将其输入到各自的构造函数中:private char valueSign = '_';
private char plantSign = '@';
等
然后,您可以执行board[i][j] = new Spot(new Plant(plantValue, plantSign));
。
在Spot类中创建默认构造函数。
保留您的代码不变,然后克隆默认工厂:board[i][j] = new Spot(plant.clone())
。
所有这些都可以解决您遇到的问题。选择哪种方法取决于您要如何组织游戏以及数据应该存放在何处。祝好运。