国际象棋(骑士)运动,避免离开董事会

时间:2017-01-12 22:12:22

标签: java multidimensional-array chess

我正在制作一个非常简单的国际象棋程序,它只是动作,没有分数或任何东西。我正在制作骑士运动,我部分完成了,但我仍然坚持如何避免骑士离开董事会。 r = row,c = column,v = board(8x8)

我的代码:

tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "CustomTableViewCell")

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

这实际上是几年前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) ...

其中......是您为合法行动所做的事情。如果&#34; v&#34;是你的董事会,你从(x,y)开始这些可能是

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

答案 1 :(得分:0)

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

// 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],并且位模式给我从那个方块的所有移动。如果您正在编写国际象棋引擎,这是您想要的最快方式。