我正在做一个非常简单的国际象棋程序,它只是动作,没有得分或任何东西。我正在制作骑士运动,我已经完成了一部分,但我被困在如何避免骑士离开棋盘。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;
}任何帮助都将不胜感激!
发布于 2017-01-13 06:27:21
这实际上是几年前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发布于 2017-01-25 23:54:39
我在国际象棋引擎中使用的技术是在启动时预先生成所有骑士的走法,这样我只需要知道骑士在哪个方块上,我就可以通过一个数组查找生成所有可能的骑士走法,例如:
// 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_MOVES4*8+3,位模式给了我从那个方块开始的所有走法。如果你正在写一个国际象棋引擎,这是你想要的最快的方式。
https://stackoverflow.com/questions/41623929
复制相似问题