为国际象棋游戏创建一个板块演示文稿。

4

我正在制作一个8 x 8的棋盘,用于国际象棋游戏任务。然而,我想知道是否有任何提示可以创建这个方块,而不是在Java中使用2D数组。

任务的限制之一是禁止使用2D数组或类似的东西。没有人工智能,只有用户控制。


1
如果不太相似的话,您可以使用一维数组。 - Thilo
5个回答

9
您可以使用一维数组,比如Figure [] board = new Figure[64],并编写一个简单的getter/setter方法来模拟二维数组:
Figure get(int hor, int vert) {
  return board[hor*8+ver];
}

void set(int hor, int vert, Figure f) {
  board[hor*8+ver] = f;
}

3
你可以使用一维数组或者 ArrayList,然后将其除以 8,使用商和余数来确定所在的列和行。
然后,反向操作可以得到对应棋盘区域在数组中的位置。

2

我对Java没有实际的工作经验,我会下棋并编写一些Delphi程序。我不知道Java的位操作能力。

但是,我建议您研究一下Bitboard数据结构,并在网络上搜索基于它的开源国际象棋引擎。

这在C++世界很常见。


2
你也可以使用Map:
private Map<String, Figure> board = new HashMap<String, Figure>();

private String positionToString(int hor, int vert) {
    return hor + " " + vert;
}

public Figure get(int hor, int vert) {
    return board.get(positionToString(hor, vert));
}

public void set(int hor, int vert, Figure fig) {
    board.put(positionToString(hor, vert), fig);
}

不知道问题的具体情况,但是如果我们要计算棋盘树中所有可能的位置(也许是解决棋类问题或编写人工智能),我可以保证你的代码至少比朴素的二维数组棋盘表示法慢三倍。 - korifey
@sehe Java 没有 std::pair。 - Mikita Belahlazau
如果我们使用变量(或常量)而不是“8”,则轻松切换到任何维度。 - korifey
@korifey,是的,如果我们需要真正高性能,那么我的实现就不是很好了。 - Mikita Belahlazau
@korifey 但是如果我们使用常量,你需要在某个地方指定变量或者甚至更改代码并重新编译。因此它有一些优点。 - Mikita Belahlazau
显示剩余3条评论

1

也许你甚至可以不用一开始就创建一个正方形?

另一种表示棋盘的方法是仅使用棋子及其相应坐标的列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接