国际象棋(骑士)运动,避免下船



我正在制作一个非常简单的国际象棋程序,它只是动作,没有分数或任何东西。我正在制作骑士运动,我已经完成了部分工作,但我坚持如何避免骑士离开棋盘。R = 行,C = 列,V = 电路板 (8x8)

我的代码:

public static boolean[][] knightMoves(int r, int c, boolean[][] v){
    if(r <= 7 && c >= 0) v[r+2][c-1] = true;
    if(r <= 7 && c >= 0) v[r+1][c-2] = true;
    if(r <= 7 && c >= 0) v[r+2][c+1] = true;
    if(r <= 7 && c >= 0) v[r+1][c+2] = true;
    if(r <= 7 && c >= 0) v[r-2][c-1] = true;
    if(r <= 7 && c >= 0) v[r-1][c-2] = true;
    if(r <= 7 && c >= 0) v[r-2][c+1] = true;
    if(r <= 7 && c >= 0) v[r-1][c+2] = true;
    return v;
}

任何帮助将不胜感激!

这实际上是几年前ACM编程竞赛中问题的一部分。 所以最少的代码行数是这样的:

boolean check(int r, int c) {
    return r<8 && r>= 0 && c < 8 && c>=0;
}

然后,您可以检查从 (x,y) 开始的每个潜在移动,以查看它是否有效:

if check(x+1, y+2) ...
if check(x+2, y+1) ...
if check(x-1, y+2) ...
if (check(x-2, y+1) ...
if check(x+1, y-2) ...
if check(x+2, y-1) ...
if check(x+1, y+2) ...
if (check(x+2, y+1) ...

哪里。。。是你为合法搬家所做的。 如果"V"是你的板子,你从(x,y)开始,这些可能是

if (check(x+1, y+1))
   v(x+1, y+1) = true;  // indicated knight can move there

我在国际象棋引擎中使用的技术是在启动时预先生成所有骑士的移动,这样我只需要知道骑士在哪个方格上,我可以通过单个数组查找生成所有可能的骑士移动,例如:

// Pre-generated knight moves
public static final long[] KNIGHT_MOVES = new long[] {
    0b00000000_00000000_00000000_00000000_00000000_00000010_00000100_00000000L,
    0b00000000_00000000_00000000_00000000_00000000_00000101_00001000_00000000L,
    0b00000000_00000000_00000000_00000000_00000000_00001010_00010001_00000000L,
    // ... etc.

所以,如果我的骑士在 e4 上,我只需要 KNIGHT_MOVES[4*8+3],位模式给了我从那个方块开始的所有动作。这是最快的方法,如果你正在编写一个国际象棋引擎,这就是你想要的。

最新更新