在Java中创建类的2D数组(开发国际象棋)

在Java中创建类的2D数组(开发国际象棋),java,arrays,Java,Arrays,我正在用Java编写一个国际象棋库,重点是它的面向对象设计。我的想法是创建一个名为Tile的类,它包含一个坐标(x,y)、布尔值和它包含的工件信息 看起来是这样的: public abstract class Tile { boolean isOccupied; int x, y; Piece piece; Tile(boolean isOccupied, int x, int y, Piece piece) { this.isOccupie

我正在用Java编写一个国际象棋库,重点是它的面向对象设计。我的想法是创建一个名为Tile的类,它包含一个坐标(x,y)、布尔值和它包含的工件信息

看起来是这样的:

public abstract class Tile {

    boolean isOccupied;
    int x, y;
    Piece piece;

    Tile(boolean isOccupied, int x, int y, Piece piece) {

        this.isOccupied = isOccupied;
        this.x = x;
        this.y = y;
        this.piece = piece;

    }

    //Returns the piece on the tile - will be implemented in the subclass
    public abstract Piece getPiece();

    //Places a piece on the tile - will be implemented in the subclass
    public abstract void placePiece(Piece piece);

    public abstract void removePiece();

}
ArrayList<Piece> pieces = new ArrayList<Piece>();
然后,在我的Piece类中,我尝试创建一个方法来检查工件的目的地是否是有效的位置。函数声明可能类似于:

public abstract boolean isValidLocation(Tile[][] board, int fromX, int fromY, int toX, int toY);
我希望创建一个名为board的类Tile的2D数组,设置开始坐标和结束坐标,并对每个工件子类进行计算,以查看目标位置是否有效

我的问题是:

1) 有没有可能创建这样一个类(平铺)的2D数组,并使其按照我的预期工作

2) 我是否必须在类中的任何位置添加一个生成“nxn”平铺数组的函数


3) 有更简单的方法吗?

回答您的问题:

1) 是的,这是可能的,并且可能会像预期的那样工作

2) 在构造函数中,您可以初始化2D数组,只需为每个x,y填充一个空平铺

3) 一种更简单的方法是只制作一个
片段的2D数组
类。 它将类似于
件[x][y]

然后,您可以将一个位置设置为
工件
,当该位置为
null时,这意味着该位置中没有
工件
,这将是一个有效的移动。

我个人倾向于只使用工件类和板类。我不明白你为什么要引入tile类

棋盘上有一组棋子,如下所示:

public abstract class Tile {

    boolean isOccupied;
    int x, y;
    Piece piece;

    Tile(boolean isOccupied, int x, int y, Piece piece) {

        this.isOccupied = isOccupied;
        this.x = x;
        this.y = y;
        this.piece = piece;

    }

    //Returns the piece on the tile - will be implemented in the subclass
    public abstract Piece getPiece();

    //Places a piece on the tile - will be implemented in the subclass
    public abstract void placePiece(Piece piece);

    public abstract void removePiece();

}
ArrayList<Piece> pieces = new ArrayList<Piece>();
ArrayList片段=新的ArrayList();
在board类中,可以实现render();方法,该方法将迭代两个ArrayList,要求Piece.location、.player(黑/白)、.type(兵、王、塔等)能够渲染棋盘


您要实现的另一件事是board.movePiece(),它将尝试移动工件的位置。首先,它会询问piece.isValidLocation,它将调用piece上的一个方法,其中piece将指示该移动是否有效。然后,由棋盘决定在移动一个棋子后会发生什么(它是否击中了其他棋子?游戏是否达到了check或check mate?),然后通过调用自己的render()方法重新渲染GUI。

您真的需要
平铺
类吗?
Piece
数组不是更好吗,空元素是自由正方形。如果我将来想将其扩展到GUI,我不需要一个Tile或Board类吗?好的,
Board
类将是数组的良好容器,但GUI本身并不需要。一个
JPanel
子类基于数组进行自定义绘制就足够了。将每个图块和图块建模为GUI元素有点粗略,尽管我确信您认为
GridLayout
是棋盘的完美用例(不是)。再次感谢。但是,如果没有瓷砖或木板类,我们难道不能决定木板的形状吗?你没有在问题中包括任何建议与普通木板不同形状的木板的内容。事实上,我建议你在开始做任何奇怪的星际迷航3D国际象棋之前,试着让它与普通棋盘一起工作。先走后跑等等,谢谢。但是,如果我将来想将其扩展到GUI,我不需要一个Tile或Board类吗?还有关于你对问题(2)的回答,如果我在构造函数中初始化2D Tile数组,它会在我初始化Tile对象时自动生成2D Tile数组吗?如果是这样,创建另一个名为Board的类并执行此操作是否会更好?@user6792790一点也不。为了创建象棋游戏的GUI,您所需要的只是:棋子及其坐标。拥有一个2D的棋子阵列可以解决这两个问题。将你自己的棋子移到敌人的棋子上也是一个有效的动作。@Asew那么,我们应该如何决定棋盘的形状呢?国际象棋棋盘不一定必须是8x8正方形。虽然这不是一个坏主意,但我不喜欢这样一个事实,即您必须遍历
棋子的整个
数组列表
,以检查在某个位置是否有一个。双数组
Piece[][]
使它变得更容易。@这是一件你可以争论的事情,这取决于你如何设置应用程序的体系结构。在您的场景中,您假设董事会有责任知道工件的位置。在我的场景中,我承担着维持位置的责任。这样,您可以只要求1个工件重新绘制自身,并在工件中包含所有逻辑,而无需访问board对象。棋子的位置是棋子的属性,而不是棋盘的属性。