我正在尝试编写基于控制台的农场模拟器游戏。我的课程是:
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;
}
}
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...
}
Plant.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
的{{1}}的每个元素。
答案 0 :(得分:1)
&#34;它适用于每个元素&#34; - 这意味着所有这些引用都指向内存中的单个对象。
查看Board
课程中的循环。你创建了多个Spot
- 你在循环中调用它的构造函数。但是您的Plant
只被声明一次,并作为Spot
构造函数中的参数传递。这意味着所有Spot
共享一个Plant
。
尝试board[0][0].getValue() == board[0][1].getValue()
查看。我猜结果是true
,但你想要的是false
。
将Plant
声明移到循环内就足够了(您可能需要对Values
执行相同操作。)
答案 1 :(得分:1)
当你只召唤一个植物时,所有植物都被点燃的原因是你已经将所有斑点分配给了板初始化中完全相同的植物,因此只有一个植物开始。
尝试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));
。board[i][j] = new Spot(plant.clone())
。所有这些都应该解决您遇到的问题。无论您选择哪种方法取决于您希望如何组织游戏以及数据应该存在的位置。祝你好运。