我已经从这里阅读了一个链接的教程!这给了我一个基本的棋子布局,但是现在我的棋子跳过了其他棋子,我可以知道如何检查源和目标方格之间是否有一些中间硬币。
1 回答
举个简单的例子,假设你有一个代表棋盘的 8x8 矩阵。虽然您可以存储对象(并获得一个不错的 OO 设计模式,让您的所有部分都 extend ChessPiece
,但我现在假设它们都是int
s )。
public class Board
// this is the actual representation of the board
private int[][] board = new int[8][8];
// define some useful constants
public static final int EMPTY = 0;
public static final int PAWN = 1;
public static final int HORSEY = 2;
// ...
public Board() {
initializeBoard();
}
public int getPiece(int row, int column) {
return board[row][column];
}
private void initializeBoard() {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
board[row][col] = EMPTY;
}
}
}
}
现在我们已经有了棋盘和棋子的基本表示(留给您设置棋子的实际初始配置),我们如何确定可以移动的位置?好吧,现在,坚持简单的蛮力方法。您知道如何遍历整个棋盘以查找棋子的行/列,因此假设您发现骑士位于row=3
,column=5
我将其写为(3,5)
。然后,由于马可以水平移动 1 个方格,垂直移动 2 个方格,或者水平移动 2 个方格,垂直移动 1 个方格,我们看到它可能会移动到以下位置:
- (1,6)
- (1,4)
- (5,6)
- (5,4)
- (2,7)
- (2,3)
- (4,7)
- (4,3)
- 一般来说:(row ± 1, col ± 2), (row ± 2, col ± 1)
因此,现在您已经拥有了用于设置板、查找特定部件的位置以及确定它们可以移动的位置以及在这些空间中的位置的所有组件。
还需要几块,然后你就拥有了一切:
确定障碍物: 假设我试图将皇后从 (1,1) 移动到 (8,8)。您需要确定它所走的路径是通过 (2,2), (3,3), ... 并检查每个方格。这对于每件作品都会有所不同,但遵循相同的一般方法:
- 允许在该路径中移动的部分
- 那条路径穿过哪些方块?
- 那些方块里有碎片吗?
实际移动棋子: 这里您需要更新内部棋盘表示以将前一个方块更改为空,并将新方块更改为有棋子。
捕获棋子: 实现捕获棋子的规则(与移动棋子基本相同),并跟踪已捕获的棋子。
游戏性: 如果你想让它具有可玩性,你需要代表玩家,轮到谁,并生成一个简单的 UI。
边缘案例: 确保不要在算法中跑出棋盘边缘。(ArrayIndexOutOfBoundsException)
由于从头开始制作游戏非常困难,我建议您慢慢开始。实现板表示,并检查一个像 JUnit 这样的测试库,这样你就可以使用测试作为接口,直到你拥有一个。例如,编写测试以确保在给定特定板配置的情况下,一块可以从一个方格移动到另一个方格,然后实现该功能,并在测试通过时对您的代码执行您认为应该执行的操作有很高的信心。