[英]Chess (Knight) Movement, Avoid Going Off Board
我正在制作一個非常簡單的國際象棋程序,它只是動作,沒有分數。 我正在做騎士運動,而我已經完成了一部分,但是我在如何避免騎士脫離局面方面陷入了困境。 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],位模式就可以為我提供該方塊的所有移動。 如果要編寫國際象棋引擎,這是最快的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.