如果没有使用该部分周围的坐标,我有一块需要被其他灰色部分包围的部分。
我尝试执行以下操作:
public List<Piece> boardPiece(){
List<Piece> boardPieces = new ArrayList<>();
for (Piece pieces : listToPiece) {
if (pieces.getCoordinate() != null){
boardPieces.add(pieces);
}
}
return boardPieces;
}
public List<Coordinate> getSurroundings() {
List<Coordinate> surroundings = new ArrayList<>();
for (Piece boardpieces : boardPiece()) {
for (Coordinate coordinate : makeDirections()) {
surroundings.add(new Coordinate(boardpieces.getCoordinate().getRow() + coordinate.getRow(), boardpieces.getCoordinate().getColumn() + coordinate.getColumn()));
}
}
return surroundings;
}
public List<Coordinate> makeDirections(){
directions.add(new Coordinate(1,-1));
directions.add(new Coordinate(-1,1));
directions.add(new Coordinate(-1,0));
directions.add(new Coordinate(1,0));
directions.add(new Coordinate(0,-1));
directions.add(new Coordinate(0,1));
return directions;
}
板件是板上的一块,有一个坐标。没有坐标的板件不应该被其他灰色部件包围。在我的抽屉里,我写了以下代码:
public void drawEmptyPieces() {
for (Coordinate emptyPiece : emptyPieces) {
EmptyPiece emptyPiece1 = new EmptyPiece(new Coordinate(emptyPiece.getRow(), emptyPiece.getColumn()));
emptyPiece1.setFill(Color.LIGHTGRAY);
emptyPiece1.setStroke(Color.BLACK);
gameField.getChildren().add(emptyPiece1);
}
}
我试图避免将灰色碎片涂在板上:
public void drawEmptyPieces() {
for (Coordinate emptyPiece : emptyPieces) {
for (Piece pieceObjects : pieces){
if (pieceObjects.getCoordinate().getRow() != emptyPiece.getRow() && pieceObjects.getCoordinate().getColumn() != emptyPiece.getRow()){
EmptyPiece emptyPiece1 = new EmptyPiece(emptyPiece);
emptyPiece1.setFill(Color.LIGHTGRAY);
emptyPiece1.setStroke(Color.BLACK);
gameField.getChildren().add(emptyPiece1);
}
}
}
}
但是这段代码不起作用。
答案 0 :(得分:1)
我不知道您提供了足够的信息来回答您的问题。但这里有一些想法。
makeDirections()
要么已损坏(缺少directions
局部变量的声明),要么已损坏,因为它每次向Coordinate
字段添加6个新directions
个对象时调用。在任何一种情况下,它都需要做更多的工作。请考虑一下:
private final static List<Coordinate> directions;
static {
List<Coordinate> dirs = new ArrayList<>();
dirs.add(new Coordinate(1,-1));
dirs.add(new Coordinate(-1,1));
dirs.add(new Coordinate(-1,0));
dirs.add(new Coordinate(1,0));
dirs.add(new Coordinate(0,-1));
dirs.add(new Coordinate(0,1));
directions = Collections.immutableList(dirs);
}
public static List<Coordinate> makeDirections() { // or getDirections()
return directions;
}
getSurroundings()
看起来可以(会?)多次向周围环境添加相同的Coordinate
。如果某篇文章位于[5,5]
,而另一篇文章位于[7,5]
,则会向周围添加[5,5]+[1,0]
和[7,5]+[-1,0]
。在[6,5]
甚至可能会有一个片段,它也会向周围环境添加[5,5]
和[7,5]
。
相反......
确保Coordinate
实现equals
和hashCode
,因此具有相同行和列的两个Coordinate
对象相等,并且都散列为相同的值。然后,在getSurroundings()
中使用:
Set<Coordinate> surroundings = new HashSet<>();
因此surroundings
仅包含每个坐标一次。在返回之前,您可以从周围环境中删除所有“占用”坐标。
for (Piece piece : pieces) {
surroundings.remove(piece.getCoordinate());
}
您可以返回该集而不是列表,或者如果您想将其保留为列表:
return new ArrayList<>(surroundings);
如果没有“环境”包含重复项和现有部分的坐标,您可能会发现更容易绘制您的电路板。
除非您的游戏板在范围内是无限的,否则您将在棋盘边缘之外创建Coordinate
个对象。考虑将方法getNeighbours()
添加到Coordinate
类:
class Coordinate {
public Collection<Coordinate> getNeighbours() {
List<Coordinate> neighbours = new ArrayList<>(6);
for (Coordinate dir: getDirections()) {
Coordinate n = new Coordinate(getRow() + dir.getRow(), getColumn() + dir.getColumn());
if (n.isValid()) {
neighbours.add(n);
}
}
return neighbours;
}
}
然后getSurroundings
变得更简单了,用:
for (Piece boardpieces : boardPiece()) {
surroundings.addAll(boardpieces.getCoordinate().getNeighbours());
}
没有任何“环境”离开董事会。
“方向”不是Coordinate
。它们用于不同的事物。 Coordinate
是棋盘上的位置,其中“方向”是相对偏移量。电路板可能具有行和列值必须介于(例如)0到20之间的约束;您的“方向”对象具有负的行和列值;哪会违反这些限制。这意味着如果给出错误值,则无法在throw new IllegalArgumentException("Invalid coordinate")
的构造函数中添加正确的检查和Coordinate
。
我会为Direction
个对象创建一个新类。实际上,我会使用enum Direction { ... }
。然后Direction.values()
将返回所有方向的集合 - 您不需要自己创建集合。这是一个比其他更大的变化,可能会超出您提供的小代码子集。一个很好的改变,但也许很多工作。
希望有所帮助。