我必须设计一个国际象棋游戏,以便除了马没有其他部分应该跳过其他部分我需要一个算法来做它

时间:2011-07-19 08:40:33

标签: java chess

我已经从这里阅读了一个教程a link!这给了我一个基本的棋子布局但现在我的棋子跳过其他棋子我可以知道如何检查在源和目的地广场之间是否有一些中间硬币。

1 个答案:

答案 0 :(得分:7)

举个简单的例子,假设你有一个代表国际象棋棋盘的8x8矩阵。虽然你可以存储对象(并获得一个漂亮的OO设计模式,让你的所有部分扩展ChessPiece,但我现在假设它们都是int个。{/ p>

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=3column=5,我会写为(3,5) 。然后,因为一个骑士可以水平移动1个方格,垂直移动2个,或者水平移动2个,垂直移动1个,我们看到它可能会移动到以下位置:

  • (1,6)
  • (1,4)
  • (5,6)
  • (5,4)
  • (2,7)
  • (2,3)
  • (4,7)
  • (4,3)
  • 一般情况下:(行±1,列±2),(行±2,列±1)

现在,您拥有了设置电路板的所有组件,查找特定部件的位置,并确定它们可以移动的位置以及这些空间的位置。

需要更多的部分,然后你拥有一切:

  • 确定方式: 假设我试图将女王从(1,1)移动到(8,8)。您需要确定它将采用的路径是通过(2,2),(3,3),...并检查每个方块。每件作品都会有所不同,但遵循相同的一般方法:

    1. 是允许在该路径中移动的作品
    2. 那条小路穿过什么方块?
    3. 那些方格中有任何碎片吗?
  • 实际上移动部分: 在这里,您需要更新内部电路板表示,将之前的方块更改为空,将新方块更改为该片段。

  • 捕捉作品 实现捕获一块的规则(基本上与移动一块相同),并跟踪捕获的碎片。

  • <强>游戏的玩法: 如果你想让它可玩,你需要代表玩家,轮到它,并生成一个简单的用户界面。

  • 边缘情况: 确保不要在算法中运行板的边缘。 (ArrayIndexOutOfBoundsException异常)

由于从头开始制作游戏非常困难,我建议你慢慢开始。实现板表示,并检查一个像JUnit这样的测试库,这样你就可以使用测试作为接口,直到你有了。例如,编写测试以确保一块可以在给定特定板配置的情况下从一个方块移动到另一个方块,然后实现该功能,并且当测试通过您的代码执行您认为应该的操作时具有高可信度。