簡體   English   中英

國際象棋(騎士)運動,避免下板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM