我正在尝试编写基于控制台的场模拟器游戏。我的课程是:

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)时,它适用于具有boardinstanceof Plant的每个元素。

最佳答案

当您只召唤一个植物时,所有植物都着火的原因是,您在电路板初始化中为所有斑点分配了完全相同的植物,因此开始时只有一棵植物。
尝试board[i][j] = new Spot( new Plant(...) );,以便每个位置都具有自己的默认工厂,这些工厂彼此独立。
尽管这不是问题的一部分:出于相同的原因,一旦开始在任何setValue()值上调用free,您都会遇到相同的问题!

似乎您在尝试在电路板课程的开头创建默认的ValuePlant。除上述方法外,还有多种解决方法,例如:


明确列出默认值,然后可以将其输入到各自的构造函数中:
private char valueSign = '_';
private char plantSign = '@';
然后,您可以执行board[i][j] = new Spot(new Plant(plantValue, plantSign));
在Spot类中创建默认构造函数。
保留您的代码不变,然后克隆默认工厂:
board[i][j] = new Spot(plant.clone())


所有这些都可以解决您遇到的问题。选择哪种方法取决于您要如何组织游戏以及数据应该存放在何处。祝好运。

10-04 18:10